Linux下Raspberry Pi上的计时器中断

Gor*_*ams 3 timer interrupt irq raspberry-pi

是否可以在Raspberry Pi上设置硬件计时器外设并在特定时间(在Linux下运行)获得中断?有图书馆/例子吗?

我知道当引脚通过connectionPi(当以管理员权限运行时)发生引脚更改时,您会得到一个irq,因此,如果有一个免费的定时器外设,这似乎是可能的。

Pi论坛上的此帖子暗示有一个免费的STC注册,并且注册提供了一些信息,但被标记为“ BareMetal”,我认为这意味着不涉及Linux?

背景:我知道这根本不是Linux的优势,但是我有兴趣向Espruino JS解释器添加硬件计时器功能。它最初是为微控制器设计的,包含一些希望通过计时器IRQ运行的代码(例如,用于软件PWM,定时脉冲以及其他位和鲍勃)-如果在线程中运行,则该部分实际上是无用的。

JSU*_*JSU 5

如果我理解了您的问题,则可以通过alarm()和signal()间接访问计时器。

这是一个非常简单的Raspberry Pi的Hello World程序,它使用connectioningPi切换了引脚40和引脚38。从警报中断信号在主循环和引脚38中切换了引脚40。

编译为:gcc -Wall -o helloworld helloworld.c -lwiringPi

Ctrl + c退出。

我希望这有帮助,

州立大学

helloworld.c

#include <wiringPi.h>
#include <stdlib.h>

#include <signal.h>
#include <unistd.h>

void alarmWakeup(int sig_num);


int main(int argc, char *argv[])
{
    unsigned int j;

    wiringPiSetupPhys();//use the physical pin numbers on the P1 connector


    pinMode(40, OUTPUT);
    pinMode(38, OUTPUT);

    signal(SIGALRM, alarmWakeup);   
    ualarm(5000, 5000);


    while(1)
    {
        digitalWrite(40, HIGH); //pin 40 high
        for(j=0; j<1000000; j++);//do something
        digitalWrite(40, LOW);  //pin 40 low
        for(j=0; j<1000000; j++);//do something
    }

    return 0;

}//int main(int argc, char *argv[])


void alarmWakeup(int sig_num)
{
    unsigned int i;

    if(sig_num == SIGALRM)
    {
        digitalWrite(38, HIGH); //pin 38 high
        for(i=0; i<65535; i++); //do something
        digitalWrite(38, LOW);  //pin 38 low
    }

}
Run Code Online (Sandbox Code Playgroud)

  • 在示波器(力科Ace 234)上测量,引脚38的周期正好为5 ms。频率计数器(HP 5381A)将频率测量为201.5 Hz。由于ualarm()时序是从主处理器时钟得出的,因此您希望它非常准确。 (2认同)