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)多个任务优先级不同时,优先级最高的任务会优先进入就绪态。
阻塞时间超出的任务会立刻返回,程序会向下继续执行。

浙公网安备 33010602011771号