是否可以在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>
答案 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
}
}