FreeRTOS實(shí)時(shí)操作系統(tǒng)的多優(yōu)先級(jí)實(shí)現(xiàn)
如何實(shí)現(xiàn)任務(wù)多優(yōu)先級(jí)
FreeRTOS中,數(shù)字優(yōu)先級(jí)越小,邏輯優(yōu)先級(jí)也越小,空閑任務(wù)優(yōu)先級(jí)為0.
List_t pxReadyTasksLists[configMAX_PRIORITIES]是數(shù)組,數(shù)組下標(biāo)代表任務(wù)優(yōu)先級(jí),任務(wù)創(chuàng)建是根據(jù)設(shè)置的任務(wù)優(yōu)先級(jí)插入到對(duì)應(yīng)下標(biāo)的列表根節(jié)點(diǎn)上,如下。

要支持多優(yōu)先級(jí),就是再任務(wù)切換時(shí)讓pxCurrentTCB指向最高優(yōu)先級(jí)的TCB即可,之前時(shí)手動(dòng)再任務(wù)1、任務(wù)2來(lái)回切換,現(xiàn)在問題就是怎么找到優(yōu)先級(jí)最高的就緒任務(wù)TCB。有2套方法,軟件通用方法和硬件指令方法
軟件通用方法和硬件指令方法
通過configUSE_PORT_OPTIMISED_TASK_SELECTION指定使用軟件通用方法還是硬件指令方法,代碼再task.c中
#if ( configUSE_PORT_OPTIMISED_TASK_SELECTION == 0 )//使用通用方法
/* uxTopReadyPriority 是全局變量,保存著最高優(yōu)先級(jí) */
#define taskRECORD_READY_PRIORITY( uxPriority ) \
{ \
if( ( uxPriority ) > uxTopReadyPriority ) \
{ \
uxTopReadyPriority = ( uxPriority ); \
} \
} /* taskRECORD_READY_PRIORITY */
/*-----------------------------------------------------------*/
#define taskSELECT_HIGHEST_PRIORITY_TASK() \
{ \
/* 從高到底依次尋找非空的列表根節(jié)點(diǎn)下標(biāo) */ \
while( listLIST_IS_EMPTY( &( pxReadyTasksLists[ uxTopReadyPriority ] ) ) ) \
{ \
configASSERT( uxTopReadyPriority ); \
--uxTopReadyPriority; \
} \
\
/* 更新pxCurrentTCB 和*/ \
listGET_OWNER_OF_NEXT_ENTRY( pxCurrentTCB, &( pxReadyTasksLists[ uxTopReadyPriority ] ) ); \
} /* taskSELECT_HIGHEST_PRIORITY_TASK */
/*-----------------------------------------------------------*/
/* 對(duì)于軟件方式這里做空*/
#define taskRESET_READY_PRIORITY( uxPriority )
#define portRESET_READY_PRIORITY( uxPriority, uxTopReadyPriority )
#else /* configUSE_PORT_OPTIMISED_TASK_SELECTION */
/* 硬件指令方式 */
/* 根據(jù)uxPriority來(lái)更新uxTopReadyPriority,記錄下最高優(yōu)先級(jí)*/
#define taskRECORD_READY_PRIORITY( uxPriority ) portRECORD_READY_PRIORITY( uxPriority, uxTopReadyPriority )
/*-----------------------------------------------------------*/
#define taskSELECT_HIGHEST_PRIORITY_TASK() \
{ \
UBaseType_t uxTopPriority; \
\
/* 尋找優(yōu)先級(jí)最高的任務(wù)TCB來(lái)更新pxCurrentTCB */ \
portGET_HIGHEST_PRIORITY( uxTopPriority, uxTopReadyPriority ); \
configASSERT( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ uxTopPriority ] ) ) > 0 ); \
listGET_OWNER_OF_NEXT_ENTRY( pxCurrentTCB, &( pxReadyTasksLists[ uxTopPriority ] ) ); \
} /* taskSELECT_HIGHEST_PRIORITY_TASK() */
/*-----------------------------------------------------------*/
/* 清除uxTopReadyPriority的uxPriority 位. */
#define taskRESET_READY_PRIORITY( uxPriority ) \
{ \
if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ ( uxPriority ) ] ) ) == ( UBaseType_t ) 0 ) \
{ \
portRESET_READY_PRIORITY( ( uxPriority ), ( uxTopReadyPriority ) ); \
} \
}
#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */
下面看著幾個(gè)port接口
#define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) \
( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) )
#define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) \
( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) )
可以看到硬件方式是把uxTopReadyPriority 看作一個(gè)位圖,每位代表一個(gè)優(yōu)先級(jí),一共32bit,任務(wù)就緒是就把對(duì)應(yīng)位置1,反之清0.

