为什么在打开主程序后,WiringPiISR不会阻塞主程序?

时间:2019-08-01 19:22:51

标签: c raspberry-pi embedded wiringpi

我正在开发一个用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;
}

我希望这个最小的程序在中断被触发后再也不会恢复,但就我而言,它会不断增加变量检查并在屏幕上打印出来(两个线程同时工作)。

3 个答案:

答案 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 ;
}

因此,您的处理程序将作为单独的线程运行,并且您的行为是正常的。