advertisement

2014年12月12日

2014/12/12 進階微控制器應用

主要記憶體有二

  1. stack堆疊-儲存區域變數、全域變數=>managed(受管理的),無記憶體洩漏(編譯時已知道的變數)
  2. heap記憶堆-儲存動態變數(大量)使用malloc(配置),free(釋放),使用過後需要把他free釋放,否則造成記憶體洩漏(編譯時不知道的變數)
freeRTOS有三種記憶體堆
  1. keap_1只配置不釋放(適合當你的應用程式是固定的動態記憶體,或者已經知道最多所需使用的動態記憶體微多少)
  2. keep_2可配置可釋放,使用簡易方法執行配置、釋放,可能會造成記憶體碎斷(fragmentation):假設第一筆資料100bytes,第二筆50bytes,第三筆30bytes,若第二筆被釋放,則要在新增大於50bytes的資料,則會無法放入,只能放置在第三筆之後,稱記憶體碎斷,使記憶體存取速度下降,則需使用記憶體重整。
  3. 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.




沒有留言:

張貼留言

文章有誤或有問題麻煩您留言告知! 謝謝您~~