FreeRTOS备忘

1.FreeRTOS调度策略

  任务调度策略在FreeRTOSConfig.h文件中设置

  是否可抢占 configUSE_PREEMPTION:可抢占式调度时,高优先级任务就绪了就马上执行;

  时间片轮转 configUSE_TIME_SLICING:时间片轮转调度时,同优先级任务按照时间片长短轮流执行;

  空闲任务让步 configIDLE_SHOULD_YIELD:空闲任务让步式调度时,空闲任务中的循环每执行一次就看看是否要让步给用户任务,未必执行满一个时间片再让出CPU使用权。

2.创建任务时如何确定堆栈大小

  调用task.h中函数 uxTaskGetStackHighWaterMark 来确定栈大小。

  此函数参数( TaskHandle_t xTask )为被检查的任务的句柄,或者NULL则表示检查调用函数本身的任务的堆栈大小。

  此函数返回值为该任务运行时所剩余的最小堆栈大小,该函数返回值长度单位为字(32位CPU的1字 = 4字节)。

  在FreeRTOSConfig.h中定义 #define INCLUDE_uxTaskGetStackHighWaterMark 1 后可使用。

  创建任务时可根据任务运行时所需的最大堆栈再预留出20%-30%的空间来设置任务堆栈大小。

 1 #if ( INCLUDE_uxTaskGetStackHighWaterMark == 1 )
 2 
 3     UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask )
 4     {
 5         TCB_t * pxTCB;
 6         uint8_t * pucEndOfStack;
 7         UBaseType_t uxReturn;
 8 
 9         pxTCB = prvGetTCBFromHandle( xTask );
10 
11         #if portSTACK_GROWTH < 0
12             {
13                 pucEndOfStack = ( uint8_t * ) pxTCB->pxStack;
14             }
15         #else
16             {
17                 pucEndOfStack = ( uint8_t * ) pxTCB->pxEndOfStack;
18             }
19         #endif
20 
21         uxReturn = ( UBaseType_t ) prvTaskCheckFreeStackSpace( pucEndOfStack );
22 
23         return uxReturn;
24     }
25 
26 #endif /* INCLUDE_uxTaskGetStackHighWaterMark */

  xPortGetFreeHeapSize()实时获取剩余堆空间(需使用heap_1/2/4/5方案)‌

  xPortGetMinimumEverFreeHeapSize()监控历史最小剩余堆空间(仅heap_4/5有效)‌

3.消息队列阻塞问题

  写队列函数 xQueueSend( xQueue, pvItemToQueue, xTicksToWait )

  多个任务在同时读写一个消息队列或队列空/满时,这些任务都会进入阻塞状态,那个任务会优先进入就绪态呢?

  (1)多个任务优先级相同时,阻塞时间最长的任务优先进入就绪态。

  (2)多个任务优先级不同时,优先级最高的任务会优先进入就绪态。

   阻塞时间超出的任务会立刻返回,程序会向下继续执行。

posted @ 2025-02-09 11:04  _燃灯续昼  阅读(72)  评论(0)    收藏  举报