FreeRTOS學習筆記 (零 )-FreeRTOS系統配置

    FreeRTOS使用前該如何知道怎麼配置系統是很重要的,通常都是在FreeRTOSConfig.h中定義。

======================================================
(1)#define configUSE_PREEMPTION
    -設為1使用搶佔模式;設為0則為協作式模式
    -搶佔式由系統決定如何調度
    -協作式模式只有在某些時候才會進行任務切換:
           >任務調用了taskYIELD()
           >任務調用了會進入bLOCK的API
           >中斷

(2)#define configUSE_IDLE_HOOK
    -為1時使用空閒任務,被刪掉的任務都會在空閒任務釋放並分配空間,故使用vTaskDelete()       刪除任務要確保空閒任務有處理時間。
    -空閒任務是為了確保至少有一個任務在運行,因此優先權通常為最低
    -空閒任務原型:
    void vApplicationMallocFailedHook(void)


(3)#define configUSE_TICK_HOOK
    -為1則可以設立一個時間片中斷函式,可做定時器,其原型:
    void vApplicationTickHook( void )

(4)#define configCPU_CLOCK_HZ
    -設置CPU時脈

(5)#define configTICK_RATE_HZ
    -為系統節拍的頻率,每單位時間內有幾次tick,通常都是設1000 1ms

(6)#define configMINIMAL_STACK_SIZE
    -設置任務堆疊大小最小的size,以字為單位,若設為70則真正堆疊大小就是70*4=280字節
     ,通常IDLE task會以這個size分配空間。

(7)#define configTOTAL_HEAP_SIZE
     -定義實際可用堆大小,使用動態記憶體管理時的heap1~5.c就是從ucHeap[configTOTAL_HEAP_SIZE]中申請的。

(8)#define configMAX_TASK_NAME_LEN
    -設置任務名稱最大長度

(9)#define configUSE_TRACE_FACILITY
    -為1會啟用追蹤調適,且會增加許多RAM使用

(10)#define configUSE_16_BIT_TICKS
    -為1:系統時拍定義為16bit
    -為2:系統節拍定義為32bit

 (11)#define configIDLE_SHOULD_YIELD
    -定義了與空閒任務(IDLE Task)處於相同優先級時的其他任務行為:
     -為0,空閒任務不會為其他相同優先級的任務讓出CPU使用權。
     -為1,空閒任務會為處於相同優先級的任務讓出CPU使用權,可以壓縮         在空閒任務的時間,不過有缺點:

      可看出B與C都有一樣的使用時間,在T1的時候進行任務切換,Idle執行一半被A搶走CPU使用權,T3任務切換給了B。
     可以看出設為1造成idle與A使用了一個時間片刻,使得A使用時間比其他的任務少。

 (12)#define configUSE_CO_ROUTINES
    -為1,可以使用協程,不過功能有限?

 (13)#define configUSE_MUTEXES
    -為1,可使用互斥信號量,會編譯相關的API

 (14)#define configUSE_TIMERS
    -為1,可使用Timer軟定時器,會編譯相關的API
    -若configUSE_TIMERS  定義1 則
     configTIMER_TASK_PRIORITY 
     configTIMER_QUEUE_LENGTH 
     configTIMER_TASK_STACK_DEPTH
     都必須定義

 (15)#define configMAX_PRIORITIES
    -設定任務優先權的數量。任務可設定0~(configMAX_PRIORITIES-1)的優先權

 (16)#define PRIORITIE_OFFSET
    -目前是未知設定

 (17)#define configMAX_CO_ROUTINE_PRIORITIES
    -協程可用的最大優先級

 (18)#define configUSE_COUNTING_SEMAPHORES
    -設置1,啟用計數信號量(semaphores),會編譯相關API

 (19)#define configUSE_ALTERNATIVE_API
    -為1,可以使用包含對列隊操作的額外API,目前詳情未知,爾後補上

 (20)#define configCHECK_FOR_STACK_OVERFLOW
    -設置是否檢查堆棧溢出,,如果使用xTaskCreate()創建任務,則這個任務的堆棧 FreeRTOS       會自動分配
    -只要設不為0則系統將會自動分配
    -檢測到溢出則調用以下鉤子函數:
void vApplicationStackOverflowHook( xTaskHandle pxTask, signed char *pcTaskName )
    -pxTask:任務句柄
    -pcTaskName:任務名稱

 (21)#define configUSE_RECURSIVE_MUTEXES
    -設為1,可使用互斥歸遞信號量,會編譯相關API

 (22)#define configQUEUE_REGISTRY_SIZE
    -在註冊queue有兩個作用:
       1.給queue一個名子,方便調試看是哪個queue
       2.使用內核條試查看信號量和queue的時後設定
   -通常為0

 (23)#define configGENERATE_RUN_TIME_STATS
    -為1,產生運行所需的信息(時間統計功能),會編譯相關API
    -建議非調試時不開啟
    -為1時,還需要定義:
      portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()    //用來初始化一個外設作為時間統計的基準時鐘
      portGET_RUN_TIME_COUNTER_VALUE()   //用來返回當前基準時中的值

(24)#define configTIMER_QUEUE_LENGTH 
    -FreeRTOS的軟體TimerAPI函數會透過列隊向軟體弟時棄任務發送消習,此定義用來設置這個列隊的長度

(25)#define configTIMER_TASK_STACK_DEPTH
    -設置軟體定時器的堆大小

 (26)#define configUSE_TICKLESS_IDLE 
    -為1時才能使用低功耗模式







留言

這個網誌中的熱門文章

FreeRTOS學習筆記 (二)-任務創建和刪除(xTaskCreate及vTaskDelete)

FreeRTOS學習筆記 (三)-時間管理vTaskDelay()及vTaskDelayUntil()

MCU的硬體基礎知識(2) 電晶體的應用