Linux 下 Raspberry Pi 的定时器中断

Timer interrupt on Raspberry Pi under Linux

是否可以在 Raspberry Pi 上设置硬件定时器外围设备并在特定时间获得中断(而 运行 在 Linux 下)?有没有library/example?

我知道你可以 get an irq when a pin changes 通过 wiringPi(当 运行 管理员权限时),所以如果有一个免费的定时器外围设备似乎是可能的。

this post on the Pi forums implies that there is a free STC register, and this one 提供了一些信息但被标记为 'BareMetal',我认为这意味着 Linux 不涉及?

背景:我知道这不是 Linux 擅长的,但是我有兴趣向 Espruino JS 解释器添加硬件定时器功能。它最初是为微控制器设计的,包含一些期望通过定时器 IRQ 运行 的代码(例如,对于软件 PWM、定时脉冲和其他位和 bob)——如果 运行在一个线程中。

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

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

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

Control+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
    }

}