各位工程师好:
目前基于STM32F411RE(NUCLEO)移植了freeRTOS,并逐步学习中。在进行到“利用二值信号量对任务和中断进行同步”实验验证时,遇到了问题。请大神们帮忙分析一下问题所在。
1、任务“vHandlerTask”处于阻塞态,等待有效的信号量;
2、期望实现按键按下中断,xSemaphoreGiveFromISR()给出信号量;
3、"vHandlerTask"运行,打印语句。
目前程序运行后,先执行了“vHandlerTask”,如果按键中断触发,会执行中断内的打印,但貌似没有给出信号量,“vHandlerTask”任务也不会继续执行,然后程序就卡死不动了。
PS:不实用操作系统,按键中断正常。
中断给出信号量代码:
- void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
- {
- static portBASE_TYPE xHigherPriorityTaskWoken;
- xHigherPriorityTaskWoken = pdFALSE;
- if(GPIO_Pin == GPIO_PIN_13)
- {
-
- printf("Generate a IRQ\n\r");
- xSemaphoreGiveFromISR( BinarySemaphore_a, &xHigherPriorityTaskWoken );
- if( xHigherPriorityTaskWoken == pdTRUE )
- {
- //portSWITCH_CONTEXT();
- printf("need --portSWITCH_CONTEXT--\n\r");
- portEND_SWITCHING_ISR( xHigherPriorityTaskWoken );
- }
- }
- }
任务“vHandlerTask”
- static void vHandlerTask(void *pvParameters)
- {
- for(;;)
- {
- if(xSemaphoreTake(BinarySemaphore_a, portMAX_DELAY)==pdPASS)
- {
- printf("Handler task - Processing event.\n\r");
- HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
- }
- }
- }
main函数代码
- int main(void)
- {
- HAL_Init();
- SystemClock_Config();
- gpio_config();
- uartconfig();
- vSemaphoreCreateBinary( BinarySemaphore_a );
-
- if(BinarySemaphore_a != NULL)
- {
- xTaskCreate(vHandlerTask,"HandlerTask",configMINIMAL_STACK_SIZE+50,NULL,3,NULL );
- vTaskStartScheduler();
- }
- while (1)
- {
-
- }
- }
附上整个工程:
9利用二值信号量对任务和中断进行同步.zip
(266.5 KB, 下载次数: 5)
请大神们帮忙分析一下问题所在。
|