Linux下的Raspberry Pi上的定时器中断

时间:2015-09-23 08:47:18

标签: timer raspberry-pi interrupt irq

是否可以在Raspberry Pi上设置硬件定时器外设并在某个时间获得中断(在Linux下运行时)?有库/示例吗?

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

Pi论坛上的

this post暗示有一个免费的STC寄存器,而this one提供了一些信息,但标记为'BareMetal',我认为这意味着Linux不参与?

背景:我知道这不是Linux擅长的,但是我有兴趣为Espruino JS解释器添加硬件定时器功能。它最初用于微控制器并包含一些期望通过定时器IRQ运行的代码(例如,用于软件PWM,定时脉冲和其他位和bob) - 如果在线程中运行,那部分代码将无效。 / p>

1 个答案:

答案 0 :(得分:3)

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

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

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

控制+ c退出。

我希望这有帮助,

JSU

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
    }

}