所以獲得最高就緒優(yōu)先級(jí)的硬件方法如下(利用clz指令,計(jì)算一個(gè)變量從高位開始第一次出現(xiàn)1的位前面0的個(gè)數(shù),上圖clz(uxReadyPriorities)=6)
#define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities)\
uxTopPriority = ( 31 - __clz( ( uxReadyPriorities ) ) )以上就是FreeRTOS實(shí)時(shí)操作系統(tǒng)的多優(yōu)先級(jí)實(shí)現(xiàn)的詳細(xì)內(nèi)容,更多關(guān)于FreeRTOS多優(yōu)先級(jí)實(shí)現(xiàn)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- 使用FreeRTOS遇到死等異常的解決
- FreeRTOS動(dòng)態(tài)內(nèi)存分配管理heap_5示例
- FreeRTOS動(dòng)態(tài)內(nèi)存分配管理heap_4示例
- FreeRTOS動(dòng)態(tài)內(nèi)存分配管理heap_2示例
- FreeRTOS實(shí)時(shí)操作系統(tǒng)空閑任務(wù)的阻塞延時(shí)實(shí)現(xiàn)
- FreeRTOS實(shí)時(shí)操作系統(tǒng)的任務(wù)創(chuàng)建與任務(wù)切換
- FreeRTOS實(shí)時(shí)操作系統(tǒng)的列表與列表項(xiàng)操作示例
- FreeRTOS軟件定時(shí)器apollo中斷狀態(tài)判斷
相關(guān)文章
FreeRTOS實(shí)時(shí)操作系統(tǒng)的多優(yōu)先級(jí)實(shí)現(xiàn)
這篇文章主要為大家介紹了FreeRTOS實(shí)時(shí)操作系統(tǒng)的多優(yōu)先級(jí)實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04
FreeRTOS進(jìn)階信號(hào)量示例的完全解析
這篇文章主要為大家介紹了FreeRTOS進(jìn)階信號(hào)量示例操作的完全解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04
FreeRTOS進(jìn)階之調(diào)度器啟動(dòng)過程分析
這篇文章主要為大家介紹了FreeRTOS進(jìn)階之調(diào)度器啟動(dòng)過程分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04
FreeRTOS實(shí)時(shí)操作系統(tǒng)臨界段保護(hù)場(chǎng)合示例
這篇文章主要為大家介紹了FreeRTOS實(shí)時(shí)操作系統(tǒng)臨界段保護(hù)場(chǎng)合示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04
FreeRTOS實(shí)時(shí)操作系統(tǒng)Cortex-M內(nèi)核使用注意事項(xiàng)
這篇文章主要為大家介紹了FreeRTOS實(shí)時(shí)操作系統(tǒng)Cortex-M內(nèi)核使用注意事項(xiàng),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04
FreeRTOS實(shí)時(shí)操作系統(tǒng)結(jié)構(gòu)示例
這篇文章主要介紹了FreeRTOS實(shí)時(shí)操作系統(tǒng)結(jié)構(gòu)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04
FreeRTOS實(shí)時(shí)操作系統(tǒng)的任務(wù)應(yīng)用函數(shù)詳解
這篇文章主要為大家介紹了FreeRTOS實(shí)時(shí)操作系統(tǒng)的任務(wù)應(yīng)用函數(shù)的解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04
FreeRTOS實(shí)時(shí)操作系統(tǒng)的任務(wù)概要講解
這篇文章主要為大家介紹了FreeRTOS實(shí)時(shí)操作系統(tǒng)的任務(wù)概要講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04
FreeRTOS動(dòng)態(tài)內(nèi)存分配管理heap_2示例
這篇文章主要介紹了FreeRTOS動(dòng)態(tài)內(nèi)存分配管理heap_2示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04
FreeRTOS進(jìn)階之任務(wù)通知示例完全解析
這篇文章主要為大家介紹了FreeRTOS進(jìn)階系列之任務(wù)通知的示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04

