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