我正在开发一个用C语言在树莓板上运行的程序。在程序中,我想使用WiringPiISR处理引脚触发的中断。但是,我发现而不是阻塞主例程,而是用connectionPiISR创建并发线程。我想念什么吗?
最小代码示例:
#include <WiringPi.h>
#include <unistd.h>
int Check=0;
void Isr()
{
while (1)
{
sleep(1);
Check++;
}
}
int main()
{
wiringPiSetup () ;
pinMode(7, INPUT) ;
wiringPiISR (7, INT_EDGE_BOTH ,&Isr);
while (1)
{
sleep(2);
printf("check : %d", Check );
}
return 0;
}
我希望这个最小的程序在中断被触发后再也不会恢复,但就我而言,它会不断增加变量检查并在屏幕上打印出来(两个线程同时工作)。
答案 0 :(得分:0)
ISR 代表中断服务程序 aka中断处理程序。
您的代码设置了一个中断处理程序。如果触发了中断,则常规代码(在您的情况下为main()
)将被中断并执行中断处理程序。它不是第二个线程,但是结果是相似的。
中断处理程序应该只做最少的工作,并迅速将控制权返回给被中断的程序。不允许在中断处理程序中使用sleep()
并导致未定义的行为。
答案 1 :(得分:0)
假设您已经进行了无限循环并有意调用sleep()
:
sleep()
可能允许在线程之间进行切换。
答案 2 :(得分:0)
我发现的documentation非常具体(强调我的意思):
int routingPiISR(int pin,int edgeType,void(* function)(void));
此功能以高优先级运行(如果程序是使用sudo或以root身份运行的),并且与主程序同时执行。它具有对所有全局变量,打开文件句柄等的完全访问权限。
sources毫无保留。它只是创建了一个新线程:
pthread_create (&threadId, NULL, interruptHandler, &pin) ;
等待中断并执行您的处理程序:
static void *interruptHandler (void *arg)
{
int pin = *(int *)arg ;
(void)piHiPri (55) ;
for (;;)
{
if (waitForInterrupt (pin, -1) > 0)
isrFunctions [pin] () ;
}
return NULL ;
}
因此,您的处理程序将作为单独的线程运行,并且您的行为是正常的。