各位工程师好:
目前基于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)
请大神们帮忙分析一下问题所在。
|