来自 ISR 的 FreeRTOS Sempahore 不起作用

Abl*_*ose 4 rtos freertos

我需要制作一个数据控制设备,其任务是对一些 GPIO 进行采样并记录 GPIO 状态,然后通过 UART 将其发送到 PC 以在 PC 中显示。我选择的算法是(请纠正我,因为我是 RTOS 的新手)创建一个以 1us 运行的计时器,然后轮询所需的所有 GPIO 的状态。为此,我在 freertos 演示中使用了一个计时器。并在定时器 ISR 中给出一个信号量,它应该调用一个任务来完成所有剩余的工作。

不知道为什么,但我编辑的代码不起作用

我的主要()是

int main(void) {
  /* Prepare the hardware to run this demo. */
  prvSetupHardware();

  vSemaphoreCreateBinary(SemaphoreTask);
  if( SemaphoreTask != NULL )
  {
    xTaskCreate( SemaphoreTakeTask, "SemaphoreTakeTask", 240, NULL , 3, NULL );
    vTaskStartScheduler();
  }
  for(;;);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

任务 1一个我写的虚拟函数只是为了测试信号量是否正常工作

void SemaphoreTakeTask(void* parameter){
  vSetupTimerTest(10);                 // Timer initialization function in FreeRtos DEMO
  TRISEbits.TRISE6 = 0;                // Set the GPIO as Output
  xSemaphoreTake( SemaphoreTask, 0 );  // As mentioned in user guide just take the semaphore once to clear the semaphore at start
  for(;;){
    xSemaphoreTake( SemaphoreTask, portMAX_DELAY );
    LATEbits.LATE6 ^= 1;               // Toggle an IO to see whether its working
  }
}
Run Code Online (Sandbox Code Playgroud)

定时器 ISR 处理程序

void vT2InterruptHandler(void) {
  portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
  /* Clear the timer interrupt. */
  IFS0CLR = _IFS0_T2IF_MASK;
  xSemaphoreGiveFromISR(SemaphoreTask, &xHigherPriorityTaskWoken);
  if (xHigherPriorityTaskWoken != pdFALSE) {
    portEND_SWITCHING_ISR(xHigherPriorityTaskWoken);
  }
}
Run Code Online (Sandbox Code Playgroud)

当我在 ISR 处理程序中放置断点时,它会出现,但 GPIO 没有切换(我放置在任务 1 中)

我是 RTOS 的新手,如果我错过了代码中的任何基本内容,请原谅我

我只需要从 ISR 处理程序中提供一个信号量

经过一些锻炼后,我发现所有问题都发生在调用 xSemaphoreGiveFromISR 时。控件转到 vAssertCalled 函数并保持无限循环

xSemaphoreTake() 总是返回 pdFALSE

Abl*_*ose 5

中断的优先级必须设置为低于 configMAX_SYSCALL_INTERRUPT_PRIORITY

要获得更清晰的想法,请参阅 SourceForge 论坛