1. 程式人生 > >FreeRTOS學習筆記4

FreeRTOS學習筆記4

指令 註意 。。 判斷 back stats abort 參數 mini

FreeRTOS配置管理:

網上移植教程較多,也可以使用官方提供的各種Demo工程進行移植,不在詳細介紹。本文主要介紹FreeRTOS移植成功後進行的配置方式。使其成為自己最匹配最精簡,最適用的系統。

FreeRTOSConfig.h幾乎包含了所有需要的配置。下文講述主要的幾項配置:

  1. 包含INCLUDE_。。。的宏定義。所有這些宏都是條件編譯所需的。可以根據自身需要進行定義。例如INCLUDE_xTaskAbortDelay是需要使用函數 xTaskAbortDelay()時定義為1。這樣做的好處是使處理器不編譯不需要的函數。減少代碼量。函數的功能在函數名字中已體現出來。根據需要進行定義即可。
  2. config開始的宏:

   2.1 configAPPLICATION_ALLOCATED_HEAP 該宏定義為1時用戶可以自己家設置堆內存,堆內存的詳細代碼在heap_1.c到heap_5.c中。具體取決於用戶選擇哪種內存管理方式。網上都推薦使用4。

   2.2 configASSERT 斷言,和assert()函數類似,調試時可以判斷傳入的參數是否合理。一般在調試結束後關閉。FreeRTOS內核中的關鍵點都會調用 configASSERT(x),configASSERT()需要在 需要在 FreeRTOSConfig.h文 件中定義, 如下實例: #define configASSERT((x)) if((x)==0) vAssertCalled(__FILE_,__LINE__);
註意, vAssertCalled()函數需要用戶自行去定義,可以是顯示到 LCD上的 函數 ,也可以是 通過串口打印出來的 函數 ,原子的例程使用的定義:

//斷言 #define vAssertCalled(char,int) printf("Error:%s,%d\r\n",char,int) #define configASSERT(x) if((x)==0) vAssertCalled(__FILE__,__LINE__)
當參數 x錯誤的 時候就通過串口打印出發生文件名和所在錯誤的 時候就通過串口打印出發生文件名和所在行。

   2.3 configCHECK_FOR_STACK_OVERFLOW 堆棧溢出檢測。堆棧的大小是從任務創建時就已經定義完成的。如果定義了堆棧溢出檢測,用戶必須定義一個鉤子函數(回調函數)當堆棧溢出時,就會調用該函數。函數原型:

    void vApplicationStackOverflowHook( TaskHandle_t xTask, char * pcTaskName );

參數 xTask是任務句柄, pcTaskName是任務名字,要註意的堆棧溢出太嚴重話可能會 是任務名字,要註意的堆棧溢出太嚴重話可能會 是任務名字,要註意的堆棧溢出太嚴重話可能會 損毀這兩個參數, 損毀這兩個參數, 如果發生這種情況的話可以直接查看變量 如果發生這種情況的話可以直接查看變量 如果發生這種情況的話可以直接查看變量 如果發生這種情況的話可以直接查看變量 如果發生這種情況的話可以直接查看變量 pxCurrentTCB來確定哪個任務發 生了堆棧溢出,一般在調試結束時將該宏關閉,減少系統開銷。該宏可以等於1或者2,方法1較快,方法2慢一點但是幾乎可以檢測出所有堆棧溢出的情況。

   2.4 configCPU_CLOCK_HZ 設置 CPU的頻率。

   2.5 configSUPPORT_DYNAMIC_ALLOCATION 定義為 1的話在創建 FreeRTOS的內核對象時候 所需要的 RAM就會從 FreeRTOS的堆中 的堆中 動態的獲取內存,定義為0的話需要用戶自行提供。默認為1。

   2.6 configGENERATE_RUN_TIME_STATS 置為 1開啟時間統計功能, 開啟時間統計功能, 相應的 API函數會被編譯, 為 0時關閉間統計功能。 時關閉間統計功能。 如果 宏 configGENERATE_RUN_TIME_STATS為 1的話還需要定義一個外設來作為時間系統的基準,還需要一個宏返回當前基準時鐘的值。

   2.7 configIDLE_SHOULD_YIELD 一般關閉,空閑任務。沒什麽作用。

   2.8 configKERNEL_INTERRUPT_PRIORITY、
     onfigMAX_SYSCALL_INTERRUPT_PRIORITY、
     onfigMAX_API_CALL_INTERRUPT_PRIORITY
     三個宏和FreeRTOS 的中斷配置有關。

   2.9 configMAX_CO_ROUTINE_PRIORITIES 系統的最大優先級數量

   2.10 configMAX_PRIORITIES 設置任務的優先級數量,設置好以後任務就可以使用從0 到configMAX_PRIORITIES-1 的優先級,其中0 是最低優先級,configMAX_PRIORITIES-1 是最高優先級。

   2.11 configMAX_TASK_NAME_LEN 設置任務名最大長度。

    2.12 configMINIMAL_STACK_SIZE 設置空閑任務的最小堆棧大,以字為單位,不是字節。

    2.13 configNUM_THREAD_LOCAL_STORAGE_POINTERS 每個任務的指針數組大小。

    2.14 configUSE_MUTEXES 為1時使用互斥信號量。

    2.15 configUSE_PORT_OPTIMISED_TASK_SELECTION FreeRTOS有兩種方法來選擇下一個 要運行的任務,是通用另外有兩種方法來選擇下一個 要運行的任務,是通用另外有兩種方法來選擇下一個 要運行的任務,是通用另外是特殊的 方法, 也就是硬件方法, 使用 MCU自帶 的硬件指令來實現。(註:使用硬件方式時和使用的CPU有關,例如stm32有32個中斷,因此,使用stm32時硬件方式最多使用32個任務。而通用方式無限制。)

    2.16 onfigUSE_PREEMPTION 為1時使用搶占式任務調度器。0為協程方式。(FreeRTOS已經不再更新協程方式的算法。我們也可以使用同一優先級多個任務的方式來進行相類似的效果。)

    2.17 configUSE_TICKLESS_IDLE 低功耗模式

      configUSE_TIMERS 軟件定時器模式。並不精確。

    2.18 configUSE_TIME_SLICING 為1時使用搶占式調度器,這樣會使調度器無限調用最高級優先級任務。為0時使用輪盤式任務調度模式。默認為1。

  這是這個頭文件中我認為最常用也是最基本的幾個宏,在今後使用中有需要再具體查看即可。

FreeRTOS學習筆記4