我需要制作一个数据控制设备,其任务是对一些GPIO进行采样并记录GPIO状态并通过UART将其发送到PC以显示在PC中。我选择的算法是(请在校对,因为我是非常新手),创建一个运行在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;
}
任务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
}
}
计时器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);
}
}
当我在ISR处理程序中放置断点时,它就会出现但GPIO没有切换(我放在任务1中)
我是RTOS的新手所以请原谅我,如果我错过了代码中的任何基本内容
我只需要从ISR处理程序中提供一个信号量
经过一些训练后,我发现调用xSemaphoreGiveFromISR时会发生所有问题。控件转到vAssertCalled函数并保持无限循环
xSemaphoreTake()始终返回pdFALSE
答案 0 :(得分:3)
中断的优先级必须设置为低于configMAX_SYSCALL_INTERRUPT_PRIORITY
要获得更清晰的想法,请参阅 SourceForge Forum