版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、1. #ifndef FREERTOS_CONFIG_H 2. #define FREERTOS_CONFIG_H 3. 4. /*Here is a good place to include header files that are required across 5. yourapplication. */ 6. #includ
2、e "something.h" 7. 8. #define configUSE_PREEMPTION 1 9. #define configUSE_PORT_OPTIMISED_TASK_SELECTION 0
3、 10. #define configUSE_TICKLESS_IDLE 0 11. #define configCPU_CLOCK_HZ
4、160; 60000000 12. #define configTICK_RATE_HZ 250 13. #define configMAX_PRIORITIES
5、60; 5 14. #define configMINIMAL_STACK_SIZE 128 15. #define configTOTAL_HEAP_SIZE
6、0; 10240 16. #define configMAX_TASK_NAME_LEN 16 17. #define config
7、USE_16_BIT_TICKS 0 18. #define configIDLE_SHOULD_YIELD 1 19. #def
8、ine configUSE_TASK_NOTIFICATIONS 1 20. #define configUSE_MUTEXES 0
9、; 21. #define configUSE_RECURSIVE_MUTEXES 0 22. #define configUSE_COUNTING_SEMAPHORES 0 23. #define configUSE_ALTERN
10、ATIVE_API 0/* Deprecated! */ 24. #define configQUEUE_REGISTRY_SIZE 10 25. #define
11、0;configUSE_QUEUE_SETS 0 26. #define configUSE_TIME_SLICING
12、0;0 27. #define configUSE_NEWLIB_REENTRANT 0 28. #define configENABLE_BACKWARD_COMPATIBILITY 0 29. #define configNUM_THREAD_LOCAL_STORAGE_PO
13、INTERS 5 30. 31. /*Hook function related definitions. */ 32. #define configUSE_IDLE_HOOK 0 33.
14、 #define configUSE_TICK_HOOK 0 34. #define configCHECK_FOR_STACK_OVERFLOW 0 35. #def
15、ine configUSE_MALLOC_FAILED_HOOK 0 36. 37. /*Run time and task stats gathering related definitions. */ 38. #define configGENERATE_RUN_TIME_
16、STATS 0 39. #define configUSE_TRACE_FACILITY 0 40. #define configUSE_STATS_FORMATTING_FUNCTIONS &
17、#160; 0 41. 42. /*Co-routine related definitions. */ 43. #define configUSE_CO_ROUTINES 0 44. #define confi
18、gMAX_CO_ROUTINE_PRIORITIES 1 45. 46. /*Software timer related definitions. */ 47. #define configUSE_TIMERS
19、0; 1 48. #define configTIMER_TASK_PRIORITY 3 49. #define configTIMER_QUEUE_LENGTH
20、60; 10 50. #define configTIMER_TASK_STACK_DEPTH configMINIMAL_STACK_SIZE 51. 52. /*Interrupt nesting behaviour
21、;configuration. */ 53. #define configKERNEL_INTERRUPT_PRIORITY dependent of processor 54. #define configMAX_SYSCALL_INTERRUPT_PRIORITY dependent on processor and applica
22、tion 55. #define configMAX_API_CALL_INTERRUPT_PRIORITY dependent on processor and application 56. 57. /*Define to trap errors during development. */ 58. #define configASSERT(
23、0;( x ) ) if( ( x ) = 0) vAssertCalled( _FILE_, _LINE_ ) 59. 60. /*FreeRTOS MPU specific definitions. */ 61. #define configINCLUDE_APPLICATION_DEF
24、INED_PRIVILEGED_FUNCTIONS 0 62. 63. /*Optional functions - most linkers will remove unused functions anyway. */ 64. #define INCLUDE_vTaskPrioritySet
25、0; 1 65. #define INCLUDE_uxTaskPriorityGet 1 66. #define INCLUDE_vTaskDelete
26、160; 1 67. #define INCLUDE_vTaskSuspend 1 68. #define INCLUDE_xResumeFromISR
27、160; 1 69. #define INCLUDE_vTaskDelayUntil 1 70. #define INCLUDE_vTaskDelay
28、60; 1 71. #define INCLUDE_xTaskGetSchedulerState 1 72. #define INCLUDE_xTaskGetCurre
29、ntTaskHandle 1 73. #define INCLUDE_uxTaskGetStackHighWaterMark 0 74. #define INCLUDE_xTaskGetIdleTaskHandle 0 75. #define I
30、NCLUDE_xTimerGetTimerDaemonTaskHandle 0 76. #define INCLUDE_pcTaskGetTaskName 0 77. #define INCLUDE_eTaskGetState &
31、#160; 0 78. #define INCLUDE_xEventGroupSetBitFromISR 1 79. #define INCLUDE_xTimerPendFunctionCall 0
32、0;80. 81. /* Aheader file that defines trace macro can be included here. */ 82. 83. #end if/* FREERTOS_CONFIG_H*/ 1.configUSE_PREEMPTION 為1時RTOS使用搶占式調(diào)度
33、器,為0時RTOS使用協(xié)作式調(diào)度器(時間片)。 注:在多任務(wù)管理機制上,操作系統(tǒng)可以分為搶占式和協(xié)作式兩種。協(xié)作式操作系統(tǒng)是任務(wù)主動釋放CPU后,切換到下一個任務(wù)。任務(wù)切換的時機完全取決于正在運行的任務(wù)。2.configUSE_PORT_OPTIMISED_TASK_SELECTION 某些運行FreeRTOS的硬件有兩種方法選擇下一個要執(zhí)行的任務(wù):通用方法和特定于硬件的方法(以下簡稱“特殊方法”)。 通用方法:· configUSE_POR
34、T_OPTIMISED_TASK_SELECTION設(shè)置為0或者硬件不支持這種特殊方法。· 可以用于所有FreeRTOS支持的硬件。· 完全用C實現(xiàn),效率略低于特殊方法。· 不強制要求限制最大可用優(yōu)先級數(shù)目 特殊方法:· 并非所有硬件都支持。· 必須將configUSE_PORT_OPTIMISED_TASK_SELECTION設(shè)置為1。· 依賴一個或多個特定架構(gòu)的匯編指令(一般是類似計算前導(dǎo)零CLZ指令)。· 比通用方法更高效。· 一般強制限定最大可用優(yōu)先級數(shù)目
35、為32。3.configUSE_TICKLESS_IDLE 設(shè)置configUSE_TICKLESS_IDLE為1使能低功耗tickless模式,為0保持系統(tǒng)節(jié)拍(tick)中斷一直運行。 通常情況下,F(xiàn)reeRTOS回調(diào)空閑任務(wù)鉤子函數(shù)(需要設(shè)計者自己實現(xiàn)),在空閑任務(wù)鉤子函數(shù)中設(shè)置微處理器進入低功耗模式來達到省電的目的。因為系統(tǒng)要響應(yīng)系統(tǒng)節(jié)拍中斷事件,因此使用這種方法會周期性的退出、再進入低功耗狀態(tài)。如果系統(tǒng)節(jié)拍中斷頻率過快,則大部分電能和CPU時間會消耗在進入和退出低功耗狀態(tài)上。
36、60; FreeRTOS的tickless空閑模式會在空閑周期時停止周期性系統(tǒng)節(jié)拍中斷。停止周期性系統(tǒng)節(jié)拍中斷可以使微控制器長時間處于低功耗模式。移植層需要配置外部喚醒中斷,當(dāng)喚醒事件到來時,將微控制器從低功耗模式喚醒。微控制器喚醒后,會重新使能系統(tǒng)節(jié)拍中斷。由于微控制器在進入低功耗后,系統(tǒng)節(jié)拍計數(shù)器是停止的,但我們又需要知道這段時間能折算成多少次系統(tǒng)節(jié)拍中斷周期,這就需要有一個不受低功耗影響的外部時鐘源,即微處理器處于低功耗模式時它也在計時的,這樣在重啟系統(tǒng)節(jié)拍中斷時就可以根據(jù)這個外部計時器計算出一個調(diào)整值并寫入RTOS 系統(tǒng)節(jié)拍計數(shù)器變量中。4.co
37、nfigUSE_IDLE_HOOK 設(shè)置為1使用空閑鉤子(Idle Hook類似于回調(diào)函數(shù)),0忽略空閑鉤子。 當(dāng)RTOS調(diào)度器開始工作后,為了保證至少有一個任務(wù)在運行,空閑任務(wù)被自動創(chuàng)建,占用最低優(yōu)先級(0優(yōu)先級)。對于已經(jīng)刪除的RTOS任務(wù),空閑任務(wù)可以釋放分配給它們的堆棧內(nèi)存。因此,在應(yīng)用中應(yīng)該注意,使用vTaskDelete()函數(shù)時要確保空閑任務(wù)獲得一定的處理器時間。除此之外,空閑任務(wù)沒有其它特殊功能,因此可以任意的剝奪空閑任務(wù)的處理器時間。
38、 應(yīng)用程序也可能和空閑任務(wù)共享同個優(yōu)先級。 空閑任務(wù)鉤子是一個函數(shù),這個函數(shù)由用戶來實現(xiàn),RTOS規(guī)定了函數(shù)的名字和參數(shù),這個函數(shù)在每個空閑任務(wù)周期都會被調(diào)用。 要創(chuàng)建一個空閑鉤子:1. 設(shè)置FreeRTOSConfig.h 文件中的configUSE_IDLE_HOOK 為1;2. 定義一個函數(shù),函數(shù)名和參數(shù)如下所示:1. void vApplicationIdleHook(void );
39、0; 這個鉤子函數(shù)不可以調(diào)用會引起空閑任務(wù)阻塞的API函數(shù)(例如:vTaskDelay()、帶有阻塞時間的隊列和信號量函數(shù)),在鉤子函數(shù)內(nèi)部使用協(xié)程是被允許的。 使用空閑鉤子函數(shù)設(shè)置CPU進入省電模式是很常見的。5.configUSE_MALLOC_FAILED_HOOK 每當(dāng)一個任務(wù)、隊列、信號量被創(chuàng)建時,內(nèi)核使用一個名為pvPortMalloc()的函數(shù)來從堆中分配內(nèi)存。官方的下載包中包含5個簡單內(nèi)存分配策略,分別保存在源文件heap_1.c、heap_2.c、
40、heap_3.c、heap_4.c、heap_5.c中。 僅當(dāng)使用這五個簡單策略之一時,宏configUSE_MALLOC_FAILED_HOOK才有意義。 如果定義并正確配置malloc()失敗鉤子函數(shù),則這個函數(shù)會在pvPortMalloc()函數(shù)返回NULL時被調(diào)用。只有FreeRTOS在響應(yīng)內(nèi)存分配請求時發(fā)現(xiàn)堆內(nèi)存不足才會返回NULL。 如果宏configUSE_MALLOC_FAILED_HOOK設(shè)
41、置為1,那么必須定義一個malloc()失敗鉤子函數(shù),如果宏configUSE_MALLOC_FAILED_HOOK設(shè)置為0,malloc()失敗鉤子函數(shù)不會被調(diào)用,即便已經(jīng)定義了這個函數(shù)。malloc()失敗鉤子函數(shù)的函數(shù)名和原型必須如下所示:1. void vApplicationMallocFailedHook( void); 6.configUSE_TICK_HOOK 設(shè)置為1使用時間片鉤子(Tick Hook),0忽略時間片鉤子。 注:時間
42、片鉤子函數(shù)(Tick Hook Function) 時間片中斷可以周期性的調(diào)用一個被稱為鉤子函數(shù)(回調(diào)函數(shù))的應(yīng)用程序。時間片鉤子函數(shù)可以很方便的實現(xiàn)一個定時器功能。 只有在FreeRTOSConfig.h中的configUSE_TICK_HOOK設(shè)置成1時才可以使用時間片鉤子。一旦此值設(shè)置成1,就要定義鉤子函數(shù),函數(shù)名和參數(shù)如下所示:1. void vApplicationTickHook( void ); &
43、#160; vApplicationTickHook()函數(shù)在中斷服務(wù)程序中執(zhí)行,因此這個函數(shù)必須非常短小,不能大量使用堆棧,不能調(diào)用以”FromISR" 或 "FROM_ISR”結(jié)尾的API函數(shù)。 在FreeRTOSVx.x.xFreeRTOSDemoCommonMinimal文件夾下的crhook.c文件中有使用時間片鉤子函數(shù)的例程。7.configCPU_CLOCK_HZ 寫入實際的CPU內(nèi)核時鐘頻率,也就是CPU指令執(zhí)行頻率,通常稱為Fcclk。配置此
44、值是為了正確的配置系統(tǒng)節(jié)拍中斷周期。8.configTICK_RATE_HZ RTOS 系統(tǒng)節(jié)拍中斷的頻率。即一秒中斷的次數(shù),每次中斷RTOS都會進行任務(wù)調(diào)度。系統(tǒng)節(jié)拍中斷用來測量時間,因此,越高的測量頻率意味著可測到越高的分辨率時間。但是,高的系統(tǒng)節(jié)拍中斷頻率也意味著RTOS內(nèi)核占用更多的CPU時間,因此會降低效率。RTOS演示例程都是使用系統(tǒng)節(jié)拍中斷頻率為1000HZ,這是為了測試RTOS內(nèi)核,比實際使用的要高。(實際使用時不用這么高的系統(tǒng)節(jié)拍中斷頻率) 多個任務(wù)可以共享一個優(yōu)先級,RT
45、OS調(diào)度器為相同優(yōu)先級的任務(wù)分享CPU時間,在每一個RTOS 系統(tǒng)節(jié)拍中斷到來時進行任務(wù)切換。高的系統(tǒng)節(jié)拍中斷頻率會降低分配給每一個任務(wù)的“時間片”持續(xù)時間。9.configMAX_PRIORITIES 配置應(yīng)用程序有效的優(yōu)先級數(shù)目。任何數(shù)量的任務(wù)都可以共享一個優(yōu)先級,使用協(xié)程可以單獨的給與它們優(yōu)先權(quán)。見configMAX_CO_ROUTINE_PRIORITIES。 在RTOS內(nèi)核中,每個有效優(yōu)先級都會消耗一定量的RAM,因此這個值不要超過你的應(yīng)用實際需要的優(yōu)先級數(shù)目。注:任務(wù)優(yōu)先級
46、60; 每一個任務(wù)都會被分配一個優(yōu)先級,優(yōu)先級值從0 (configMAX_PRIORITIES - 1)之間。低優(yōu)先級數(shù)表示低優(yōu)先級任務(wù)??臻e任務(wù)的優(yōu)先級為0(tskIDLE_PRIORITY),因此它是最低優(yōu)先級任務(wù)。 FreeRTOS調(diào)度器將確保處于就緒狀態(tài)(Ready)或運行狀態(tài)(Running)的高優(yōu)先級任務(wù)比同樣處于就緒狀態(tài)的低優(yōu)先級任務(wù)優(yōu)先獲取處理器時間。換句話說,處于運行狀態(tài)的任務(wù)永遠是高優(yōu)先級任務(wù)。 處于就緒狀態(tài)的相同優(yōu)先級任務(wù)使用時
47、間片調(diào)度機制共享處理器時間。10.configMINIMAL_STACK_SIZE 定義空閑任務(wù)使用的堆棧大小。通常此值不應(yīng)小于對應(yīng)處理器演示例程文件FreeRTOSConfig.h中定義的數(shù)值。 就像xTaskCreate()函數(shù)的堆棧大小參數(shù)一樣,堆棧大小不是以字節(jié)為單位而是以字為單位的,比如在32位架構(gòu)下,棧大小為100表示棧內(nèi)存占用400字節(jié)的空間。11.configTOTAL_HEAP_SIZE RTOS內(nèi)核總計可用的有效的RAM
48、大小。僅在你使用官方下載包中附帶的內(nèi)存分配策略時,才有可能用到此值。每當(dāng)創(chuàng)建任務(wù)、隊列、互斥量、軟件定時器或信號量時,RTOS內(nèi)核會為此分配RAM,這里的RAM都屬于configTOTAL_HEAP_SIZE指定的內(nèi)存區(qū)。后續(xù)的內(nèi)存配置會詳細講到官方給出的內(nèi)存分配策略。12.configMAX_TASK_NAME_LEN 調(diào)用任務(wù)函數(shù)時,需要設(shè)置描述任務(wù)信息的字符串,這個宏用來定義該字符串的最大長度。這里定義的長度包括字符串結(jié)束符0。13.configUSE_TRACE_FACILITY 設(shè)
49、置成1表示啟動可視化跟蹤調(diào)試,會激活一些附加的結(jié)構(gòu)體成員和函數(shù)。14.configUSE_STATS_FORMATTING_FUNCTIONS (V7.5.0新增) 設(shè)置宏configUSE_TRACE_FACILITY和configUSE_STATS_FORMATTING_FUNCTIONS為1會編譯vTaskList()和vTaskGetRunTimeStats()函數(shù)。如果將這兩個宏任意一個設(shè)置為0,上述兩個函數(shù)不會被編譯。15.configUSE_16_BIT_TICKS
50、定義系統(tǒng)節(jié)拍計數(shù)器的變量類型,即定義portTickType是表示16位變量還是32位變量。 定義configUSE_16_BIT_TICKS為1意味著portTickType代表16位無符號整形,定義configUSE_16_BIT_TICKS為0意味著portTickType代表32位無符號整形。 使用16位類型可以大大提高8位和16位架構(gòu)微處理器的性能,但這也限制了最大時鐘計數(shù)為65535個Tick。因此,如果Tick頻率為250HZ(4MS中斷一次),對于任務(wù)最大延時或阻塞時間,16
51、位計數(shù)器是262秒,而32位是17179869秒。16.configIDLE_SHOULD_YIELD 這個參數(shù)控制任務(wù)在空閑優(yōu)先級中的行為。僅在滿足下列條件后,才會起作用。使用搶占式內(nèi)核調(diào)度用戶任務(wù)使用空閑優(yōu)先級。 通過時間片共享同一個優(yōu)先級的多個任務(wù),如果共享的優(yōu)先級大于空閑優(yōu)先級,并假設(shè)沒有更高優(yōu)先級任務(wù),這些任務(wù)應(yīng)該獲得相同的處理器時間。 但如果
52、共享空閑優(yōu)先級時,情況會稍微有些不同。當(dāng)configIDLE_SHOULD_YIELD為1時,其它共享空閑優(yōu)先級的用戶任務(wù)就緒時,空閑任務(wù)立刻讓出CPU,用戶任務(wù)運行,這樣確保了能最快響應(yīng)用戶任務(wù)。處于這種模式下也會有不良效果(取決于你的程序需要),描述如下: 圖中描述了四個處于空閑優(yōu)先級的任務(wù),任務(wù)A、B和C是用戶任務(wù),任務(wù)I是空閑任務(wù)。上下文切換周期性的發(fā)生在T0、T1T6時刻。當(dāng)用戶任務(wù)運行時,空閑任務(wù)立刻讓出CPU,但是,空閑任務(wù)已經(jīng)消耗了當(dāng)前時間片中的一定時間。這樣的結(jié)果就是空閑任務(wù)I和用戶任務(wù)A共享一個時間片。用戶任務(wù)B和用戶任務(wù)
53、C因此獲得了比用戶任務(wù)A更多的處理器時間。 可以通過下面方法避免:· 如果合適的話,將處于空閑優(yōu)先級的各單獨的任務(wù)放置到空閑鉤子函數(shù)中;· 創(chuàng)建的用戶任務(wù)優(yōu)先級大于空閑優(yōu)先級;· 設(shè)置IDLE_SHOULD_YIELD為0; 設(shè)置configIDLE_SHOULD_YIELD為0將阻止空閑任務(wù)為用戶任務(wù)讓出CPU,直到空閑任務(wù)的時間片結(jié)束。這確保所有處在空閑優(yōu)先級的任務(wù)分配到相同多的處理器時間,但是,這是以分配給空閑任務(wù)更高比例的處理器時間為代價的。17.con
54、figUSE_TASK_NOTIFICATIONS(V8.2.0新增) 設(shè)置宏configUSE_TASK_NOTIFICATIONS為1(或不定義宏configUSE_TASK_NOTIFICATIONS)將會開啟任務(wù)通知功能,有關(guān)的API函數(shù)也會被編譯。設(shè)置宏configUSE_TASK_NOTIFICATIONS為0則關(guān)閉任務(wù)通知功能,相關(guān)API函數(shù)也不會被編譯。默認這個功能是開啟的。開啟后,每個任務(wù)多增加8字節(jié)RAM。 這是個很有用的特性,一大亮點。
55、60; 每個RTOS任務(wù)具有一個32位的通知值,RTOS任務(wù)通知相當(dāng)于直接向任務(wù)發(fā)送一個事件,接收到通知的任務(wù)可以解除任務(wù)的阻塞狀態(tài)(因等待任務(wù)通知而進入阻塞狀態(tài))。相對于以前必須分別創(chuàng)建隊列、二進制信號量、計數(shù)信號量或事件組的情況,使用任務(wù)通知顯然更靈活。更好的是,相比于使用信號量解除任務(wù)阻塞,使用任務(wù)通知可以快45%(使用GCC編譯器,-o2優(yōu)化級別)。18.configUSE_MUTEXES 設(shè)置為1表示使用互斥量,設(shè)置成0表示忽略互斥量。讀者應(yīng)該了解在FreeRTOS中互斥量和二進制信號量的區(qū)別。
56、 關(guān)于互斥量和二進制信號量簡單說:· 互斥型信號量必須是同一個任務(wù)申請,同一個任務(wù)釋放,其他任務(wù)釋放無效。· 二進制信號量,一個任務(wù)申請成功后,可以由另一個任務(wù)釋放。· 互斥型信號量是二進制信號量的子集19.configUSE_RECURSIVE_MUTEXES 設(shè)置成1表示使用遞歸互斥量,設(shè)置成0表示不使用。20.configUSE_COUNTING_SEMAPHORES 設(shè)置成1表示使用計數(shù)信號量,設(shè)置成0表示不使用。21.conf
57、igUSE_ALTERNATIVE_API 設(shè)置成1表示使用“替代”隊列函數(shù)('alternative' queue functions),設(shè)置成0不使用。替代API在queue.h頭文件中有詳細描述。 注:“替代”隊列函數(shù)已經(jīng)被棄用,在新的設(shè)計中不要使用它!22.configCHECK_FOR_STACK_OVERFLOW 每個任務(wù)維護自己的??臻g,任務(wù)創(chuàng)建時會自動分配任務(wù)需要的占內(nèi)存,分配內(nèi)存大小由創(chuàng)建任務(wù)函
58、數(shù)(xTaskCreate())的一個參數(shù)指定。堆棧溢出是設(shè)備運行不穩(wěn)定的最常見原因,因此FreeeRTOS提供了兩個可選機制用來輔助檢測和改正堆棧溢出。配置宏configCHECK_FOR_STACK_OVERFLOW為不同的常量來使用不同堆棧溢出檢測機制。 注意,這個選項僅適用于內(nèi)存映射未分段的微處理器架構(gòu)。并且,在RTOS檢測到堆棧溢出發(fā)生之前,一些處理器可能先產(chǎn)生故障(fault)或異常(exception)來反映堆棧使用的惡化。如果宏configCHECK_FOR_STACK_OVERFLOW沒有設(shè)置成0,用戶必須提供一個棧溢出鉤子
59、函數(shù),這個鉤子函數(shù)的函數(shù)名和參數(shù)必須如下所示:1. void vApplicationStackOverflowHook(TaskHandle_t xTask, signed char *pcTaskName ); 參數(shù)xTask和pcTaskName為堆棧溢出任務(wù)的句柄和名字。請注意,如果溢出非常嚴重,這兩個參數(shù)信息也可能是錯誤的!在這種情況下,可以直接檢查pxCurrentTCb變量。
60、 推薦僅在開發(fā)或測試階段使用棧溢出檢查,因為堆棧溢出檢測會增大上下文切換開銷。 任務(wù)切換出去后,該任務(wù)的上下文環(huán)境被保存到自己的堆??臻g,這時很可能堆棧的使用量達到了最大(最深)值。在這個時候,RTOS內(nèi)核會檢測堆棧指針是否還指向有效的堆??臻g。如果堆棧指針指向了有效堆??臻g之外的地方,堆棧溢出鉤子函數(shù)會被調(diào)用。 這個方法速度很快,但是不能檢測到所有堆棧溢出情況(比如,堆棧溢出沒有發(fā)生在上下文切換時)。設(shè)置configCHECK_FOR_STACK_OVERFLOW為1會使用這種方
61、法。 當(dāng)堆棧首次創(chuàng)建時,在它的堆棧區(qū)中填充一些已知值(標(biāo)記)。當(dāng)任務(wù)切換時,RTOS內(nèi)核會檢測堆棧最后的16個字節(jié),確保標(biāo)記數(shù)據(jù)沒有被覆蓋。如果這16個字節(jié)有任何一個被改變,則調(diào)用堆棧溢出鉤子函數(shù)。 這個方法比第一種方法要慢,但也相當(dāng)快了。它能有效捕捉堆棧溢出事件(即使堆棧溢出沒有發(fā)生在上下文切換時),但是理論上它也不能百分百的捕捉到所有堆棧溢出(比如堆棧溢出的值和標(biāo)記值相同,當(dāng)然,這種情況發(fā)生的概率極?。?。 使用這個方法需要設(shè)置confi
62、gCHECK_FOR_STACK_OVERFLOW為2.23.configQUEUE_REGISTRY_SIZE 隊列記錄有兩個目的,都涉及到RTOS內(nèi)核的調(diào)試:1. 它允許在調(diào)試GUI中使用一個隊列的文本名稱來簡單識別隊列;2. 包含調(diào)試器需要的每一個記錄隊列和信號量定位信息; 除了進行內(nèi)核調(diào)試外,隊列記錄沒有其它任何目的。 configQUEUE_REGISTRY_SIZE定義可以記錄的隊列和信號量的最大數(shù)目。如果你想使用RTOS內(nèi)核調(diào)
63、試器查看隊列和信號量信息,則必須先將這些隊列和信號量進行注冊,只有注冊后的隊列和信號量才可以使用RTOS內(nèi)核調(diào)試器查看。查看API參考手冊中的vQueueAddToRegistry() 和vQueueUnregisterQueue()函數(shù)獲取更多信息。24.configUSE_QUEUE_SETS 設(shè)置成1使能隊列集功能(可以阻塞、掛起到多個隊列和信號量),設(shè)置成0取消隊列集功能。25.configUSE_TIME_SLICING(V7.5.0新增) 默認情況下(宏configUSE_TIM
64、E_SLICING未定義或者宏configUSE_TIME_SLICING設(shè)置為1),F(xiàn)reeRTOS使用基于時間片的優(yōu)先級搶占式調(diào)度器。這意味著RTOS調(diào)度器總是運行處于最高優(yōu)先級的就緒任務(wù),在每個RTOS 系統(tǒng)節(jié)拍中斷時在相同優(yōu)先級的多個任務(wù)間進行任務(wù)切換。如果宏configUSE_TIME_SLICING設(shè)置為0,RTOS調(diào)度器仍然總是運行處于最高優(yōu)先級的就緒任務(wù),但是當(dāng)RTOS 系統(tǒng)節(jié)拍中斷發(fā)生時,相同優(yōu)先級的多個任務(wù)之間不再進行任務(wù)切換。26.configUSE_NEWLIB_REENTRANT(V7.5.0新增) 如果宏confi
65、gUSE_NEWLIB_REENTRANT設(shè)置為1,每一個創(chuàng)建的任務(wù)會分配一個newlib(一個嵌入式C庫)reent結(jié)構(gòu)。27.configENABLE_BACKWARD_COMPATIBILITY 頭文件FreeRTOS.h包含一系列#define宏定義,用來映射版本V8.0.0和V8.0.0之前版本的數(shù)據(jù)類型名字。這些宏可以確保RTOS內(nèi)核升級到V8.0.0或以上版本時,之前的應(yīng)用代碼不用做任何修改。在FreeRTOSConfig.h文件中設(shè)置宏configENABLE_BACKWARD_COMPATIBILITY為0會去掉這些宏定義,
66、并且需要用戶確認升級之前的應(yīng)用沒有用到這些名字。28.configNUM_THREAD_LOCAL_STORAGE_POINTERS 設(shè)置每個任務(wù)的線程本地存儲指針數(shù)組大小。 線程本地存儲允許應(yīng)用程序在任務(wù)的控制塊中存儲一些值,每個任務(wù)都有自己獨立的儲存空間,宏configNUM_THREAD_LOCAL_STORAGE_POINTERS指定每個任務(wù)線程本地存儲指針數(shù)組的大小。API函數(shù)vTaskSetThreadLocalStoragePointer()用于向指針數(shù)組中寫入值,API函數(shù)p
67、vTaskGetThreadLocalStoragePointer()用于從指針數(shù)組中讀取值。 比如,許多庫函數(shù)都包含一個叫做errno的全局變量。某些庫函數(shù)使用errno返回庫函數(shù)錯誤信息,應(yīng)用程序檢查這個全局變量來確定發(fā)生了那些錯誤。在單線程程序中,將errno定義成全局變量是可以的,但是在多線程應(yīng)用中,每個線程(任務(wù))必須具有自己獨有的errno值,否則,一個任務(wù)可能會讀取到另一個任務(wù)的errno值。 FreeRTOS提供了一個靈活的機制,使得應(yīng)用程序可以使用線程本地存儲指針來讀寫線程
68、本地存儲。具體參見后續(xù)文章FreeRTOS系列第12篇-FreeRTOS任務(wù)應(yīng)用函數(shù)。29.configGENERATE_RUN_TIME_STATS 設(shè)置宏configGENERATE_RUN_TIME_STATS為1使能運行時間統(tǒng)計功能。一旦設(shè)置為1,則下面兩個宏必須被定義:portCONFIGURE_TIMER_FOR_RUN_TIME_STATS():用戶程序需要提供一個基準(zhǔn)時鐘函數(shù),函數(shù)完成初始化基準(zhǔn)時鐘功能,這個函數(shù)要被define到宏portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()上。這是因為運行
69、時間統(tǒng)計需要一個比系統(tǒng)節(jié)拍中斷頻率還要高分辨率的基準(zhǔn)定時器,否則,統(tǒng)計可能不精確?;鶞?zhǔn)定時器中斷頻率要比統(tǒng)節(jié)拍中斷快10100倍?;鶞?zhǔn)定時器中斷頻率越快,統(tǒng)計越精準(zhǔn),但能統(tǒng)計的運行時間也越短(比如,基準(zhǔn)定時器10ms中斷一次,8位無符號整形變量可以計到2.55秒,但如果是1秒中斷一次,8位無符號整形變量可以統(tǒng)計到255秒)。portGET_RUN_TIME_COUNTER_VALUE():用戶程序需要提供一個返回基準(zhǔn)時鐘當(dāng)前“時間”的函數(shù),這個函數(shù)要被define到宏portGET_RUN_TIME_COUNTER_VALUE()上。 舉一個
70、例子,假如我們配置了一個定時器,每500us中斷一次。在定時器中斷服務(wù)例程中簡單的使長整形變量ulHighFrequencyTimerTicks自增。那么上面提到兩個宏定義如下(可以在FreeRTOSConfig.h中添加):1. extern volatile unsigned longulHighFrequencyTimerTicks; 2. #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() ( ulHighFrequencyTimerTicks =&
71、#160;0UL ) 3. #define portGET_RUN_TIME_COUNTER_VALUE() ulHighFrequencyTimerTicks 30.configUSE_CO_ROUTINES 設(shè)置成1表示使用協(xié)程,0表示不使用協(xié)程。如果使用協(xié)程,必須在工程中包含croutine.c文件。 注:協(xié)程(Co-routines)主要用于資源發(fā)非常受限的嵌入式系統(tǒng)(RAM非常少),通常不會用于32位微處理器
72、。 在當(dāng)前嵌入式硬件環(huán)境下,不建議使用協(xié)程,F(xiàn)reeRTOS的開發(fā)者早已經(jīng)停止開發(fā)協(xié)程。31.configMAX_CO_ROUTINE_PRIORITIES 應(yīng)用程序協(xié)程(Co-routines)的有效優(yōu)先級數(shù)目,任何數(shù)目的協(xié)程都可以共享一個優(yōu)先級。使用協(xié)程可以單獨的分配給任務(wù)優(yōu)先級。見configMAX_PRIORITIES。32.configUSE_TIMERS 設(shè)置成1使用軟件定時器,為0不使用軟件定時器功能。詳細描述見FreeRTO
73、S software timers 。33.configTIMER_TASK_PRIORITY 設(shè)置軟件定時器服務(wù)/守護進程的優(yōu)先級。詳細描述見FreeRTOS software timers 。34.configTIMER_QUEUE_LENGTH 設(shè)置軟件定時器命令隊列的長度。詳細描述見FreeRTOS software timers。35.configTIMER_TASK_STACK_DEPTH 設(shè)置軟件定時器服務(wù)/守護進程任務(wù)的堆棧
74、深度,詳細描述見FreeRTOS software timers 。36.configKERNEL_INTERRUPT_PRIORITY、configMAX_SYSCALL_INTERRUPT_PRIORITY和configMAX_API_CALL_INTERRUPT_PRIORITY 這是移植和應(yīng)用FreeRTOS出錯最多的地方,所以需要打起精神仔細讀懂。 Cortex-M3、PIC24、dsPIC、PIC32、SuperH和RX600硬件設(shè)備需要設(shè)置宏con
75、figKERNEL_INTERRUPT_PRIORITY;PIC32、RX600和Cortex-M硬件設(shè)備需要設(shè)置宏configMAX_SYSCALL_INTERRUPT_PRIORITY。 configMAX_SYSCALL_INTERRUPT_PRIORITY和configMAX_API_CALL_INTERRUPT_PRIORITY,這兩個宏是等價的,后者是前者的新名字,用于更新的移植層代碼。 注意下面的描述中,在中斷服務(wù)例程中僅可以調(diào)用以“FromISR”結(jié)尾的API函數(shù)。·
76、; 僅需要設(shè)置configKERNEL_INTERRUPT_PRIORITY的硬件設(shè)備(也就是宏configMAX_SYSCALL_INTERRUPT_PRIORITY不會用到):configKERNEL_INTERRUPT_PRIORITY用來設(shè)置RTOS內(nèi)核自己的中斷優(yōu)先級。調(diào)用API函數(shù)的中斷必須運行在這個優(yōu)先級;不調(diào)用API函數(shù)的中斷,可以運行在更高的優(yōu)先級,所以這些中斷不會被因RTOS內(nèi)核活動而延時。 · configKERNEL_INTERRUPT_PRIORITY和configMAX_SYSCALL_INTERRUPT_PRIORITY都需要設(shè)置的硬件設(shè)備:c
77、onfigKERNEL_INTERRUPT_PRIORITY用來設(shè)置RTOS內(nèi)核自己的中斷優(yōu)先級。因為RTOS內(nèi)核中斷不允許搶占用戶使用的中斷,因此這個宏一般定義為硬件最低優(yōu)先級。configMAX_SYSCALL_INTERRUPT_PRIORITY用來設(shè)置可以在中斷服務(wù)程序中安全調(diào)用FreeRTOS API函數(shù)的最高中斷優(yōu)先級。優(yōu)先級小于等于這個宏所代表的優(yōu)先級時,程序可以在中斷服務(wù)程序中安全的調(diào)用FreeRTOS API函數(shù);如果優(yōu)先級大于這個宏所代表的優(yōu)先級,表示FreeRTOS無法禁止這個中斷,在這個中斷服務(wù)程序中絕不可以調(diào)用任何API函數(shù)。
78、 通過設(shè)置configMAX_SYSCALL_INTERRUPT_PRIORITY的優(yōu)先級級別高于configKERNEL_INTERRUPT_PRIORITY可以實現(xiàn)完整的中斷嵌套模式。這意味著FreeRTOS內(nèi)核不能完全禁止中斷,即使在臨界區(qū)。此外,這對于分段內(nèi)核架構(gòu)的微處理器是有利的。請注意,當(dāng)一個新中斷發(fā)生后,某些微處理器架構(gòu)會(在硬件上)禁止中斷,這意味著從硬件響應(yīng)中斷到FreeRTOS重新使能中斷之間的這段短時間內(nèi),中斷是不可避免的被禁止的。 不調(diào)用API的中斷可以運行在比configMAX_SYSCALL_INTERR
79、UPT_PRIORITY高的優(yōu)先級,這些級別的中斷不會被FreeRTOS禁止,因此不會因為執(zhí)行RTOS內(nèi)核而被延時。 例如:假如一個微控制器有8個中斷優(yōu)先級別:0表示最低優(yōu)先級,7表示最高優(yōu)先級(Cortex-M3和Cortex-M4內(nèi)核優(yōu)先數(shù)和優(yōu)先級別正好與之相反,后續(xù)文章會專門介紹它們)。當(dāng)兩個配置選項分別為4和0時,下圖描述了每一個優(yōu)先級別可以和不可做的事件:· configMAX_SYSCALL_INTERRUPT_PRIORITY=4· configKERNEL_INTERRUPT_PRIORITY=0 這些配置參數(shù)允許非常靈活的中斷處理: 在系統(tǒng)中可以像其它任務(wù)一樣為中斷處理任務(wù)分配優(yōu)先級。這些任務(wù)通過一個相應(yīng)中斷喚醒。中斷服務(wù)例程(ISR)內(nèi)容應(yīng)盡可能的精簡-僅用于更新數(shù)據(jù)然后喚醒高優(yōu)先級任務(wù)。ISR退出后,直接運行被喚醒的任務(wù),因此中斷處理(根據(jù)中斷獲取的數(shù)據(jù)來進行的相應(yīng)處理)在時間上是連續(xù)的,就像ISR在完成這些工作。這樣做的好處是當(dāng)中斷處理任務(wù)執(zhí)行時,所有中斷都可以處在使能狀態(tài)。 &
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年標(biāo)準(zhǔn)車輛按揭買賣協(xié)議范本版B版
- 定制化在家具行業(yè)的應(yīng)用及其發(fā)展趨勢
- 2024年項目策劃服務(wù)協(xié)議模板版B版
- 2024版人工智能醫(yī)療設(shè)備研發(fā)合作協(xié)議
- 天文數(shù)據(jù)助力現(xiàn)代醫(yī)療治療研究
- 《單針合谷穴配合運動療法治療落枕的隨機對照研究》
- 智能寵物喂食器課程設(shè)計
- 2024年跨國企業(yè)高級專利技術(shù)授權(quán)協(xié)議版
- 二零二五年度博物館展覽館裝修與布展合同
- 2025年度版權(quán)轉(zhuǎn)讓合同的稅費承擔(dān)規(guī)定3篇
- 手術(shù)醫(yī)師技術(shù)檔案年度考核表
- 建筑施工企業(yè)經(jīng)營管理課件完整版
- 排列3,3D終極教程
- 高中政治必修二 1.1《公有制為主體 多種所有制經(jīng)濟共同發(fā)展》集體備課課件
- 交通信號控制系統(tǒng)檢驗批質(zhì)量驗收記錄表
- 護理查房股骨骨折
- 九大仙草你認識嗎課件
- 舉辦活動的申請書范文
- 瑤醫(yī)目診圖-望面診病現(xiàn)用圖解-目診
- GB∕T 12234-2019 石油、天然氣工業(yè)用螺柱連接閥蓋的鋼制閘閥
- DB62∕T 3176-2019 建筑節(jié)能與結(jié)構(gòu)一體化墻體保溫系統(tǒng)應(yīng)用技術(shù)規(guī)程
評論
0/150
提交評論