4

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

我知道当通过wiringPi(以管理员权限运行时)更改引脚时,您可以获得中断,所以如果有一个免费的计时器外围设备,它似乎是可能的。

Pi 论坛上的这个帖子暗示有一个免费的 STC 寄存器,这个提供了一些信息,但被标记为“BareMetal”,我认为这意味着 Linux 不参与?

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

4

1 回答 1

6

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

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

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

Control+c 退出。

我希望这有帮助,

江苏大学

你好世界.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
    }

}
于 2016-12-15T09:44:06.303 回答