FreeRTOS--二元信号量--任务与中断的同步

Posted mickey-double

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FreeRTOS--二元信号量--任务与中断的同步相关的知识,希望对你有一定的参考价值。

一般二元信号量用于任务同步,利用二元信号量对任务与中断同步,中断服务例程中只是释放信号量,相当于把中断应该处理的事情放到了任务里进行处理,如果某个中断处理任务特别紧急,则相应的任务优先级可以设置为最高,以保证此任务随时抢占系统中的其他任务。

技术图片

 

 

使用一个定时器TIM6,每隔3中断一次秒释放一个信号量,TASK2设置优先级最高,等待信号量而被阻塞,TASK1每间隔一秒打印信息。

 1  /* Create the thread(s) */
 2   /* definition and creation of vTask1 */
 3   osThreadDef(vTask1, Task1, osPriorityNormal, 0, 128);
 4   vTask1Handle = osThreadCreate(osThread(vTask1), NULL);
 5 
 6   /* definition and creation of vTask2 */
 7   osThreadDef(vTask2, Task2, osPriorityAboveNormal, 0, 128);
 8   vTask2Handle = osThreadCreate(osThread(vTask2), NULL);
 9 
10 /* Task1 function */
11 void Task1(void const * argument)
12 
13 
14   /* USER CODE BEGIN Task1 */
15   /* Infinite loop */
16   for(;;)
17   
18       printf("Task1 is running,will be in the ready state!\\r\\n");
19       osDelay(1000);
20   
21   /* USER CODE END Task1 */
22 
23 
24 /* Task2 function */
25 void Task2(void const * argument)
26 
27   /* USER CODE BEGIN Task2 */
28   /* Infinite loop */
29   for(;;)
30   
31       if(osOK == osSemaphoreWait(myBinarySemHandle,osWaitForever))
32           printf("Task2 is running!\\r\\n");
33   
34   /* USER CODE END Task2 */
35 
36 
37 
38 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
39 
40   /* USER CODE BEGIN Callback 0 */
41 
42   /* USER CODE END Callback 0 */
43   if (htim->Instance == TIM1) 
44     HAL_IncTick();
45   
46   /* USER CODE BEGIN Callback 1 */
47   if (htim->Instance == TIM6)
48   
49       g_msCount++;
50       if(3000 == g_msCount)
51       
52           g_msCount = 0;
53           osSemaphoreRelease(myBinarySemHandle);
54       
55   
56   /* USER CODE END Callback 1 */

在freeRTOS标准API中释放信号量要分为xSemaphoreGiveFromISR和xSemaphoreGive,前者用于中断ISR。在STM32CUbe封装的osSemaphoreRelease内部已经区分了两者,所以只需要调用osSemaphoreRelease即可

 1 osStatus osSemaphoreRelease (osSemaphoreId semaphore_id)
 2 
 3   osStatus result = osOK;
 4   portBASE_TYPE taskWoken = pdFALSE;
 5   
 6   
 7   if (inHandlerMode()) 
 8     if (xSemaphoreGiveFromISR(semaphore_id, &taskWoken) != pdTRUE) 
 9       return osErrorOS;
10     
11     portEND_SWITCHING_ISR(taskWoken);
12   
13   else 
14     if (xSemaphoreGive(semaphore_id) != pdTRUE) 
15       result = osErrorOS;
16     
17   
18   
19   return result;
20 

 

测试结果如下图所示:

技术图片

 

以上是关于FreeRTOS--二元信号量--任务与中断的同步的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp FreeRTOS的基于信号量和委托的任务数据共享与同步

基于STM32和FreeRTOS的二值信号量实现任务同步

基于STM32和FreeRTOS的二值信号量实现任务同步

基于STM32和FreeRTOS的二值信号量实现任务同步

Freertos-事件标志组,消息队列,信号量,二值信号量,互斥信号量

CubeMX使用FreeRTOS编程指南