配置參量(位于FreeRTOSConfig.h)
configUSE_PREEMPTION
設置為1,使用搶先式內核;設置為0,為合作輪轉內核。
configUSE_IDLE_HOOK
設置為1, 使用空閑鉤子;設置為0,不使用空閑鉤子,。
configUSE_TICK_HOOK
如果希望使用時間片鉤子, 就設置為1,設置為0,不使用
configCPU_CLOCK_HZ
內部處理器執行的頻率。這個值需要正確配置外圍定時器。
configTICK_RATE_HZ
The frequency of the RTOS tick interrupt.
RTOS時間片中斷的頻率。
時間片中斷用來測量時間。因此更高時間片頻率意味著時間測量可以有更高分辨率,同時意味著內核占用更多的CPU(效率很低)。演示程序都使用了1000Hz的時間片頻率。這是為了測試內核,通常需要更高的頻率。
多個任務共有同一優先級。通過切換任務,在每一個RTOS時間片內,內核將在同一優先級的任務間分配處理器時間。高時間片頻率意味著將減少給予每個任務的時間份額。
configMAX_PRIORITIES
應用程序任務中可用優先級 的數目.
任何數量的任務,都可以分配同一優先級。 任務單獨分配優先級。參考configMAX_CO_ROUTINE_PRIORITIES。 內核分配的每個可用的優先級都消耗RAM,因此這個值不應該設置為高于實際應用程序中需要的。
configMINIMAL_STACK_SIZE
空閑任務使用的堆棧大小。通常這個值不用少于 FreeRTOSConfig.h file中演示程序提供的。
configTOTAL_HEAP_SIZE
內核總共可用的RAM數量。如果程序中利用例子中內存分配方案(FreeRTOS 源代碼提供的),這個值僅僅適用這些。參考內存管理 部分獲得更過細節.
configMAX_TASK_NAME_LEN
當創建一個任務,能夠給予描述任務名稱的最大容許長度。這個長度指定符號數目,包括NULL終止字節。
configUSE_TRACE_FACILITY
設置為1,使用可視化追蹤功能。設置為0,就不使用。如果使用可視化追蹤,必須提供追蹤緩沖區。
configUSE_16_BIT_TICKS
時間片(內核開始執行后,時間片中斷的次數)來測量時間。時間片計數器定義為可用的portTickType.類型。
定義configUSE_16_BIT_TICKS為1,將使portTickType定義為16位無符號類型。定義為0,將是32位無符號類型。 使用16位類型,將使在16位或8位單片機大幅度提高性能。但是,這樣限制了最大指定可用時間周期(65535時間片)。然而,假定時間片頻率為250Hz,一個任務在16位上,最大延時或中斷時間位262秒,而32位為17179869秒。
configIDLE_SHOULD_YIELD
這個參數控制任務與空閑任務優先級相同時的行為。僅僅有以下影響:
1.使用優先級調度
2.用戶程序創建的任務,運行在空閑任務一樣的優先級
任務在時間片輪轉中,使用同一優先級。假定沒有更高優先級的任務,這樣每一個任務,在空閑優先級下,將被分配相同數量的處理時間。如果,他們的優先級高于空閑任務的優先級,那么這種情況更是如此。 當任務處于空閑優先級下的行為,會有稍許不同。當configIDLE_SHOULD_YIELD設置為1時,當其他在空閑優先級的任務準備運行時,空閑任務將立刻讓出CPU。當程序的任務調度可用時,要確保空閑任務能夠執行的最少時間以上。這個行為,產生了不好的影響(根據應用程序的需要),如下描述:
上述圖表表明,四個在空閑優先級的任務執行模型。任務A, B,和C,是應用程序任務。任務 I是空閑任務。上下文切換在T0, T1....T6規律的周期間發生。當空閑任務執行時,任務A準備執行,但是空閑任務已經占去了當前時間片的部分時間。結果是,任務I 和任務A共同分享一個時間片。任務B 和任務C比任務A獲得更多的執行時間。
這些可以通過如下避免:
1.如果合適,可以使用空閑鉤子代替在空閑優先級的分開任務。創建程序任務的優先級高于空閑優先級。
2.設置configIDLE_SHOULD_YIELD為1
設置configIDLE_SHOULD_YIELD為1,將阻止空閑任務讓出執行時間直到它的時間片用完。這就確保了所有在空閑優先級的任務分配了相同數量的執行時間。這是以分配給空閑任務更高比例的執行時間為代價。
configUSE_MUTEXES
設置為1,將使用互斥功能;設置為0,將不使用。讀者應該明白FreeRTOS.org 功能中互斥型和二進制型信號量之間的不同。
configUSE_RECURSIVE_MUTEXES
設置為1,將使用遞歸互斥功能;設置為0,將不使用。
configUSE_COUNTING_SEMAPHORES
設置為1,將使用計數器型信號量功能;設置為0,將不使用。
configUSE_ALTERNATIVE_API
設置為1,將包含替代隊列函數;設置為0,將不包含。替代API在queue.h頭文件中有詳細的描述。
configCHECK_FOR_STACK_OVERFLOW
The 堆棧溢出檢測 這頁中有詳細的細節描述。
configQUEUE_REGISTRY_SIZE
隊列記錄有兩個功能,都這涉及到內核相關的調試:
1.允許一個隊列相關的名稱,可以在GUI調試中容易定義。
2.包含了調試器所需的信息,來定位每個記錄的隊列和信號量。
隊列記錄除了進行內核相關的調試外,沒有什么目的。 configQUEUE_REGISTRY_SIZE定義了可以記錄的隊列和信號量的最大數目。這些僅能夠在使用內核相關調試時需要記錄的。查看API中vQueueAddToRegistry() 和 vQueueUnregisterQueue()參考文檔,獲得更多信息。
configUSE_CO_ROUTINES
設置為1,將使用(協同例程)合作輪轉式程序;設置為0,將不使用。當使用時,必須把Croutine.c包含進去項目中。
configMAX_CO_ROUTINE_PRIORITIES
合作式應用程序中可用的優先級數目。 任何合作式程序可使用同一優先級。任務分別設置優先級——參考configMAX_CO_ROUTINE_PRIORITIES.
Cortex M3 使用著請注意部分結尾特別說明的地方。
configKERNEL_INTERRUPT_PRIORITY應該設置為最低優先級。
注意如下討論中,以"FromISR" 結尾的API函數僅能夠在中斷服務函數中調用。
那些僅僅設置configKERNEL_INTERRUPT_PRIORITY的接口
內核本身為 configKERNEL_INTERRUPT_PRIORITY設置優先級。調用API函數的中斷,也必須以這個優先級執行。沒有調用API函數的中斷,可以有更高的優先級,因此內核調動,他們執行從不延時(在他們硬件限制的范圍內)。 那些在這兩種情況下:
configKERNEL_INTERRUPT_PRIORITY and configMAX_SYSCALL_INTERRUPT_PRIORITY執行的接口。
內核本身為configKERNEL_INTERRUPT_PRIORITY設置優先級。可以設置configMAX_SYSCALL_INTERRUPT_PRIORITY為從調用FreeRTOS.org API 函數的中斷設置更高的優先級。
可以設置configMAX_SYSCALL_INTERRUPT_PRIORITY高于 (一個很高優先級的水平)configKERNEL_INTERRUPT_PRIORITY來獲得 中斷全嵌套模式。沒有調用API函數的中斷可以在高于configMAX_SYSCALL_INTERRUPT_PRIORITY 優先級下執行,因此是不會被內核執行延時。例如,假定一個微控制器,為8級中斷優先級水平——0是最低優先級,7為最高(參考Cortex M3用戶在這部分的結尾特別注意的地方)。如下圖片,描述了在每一個優先級下什么可以和什么不可以,兩個常量被設置為4和0。
中斷優先級配置例子
這些參數配置允許很靈活的中斷處理:
•中斷處理的任務,像系統里其他任務一樣,書寫和分配優先級。這些任務都是被一個中斷激活。ISR本身編寫的應該盡可能的短小——僅僅為了喚醒更高優先級的任務而占用RAM。ISR返回,直接進入要喚醒的任務——因此中斷處理是及時的好像所有是中斷本身做的一樣。這樣的好處是:執行處理的任務時,所有的中斷都允許。
執行 configMAX_SYSCALL_INTERRUPT_PRIORITY的接口提供更多——在內核中斷和configMAX_SYSCALL_INTERRUPT_PRIORITY 之間允許全嵌套模式嵌套和程序調用API函數。中斷優先級在configMAX_SYSCALL_INTERRUPT_PRIORITY執行從不延時。
•運行在高于系統調用最大優先級的ISR,從不會被內核本身屏蔽,所以他們的響應性不被內核功能所影響。對于那些需要瞬間高精度的中斷來說是個好方法——例如:執行發動機換向的中斷。然而,這樣的ISR不能夠使用FreeRTOS.org API函數
為了利用這個方案,應用程序必須遵守如下原則:任何使用FreeRTOS.org API的中斷必須設置為同一優先級,像內核(configKERNEL_INTERRUPT_PRIORITY配置的一樣),或者處于或低于configMAX_SYSCALL_INTERRUPT_PRIORITY(為了接口包含了這個功能)。
Cortex M3 用和特別要注意的地方: 記住,Cortex M3 核心數值上使用低優先級來代替高優先級的中斷(這樣看起來反常規和容易忘記)。如果希望分配夠中斷一個低優先級,不要分配為0優先級(或其他低數值),因為這樣實際上在系統中這個中斷為最高優先級——如果設置優先級在configMAX_SYSCALL_INTERRUPT_PRIORITY可能使系統崩潰。 在Cortex M3核心 最低優先級實際上是255——然而不同于 Cortex M3 賣主說明的不同數目的優先級位和支持庫函數(期待優先級使用不同方法指定)。例如在STM32 ,在ST驅動庫中能夠指定的最低優先級是15——最高優先級可以指定為0。configKERNEL_INTERRUPT_PRIORITY and configMAX_SYSCALL_INTERRUPT_PRIORITY
configKERNEL_INTERRUPT_PRIORITY一般適用于Cortex-M3, PIC24, dsPIC and PIC32 接口。 configMAX_SYSCALL_INTERRUPT_PRIORITY一般PIC32和Cortex M3 接口中可用。其他接口將很快更新。
posted on 2010-05-18 21:10
jay 閱讀(784)
評論(0) 編輯 收藏 引用 所屬分類:
FreeRTOS