- stack堆疊-儲存區域變數、全域變數=>managed(受管理的),無記憶體洩漏(編譯時已知道的變數)
- heap記憶堆-儲存動態變數(大量)使用malloc(配置),free(釋放),使用過後需要把他free釋放,否則造成記憶體洩漏(編譯時不知道的變數)
freeRTOS有三種記憶體堆
- keap_1只配置不釋放(適合當你的應用程式是固定的動態記憶體,或者已經知道最多所需使用的動態記憶體微多少)
- keep_2可配置可釋放,使用簡易方法執行配置、釋放,可能會造成記憶體碎斷(fragmentation):假設第一筆資料100bytes,第二筆50bytes,第三筆30bytes,若第二筆被釋放,則要在新增大於50bytes的資料,則會無法放入,只能放置在第三筆之後,稱記憶體碎斷,使記憶體存取速度下降,則需使用記憶體重整。
- keep_3完整之配置釋放,並且會記憶體重整,較常用較耗時
http://aosabook.org/en/freertos.html
Architecture Overview
Task-工作管理
Communication-資料資源管理
Hardware dependent-硬體相關程式port.c
工作管理
列表(List)-環狀雙鍊結(circular doubly link lisk)
工作控制區(TCB)-Task Control Block
工作列表有4
就緒列表Ready TaskList
延遲列表Delay TaskList1
過時延遲列表Delay TaskList2
重啟列表PendingTaskList 擱置後重啟
就緒列表依優先權而不同
每一種優先權有一就緒列表
排程程式會從最高優先權就緒列表開始查詢是否有就緒工作,若有就執行工作,並將此工作從就緒列表中移除,若無就查詢下一個優先權列表,依此步驟直到查完最低優先權列表為止。
查詢就緒工作之程式
首先需定最大優先權
#define configMAX_PRIORITIES 5
就緒列表宣告
xList列表之資料型態
xList pxReadyTaskList[configMAX_PRIORITIES];
找出可執行的工作
//TopPriority=configMAX_PRIORITIES
while(listLIST_IS_EMPTY(&(pxReadyTaskList[TopPriority])));//檢查priority為TopPriority之就緒列表是否為空
{
TopPriority--;if(TopPriority<0) break;
}//從就緒列表中找下一個就緒工作之TCB
listGET_OWNER_OF_NEXT_ENTRY(pxCurrentTCB,&(pxReadyTaskList[TopPriority]));
xList之資料結構
struct xLIST {
volatile unsigned portBAST_TYPE uxNumberOfItems;//工作列表之項數
volatile xListItem * pIndex;//下一個工作列表項
volatile xMiniListItem xListEnd;//工作列表的端點
};
typedef xLIST xList;
列表項之資料結構
typedef struct xLIST_ITEM {
portTickType xItemValue;//代表優先權數值或延遲滴答數
volatile struct xLIST_ITEM * pxNext;//下一個工做列表
volatile struct xLIST_ITEM * pxPrevious;//上一個工作列表
void *pvOwner;//對應工作,在程式裡面每一個工作就是一個TCB
void *pvContainer;//所屬列表
} xListItem;
TCB資料結構
typedef struct tskTaskControlBlock {
volatile portSTACK_TYPE *pxTopOfStact;//堆疊頂端位置,放入堆疊之最後一筆
資料位置
xListItem xGenericListItem;//就緒或延遲列表:基本列表項
xListItem xEventListItem;//事件列表項,通常為重啟列表之列表項
unsigned portBASE_TYPE uxPriority;//工作之優先權
portSTACK_TYPE *pxStack;//工做使用堆疊之起始位置
#if(portSTACK_GROWTH>0)
portSTACK_TYPE *pxEndOfstack;//往下延神之堆疊之底部位置,用來檢>查堆疊是否益位
#end if
#if(configUSE_MUTEXES==1)
unsigned portBASE_TYPE uxBasePriority;//當使用Mutex時,需記住原>先優先權,在優先權繼承後需改回來
#end if
}
優先權0之就緒列表有一列表項,此列表項屬於TaskA,優先權1之就緒列表為空,優先權2之就緒列表有3個列表項,所屬工作之順序為TaskB,TaskC,TaskD.
沒有留言:
張貼留言
文章有誤或有問題麻煩您留言告知! 謝謝您~~