




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、用了半天時間對FreeRTOS有了一個初步的認識,大概總結一下,其中混雜了系統實現和實際應用方面的問題。現只是以應用為目的,實現方面待以后進一步研究。1.FreeRTOS提供的功能包括:任務管理、時間管理、信號量、消息隊列、內存管理。與平臺有關的文件包含在portable文件夾中,主要是port.c, portmacro.h兩個文件。平臺無關的文件主要是:list.c(基本鏈表結構), queue.c(包括消息隊列,信號量的實現), croutine.c,tasks.c(任務管理,時間管理)。命名協定RTOS內核與范例程序源代碼使用下面的協定: 變量 char類型的變量以
2、c 為前綴 short類型的變量以 s 為前綴 long類型的變量以 l 為前綴 float類型的變量以 f 為前綴 double類型的變量以 d 為前綴 枚舉變量以 e 為前綴 其他類型(如結構體)以 x 為前綴 指針有一個額外的前綴 p , 例如short類型的指針前綴為 ps 無符號類型的變量有一個額外的前綴 u , 例如無符號short類型的變量前綴為 us 函數 文件內部函數以prv為前綴 API函數以其返回值類型為前綴,按照前面對變量的定義 函數的名字以其所在的文
3、件名開頭。如vTaskDelete函數在Task.c文件中定義 數據類型數據類型并不直接在RTOS內核內部引用。相反,每個平臺都有其自身的定義方式。例如,char類型定義為portCHAR,short類型定義為portSHORT等。范例程序源代碼使用的就是這種符號,但這并不是必須的,你可以在你的程序中使用任何你喜歡的符號。 此外,有兩種額外的類型要為每種平臺定義。分別是: portTickType可配置為16位的無符號類型或32位的無符號類型。參考API文檔中的 定制部分獲取詳細信息。portBASE_TYPE為特定體系定義的最有效率的數據類型。 如果p
4、ortBASE_TYPE定義為char則必須要特別小心的保證用來作為函數返回值的signed char可以為負數,用于指示錯誤。 2. FreeRTOS內核支持優先級調度算法,每個任務可根據重要程度的不同被賦予一定的優先級,CPU總是讓處于就緒態的、 優先級最高的任務先運行。FreeRT0S內核同時支持輪換調度算法,系統允許不同的任務使用相同的優先級,在沒有更高優先級任務就緒的情況下,同一優先級的任務共享CPU的使用時間。 3.freertos既可以配置為可搶占內核也可以配置為不可搶占內核。當FreeRTOS被設置為可剝奪型內核時,處于就緒態的高優先級任務能剝奪低優先級任務
5、的CPU使用權,這樣可保證系統滿足實時性的要求;當FreeRTOS被設置為不可剝奪型內核時,處于就緒態的高優先級任務只有等當前運行任務主動釋放CPU的使用權后才能獲得運行,這 樣可提高CPU的運行效率。 4.任務管理系統為每個任務分配一個TCB結構typedef struct tskTaskControlBlock volatile portSTACK_TYPE *pxTopOfStack;/指向堆棧頂 xListItem xGenericListItem;
6、 /通過它將任務連入就緒鏈表或者延時鏈表或者掛起鏈表中, xListItem包含其TCB指針 xListItem xEventListItem;/通過它把任務連入事件等待鏈表 unsigned portBASE_TYPE uxPriority;/優先級 portSTACK_TYPE *pxStack;
7、160; /指向堆棧起始位置 signed portCHAR pcTaskName configMAX_TASK_NAME_LEN ;。省略一些次要結構 tskTCB; 系統的全局變量:static xList pxReadyTasksLists configMAX_PRIORITIES ; 就緒隊列static xList xDelayedTaskList1;static xList xDelayedTaskList2; 兩個延時任務隊列static xList * volatile pxDelayedTaskL
8、ist;static xList * volatile pxOverflowDelayedTaskList; 兩個延時隊列的指針,應該是可互換的。static xList xPendingReadyList; static volatile xList xTasksWaitingTermination; 等待結束隊列static volatile unsigned portBASE_TYPE uxTasksDeleted = ( unsigned portBASE_TYPE ) 0; 結束隊列中的個數?static xList xSuspended
9、TaskList; 掛起隊列static volatile unsigned portBASE_TYPE uxCurrentNumberOfTasks;記錄了當前系統任務的數目static volatile portTickType xTickCount;是自啟動以來系統運行的ticks數static unsigned portBASE_TYPE uxTopUsedPriority;記錄當前系統中被使用的最高優先級,static volatile unsigned portBASE_TYPE uxTopReadyPriority;記錄當前系統中處于就緒狀態的最高優先級。
10、static volatile signed portBASE_TYPE xSchedulerRunning ;表示當前調度器是否在運行,也即內核是否啟動了 任務建立和刪除,掛起和喚醒 5.時間管理 操作系統總是需要個時鐘節拍的,這個需要硬件支持。freertos同樣需要一個time tick產生器,通常是用處理器的硬件定時器來實現這個功能。(時間片輪轉調度中和延時時間控制?)它周期性的產生定時中斷,所謂的時鐘節拍管理的核心就是這個定時中斷的服務程序。freertos的時鐘節拍isr中除去保存
11、現場,灰度現場這些事情外,核心的工作就是調用vTaskIncrementTick()函數。vTaskIncrementTick()函數主要做兩件事情:維護系統時間(以tick為單位,多少個節拍);處理那些延時的任務,如果延時到期,則喚醒任務。 任務可用的延時函數:vTaskDelay();vTaskDelayUntil();特別之處在于vTaskDelayUntil()是一個周期性任務可以利用它可以保證一個固定的(確定的)常數執行頻率,而vTaskDelay()無法保證。 6.任務間的通信(詳見“FreeRTOS任務間通訊”)1)當然可以用全局變量的形式通信,但是不安全。2
12、)隊列(xQueueHandle)是FreeRTOS中通信所需的主要數據結構。3)信號量(xSemaphoreHandle),有二進制信號量,計數信號量和互斥信號量,其都是以隊列為基礎結構建立。二進制信號量可以用于中斷和任務間的同步。也就是說希望任務隨外部中斷而執行。即外設給出“數據已就緒”信號,系統中斷,任務收到此中斷信號接收數據?;コ庖话阌糜诙脊蚕碣Y源或數據結構的保護。因為任務調度不能保證數據不被破壞。當一個任務需要訪問資源,它必須先獲得 ('take') 令牌;當訪問結束后,它必須釋放令牌 - 允許其他任務能夠訪問這個資源。(對此還有待進一步實驗研究)。7.系統配置fre
13、eRTOS 配置在:FREERTOS_CONFIG.H 里面,條目如下:/* 是否配置成搶先先多任務內核,是1的時候,優先級高的任務優先執行。 為0任務就沒有優先級之說,用時間片輪流執行 */#define configUSE_PREEMPTION 1 /* IDLE任務的HOOK函數,用于OS功能擴展,需要你自己編相應函數, 名字是void vApplicationIdleHook( void ) */#
14、define configUSE_IDLE_HOOK 0 /* SYSTEM TICK的HOOK函數,用于OS功能擴展,需要你自己編相應函數, 名字是 void vApplicationTickHook(void ) */ #define configUSE_TICK_HOOK &
15、#160; 0 /* 系統CPU頻率,單位是Hz */#define configCPU_CLOCK_HZ 58982400 /* 系統SYSTEM TICK每秒鐘的發生次數, 數值越大系統反應越快,但是CPU用在任務切換的開銷就越
16、多 */#define configTICK_RATE_HZ 250 /* 系統任務優先級數。5 說明任務有5級優先度。這個數目越大耗費RAM越多 */#define configMAX_PRIORITIES
17、; 5 /* 系統最小堆棧尺寸,注意128不是128字節,而是128個入棧。比如ARM32位,128個入棧就是512字節 */ #define configMINIMAL_STACK_SIZE 128 /* 系統可用內存。一般設成除了操作系統和你的程序所用RAM外的最大RAM。 比如20KRA
18、M你用了2K,系統用了3K,剩下15就是最大HEAP 尺寸。你可以先設小然后看編譯結果往大里加*/#define configTOTAL_HEAP_SIZE 10240 /* 任務的PC名字最大長度,因為函數名編譯完了就不見了,所以追蹤時不知道哪個名字。16表示16個char */#define configMAX_TASK
19、_NAME_LEN 16 /* 是否設定成追蹤,由PC端TraceCon.exe記錄,也可以轉到系統顯示屏上 */#define configUSE_TRACE_FACILITY 0 /* 就是SYSTEM TICK的長度,16是1
20、6位,如果是16位以下CPU, 一般選1;如果是32位系統,一般選0 */#define configUSE_16_BIT_TICKS 0 /* 簡單理解以下就是和IDLE TASK同樣優先級的任務執行情況。建議設成1,對系統影響不大 */#define configIDLE_SHOULD
21、_YIELD 1 /* 是否用MUTEXES。 MUTEXES是任務間通訊的一種方式,特別是用于任務共享資源的應用,比如打印機,任務A用的時候就排斥別的任務應用,用完了別的任務才可以應用 */#define configUSE_MUTEXES
22、 0 /* 確定是否用遞歸式的MUTEXES */#define configUSE_RECURSIVE_MUTEXES &
23、#160; 0 /* 是否用計數式的SEMAPHORES,SEMAPHORES也是任務間通訊的一種方式 */#define configUSE_COUNTING_SEMAPHORES 0 /* 是否應用可切換式的API。freeRTOS 同一功能API有多個,有全功能但是需求資源和時間較多的,此項使能后就可以用較簡單的API, 節省資源和時間,但是應用限制較多 */#define configUSE_ALTERNATIVE_API &
24、#160; 0 /* 此項用于DEBUG,來看是否有棧溢出,需要你自己編相應檢查函數void vApplicationStackOverflowHook(xTaskHandle *pxTask, signed portCHAR *pcTaskName ) */#define configCHECK_FOR_STACK_OVE
25、RFLOW 0 /* 用于DEBUG,登記SEMAPHORESQ和QUEUE的最大個數,需要在任務用應用函數vQueueAddToRegistry()和vQueueUnregisterQueue() */#define configQUEUE_REGISTRY_SIZE
26、0; 10 /* 設定可以改變任務優先度 */ #define INCLUDE_vTaskPrioritySet 1 /* 設定可以查詢任務優先度 */#defi
27、ne INCLUDE_uxTaskPriorityGet 1 /* 設定可以刪除任務 */ #define INCLUDE_vTaskDelete &
28、#160; 1 /* 據說是可以回收刪除任務后的資源(RAM等)*/ #define INCLUDE_vTaskCleanUpResources
29、160; 0 /* 設置可以把任務掛起 */#define INCLUDE_vTaskSuspend
30、; 1 /* 設置可以從中斷恢復(比如系統睡眠,由中斷喚醒 */#define INCLUDE_vResumeFromISR
31、; 1 /* 設置任務延遲的絕對時間,比如現在4:30,延遲到5:00。時間都是絕對時間 */#define INCLUDE_vTaskDelayUntil
32、1 /* 設置任務延時,比如延遲30分鐘,相對的時間,現在什么時間,不需要知道 */#define INCLUDE_vTaskDelay
33、; 1 /* 設置 取得當前任務分配器的狀態 */#define INCLUDE_xTaskGetSchedulerState 1 /* 設置當前任務是由哪個任務開啟的 */#define INCLUDE_xTaskGetCurrentTaskHandle
34、 1 /* 是否使能這一函數,還數的目的是返回任務執行后任務堆棧的最小未用數量,同樣是為防止堆棧溢出 */#define INCLUDE_uxTaskGetStackHighWaterMark 0 /* 是用用協程。協程公用堆棧,節省RAM,但是沒有任務優先級高,也無法和任務通訊 */#define configUSE_CO_ROUTIN
35、ES 0 /* 所有協程的最大優先級數,協程優先級永遠低于任務。就是系統先執行任務,所有任務執行完了才執行協程。*/#define configM
36、AX_CO_ROUTINE_PRIORITIES 1 /* 系統內核的中斷優先級,中斷優先級越低,越不會影響其他中斷。一般設成最低 */#define configKERNEL_INTERRUPT_PRIORITY dependent of processor /* 系統SVC中斷優先級,這兩項都在在M3和PIC3
37、2上應用 */#define configMAX_SYSCALL_INTERRUPT_PRIORITY dependent on processor and application #endif /* FREERTOS_CONFIG_H */配置FreeRTOSFreeRTOS 是高度可配置的。所有的可配置項都在FreeRTOSConfig.h 文件中。每一個Demo 程序中都包含了一個配置好的FreeRTOSConfig.h 文件,可以以Demo程序中的FreeRTOSConfig.h 文件作為模板,在其基礎上加以修改。下面先給出一個典型的FreeRTOSC
38、onfig.h 文件,然后再逐項加以說明。cpp view plaincopy1. #ifndef FREERTOS_CONFIG_H 2. #define FREERTOS_CONFIG_H 3. 4. /* Here is a good place to include header files that are required across
39、;5. your application. */ 6. #include "something.h" 7. 8. #define configUSE_PREEMPTION 1 9. #define configUSE_IDLE_HOOK &
40、#160; 0 10. #define configUSE_TICK_HOOK 0 11. #define configCPU_CLOCK_HZ
41、 58982400 12. #define configTICK_RATE_HZ 250 13. #define con
42、figMAX_PRIORITIES 5 14. #define configMINIMAL_STACK_SIZE 128 15. #define configTOTAL_HEAP_SIZE
43、160; 10240 16. #define configMAX_TASK_NAME_LEN 16 17. #define configUSE_TRACE_FACILITY
44、0; 0 18. #define configUSE_16_BIT_TICKS 0 19. #define configIDLE_SHOULD_YIELD &
45、#160; 1 20. #define configUSE_MUTEXES 0 21. #define configUSE_RECURSIVE_MUTEXES 0 22.
46、#define configUSE_COUNTING_SEMAPHORES 0 23. #define configUSE_ALTERNATIVE_API 0 24. #define configCHECK_FOR_STACK_OVERFLOW
47、;0 25. #define configQUEUE_REGISTRY_SIZE 10 26. #define configGENERATE_RUN_TIME_STATS 0 27. 28. #define configUSE_CO_ROUTINES
48、60; 0 29. #define configMAX_CO_ROUTINE_PRIORITIES 1 30. 31. #define configUSE_TIMERS
49、 1 32. #define configTIMER_TASK_PRIORITY 3 33. #define configTIMER_QUEUE_LENGTH
50、; 10 34. #define configTIMER_TASK_STACK_DEPTH configMINIMAL_STACK_SIZE 35. 36. #define configKERNEL_INTERRUPT_PRIORITY dependent of processor
51、 37. #define configMAX_SYSCALL_INTERRUPT_PRIORITY dependent on processor and application 38. 39. #define configASSERT( ( x ) ) &
52、#160; if( ( x ) = 0 ) vCallAssert( _FILE_, _LINE_ ) 40. 41. #define INCLUDE_vTaskPrioritySet 1 42.
53、#define INCLUDE_uxTaskPriorityGet 1 43. #define INCLUDE_vTaskDelete
54、60;1 44. #define INCLUDE_vTaskSuspend 1 45. #define INCLUDE_xResumeFromISR
55、60; 1 46. #define INCLUDE_vTaskDelayUntil 1 47. #define INCLUDE_vTaskDelay
56、0; 1 48. #define INCLUDE_xTaskGetSchedulerState 1 49. #define INCLUDE_xTaskGetCurrentTaskHandle 1
57、 50. #define INCLUDE_uxTaskGetStackHighWaterMark 0 51. #define INCLUDE_xTaskGetIdleTaskHandle 0 52. #define INCLUDE_xTimerGetTimerDaemonTaskHandle 0
58、;53. #define INCLUDE_pcTaskGetTaskName 0 54. 55. #endif /* FREERTOS_CONFIG_H */ 可配置的參數configUSE_PREEMPTION設為 1則采用搶占式調度器, 設為 0則采用協作式調度器。configUSE_IDLE_HOOK設為1
59、則使能 idle hook,設為0則禁止idle hook。configUSE_TICK_HOOK設為1則使能 tick hook,設為0則禁止tick hook。configCPU_CLOCK_HZ設置為 MCU 內核的工作頻率,以Hz為單位。配置FreeRTOS的時鐘Tick時會用到。對不同的移植代碼也可能不使用這個參數。如果確定移植代碼中不用它就可以注釋掉這行。configTICK_RATE_HZFreeRTOS的時鐘Tick的頻率,也就是FreeRTOS用到的定時中斷的產生頻率。這個頻率越高則定時的精度越高,但是由此帶來的開銷也越大。FreeRTOS 自帶的Demo 程序中將TickR
60、ate 設為了1000Hz只是用來測試內核的性能的。實際的應用程序應該根據需要改為較小的數值。當多個任務共用一個優先級時,內核調度器回來每次時鐘中斷到來后輪轉切換任務(round robin),因此,更高的Tick Rate 會導致任務的時間片“time slice”變短。configMAX_PRIORITIES程序中可以使用的最大優先級。FreeRTOS 會為每個優先級建立一個鏈表,因此沒多一個優先級都會增加些RAM 的開銷。所以,要根據程序中需要多少種不同的優先級來設置這個參數。configMINIMAL_STACK_SIZE任務堆棧的最小大小,FreeRTOS根據這個參數來給idle t
61、ask 分配堆棧空間。這個值如果設置的比實際需要的空間小,會導致程序掛掉。因此,最好不要減小Demo 程序中給出的大小。configTOTAL_HEAP_SIZE設置堆空間(Heap)的大小。只有當程序中采用FreeRTOS 提供的內存分配算法時才會用到。configMAX_TASK_NAME_LEN任務名稱最大的長度,這個長度是以字節為單位的,并且包括最后的 NULL 結束字節。configUSE_TRACE_FACILITY如果程序中需要用到TRACE功能,則需將這個宏設為1。否則設為0。開啟TRACE功能后,RAM占用量會增大許多,因此在設為1之前請三思。configUSE_16_BIT
62、_TICKS將 configUSE_16_BIT_TICKS設為 1后portTickType 將被定義為無符號的16位整形類型,configUSE_16_BIT_TICKS 設為0 后portTickType 則被定義為無符號的32位整型。configIDLE_SHOULD_YIELD這個參數控制那些優先級與idle 任務相同的任務的行為,并且只有當內核被配置為搶占式任務調度時才有實際作用。內核對具有同樣優先級的任務會采用時間片輪轉調度算法。當任務的優先級高于idle任務時,各個任務分到的時間片是同樣大小的。但當任務的優先級與idle任務相同時情況就有些不同了。當configIDLE_SHO
63、ULD_YIELD 被配置為1時,當任何優先級與idle 任務相同的任務處于就緒態時,idle任務會立刻要求調度器進行任務切換。這會使idle任務占用最少的CPU時間,但同時會使得優先級與idle 任務相同的任務獲得的時間片不是同樣大小的。因為idle任務會占用某個任務的部分時間片。configUSE_MUTEXES設為 1 則程序中會包含mutex 相關的代碼,設為 0 則忽略相關的代碼。configUSE_RECURSIVE_MUTEXES設為 1 則程序中會包含recursive mutex 相關的代碼,設為 0 則忽略相關的代碼。configUSE_COUNTING_SEMAPHORE
64、S設為 1 則程序中會包含semaphore 相關的代碼,設為 0 則忽略相關的代碼。configUSE_ALTERNATIVE_API設為 1 則程序中會包含一些關于隊列操作的額外API函數,設為 0 則忽略相關的代碼。這些額外提供的API運行速度更快,但是臨界區(關中斷)的長度也更長。有利也有弊,是否要采用需要用戶自己考慮了。configCHECK_FOR_STACK_OVERFLOW控制是否檢測堆棧溢出。configQUEUE_REGISTRY_SIZE隊列注冊表有兩個作用,但是這兩個作用都依賴于調試器的支持:1. &
65、#160; 給隊列一個名字,方便調試時辨認是哪個隊列。2. 包含調試器需要的特定信息用來定位隊列和信號量。如果你的調試器沒有上述功能,哪個這個注冊表就毫無用處,還占用的寶貴的RAM空間。configGENERATE_RUN_TIME_STATS設置是否產生運行時的統計信息,這些信息只對調試有用,會保存在RAM 中,占用RAM空間。因此,最終程序建議配置成不產生運行時統計信息。configUSE_CO_ROUTINES設置為1則包含co-routines 功能,如果包含了co-routines
66、功能,則編譯時需包含croutine.c 文件configMAX_CO_ROUTINE_PRIORITIESco-routines 可以使用的優先級的數量。configUSE_TIMERS設置為1則包含軟件定時器功能。configTIMER_TASK_PRIORITY設置軟件定時器任務的優先級。configTIMER_QUEUE_LENGTH設置軟件定時器任務中用到的命令隊列的長度。configTIMER_TASK_STACK_DEPTH設置軟件定時器任務需要的任務堆棧大小。configKERNEL_INTERRUPT_PRIORITY 和 configMAX_SYSCALL_INTERRUP
67、T_PRIORITYCortex-M3, PIC24, dsPIC, PIC32, SuperH 和 RX600 的移植代碼中會使用到 configKERNEL_INTERRUPT_PRIORITY.PIC32, RX600 和 Cortex-M系列 會使用到 configMAX_SYSCALL_INTERRUPT_PRIORITYconfigKERNEL_INTERRUPT_PRIORITY應該被設為最低優先級。對那些只定義了 configKERNEL_INTERRUPT_PRIORITY 的系統:configKERNEL_INTERRUPT_PRIORITY決定了FreeRTOS內核使用的
68、優先級。所有調用API函數的中斷的優先級都應設為這個值,不調用API函數的中斷可以設為更高的優先級。對那些定義了configKERNEL_INTERRUPT_PRIORITY 和configMAX_SYSCALL_INTERRUPT_PRIORITY的系統:configKERNEL_INTERRUPT_PRIORITY決定了FreeRTOS內核使用的優先級。configMAX_SYSCALL_INTERRUPT_PRIORITY決定了可以調用API函數的中斷的最高優先級。高于這個值的中斷處理函數不能調用任何API 函數。configASSERT宏configASSERT()的作用類似C語言標準
69、庫中的宏assert(),configASSERT() 可以幫助調試,但是定義了configASSERT()后會增加程序代碼,也會使程序變慢。以INCLUDE 開頭參數以 'INCLUDE' 開頭的宏允許我們將部分不需要的API 函數排除在編譯生成的代碼之外。這可以使內核代碼占用更少的ROM 和RAM。比如,如果代碼中需要用到 vTaskDelete 函數則這樣寫:#defineINCLUDE_vTaskDelete 1如果不需要,則這樣寫:#defineINCLUDE_vTaskDelete 0一、任務創
70、建1. xTaskCreatetask. h portBASE_TYPE xTaskCreate( pdTASK_CODE pvTaskCode,
71、; const portCHAR * const pcName,
72、60; unsigned portSHORT usStackDepth, void *pvPa
73、rameters, unsigned portBASE_TYPE uxPriority, &
74、#160; xTaskHandle *pvCreatedTask );創建新的
75、任務并添加到任務隊列中,準備運行 Parameters: pvTaskCode 指向任務的入口函數. 任務必須執行并且永不返回 (即:無限循環).pcName 描述任務的名字。主要便于調試。最大長度由configMAX_TASK_NAME_LEN.定義usStackDepth 指定任務堆棧的大小 ,堆棧能保護變量的數目- 不是字節數. 例如,如果堆棧為16位寬度,usStackDepth定義為 100, 200 字節,這些將分配給堆棧。堆棧嵌套深度(堆棧寬度)不能超
76、多最大值包含了size_t類型的變量pvParameters 指針用于作為一個參數傳向創建的任務uxPriority 任務運行時的優先級pvCreatedTask 用于傳遞一個處理引用創建的任務返回: pdPASS 是如果任務成功創建并且添加到就緒列中,另外錯誤代碼在projdefs. H文件定義2. vTaskDeletetask. h void vTaskDelete( xTaskHandle pxTask );INCLUDE_vTaskDelete必須定義為1
77、,這個函數才能可用。查看配置部分獲得更多信息。 從RTOS實時內核管理中移除任務。要刪除的任務將從就緒,封鎖,掛起,事件列表中移除。 注意:空閑任務負責釋放內核分配給已刪除任務的內存。因此,如果應用程序調用了vTaskDelete (),微控制器執行時間,空閑任務不假死是很重要的。內存分配給任務的代碼不會自動釋放,應該在任務刪除之前。 參數: pxTask 處理要刪除的任務。傳遞NULL將引起調用任務刪除二、任務控制3. vTaskDelay task. h void vTaskDel
78、ay( portTickType xTicksToDelay );INCLUDE_vTaskDelay必須設置為1,這個函數才為可用。參考配置獲得更多信息。 延時任務為已知時間片。任務被鎖住剩余的實際時間由時間片率決定。portTICK_RATE_MS常量用來用來從時間片速率(一片周期代表著分辨率)來計算實際時間。 vTaskDelay()指定一個任務希望的時間段,這個時間之后(調用vTaskDelay() )任務解鎖。例如,指定周期段為100時間片,將使任務在調用vTaskDelay()100個時間片之后解鎖。vTaskDelay(
79、)不提供一個控制周期性任務頻率的好方法,像通過代碼采取的路徑,和其他任務和中斷一樣,在調用vTaskDelay()后 影響頻率,因此任務所需的時間下一次執行。 參考 vTaskDelayUntil() ,這個交替的API函數設計了執行固定的頻率。它是指定的一個絕對時間(而不是一個相對時間)后,調用任務解鎖。 參數: xTicksToDelay 時間數量,調用任務應該鎖住的時間片周期4. vTaskDelayUntiltask. h void vTaskDelayUntil(
80、portTickType *pxPreviousWakeTime, portTickType xTimeIncrement );INCLUDE_vTaskDelayUntil 必須定義為1,此函數才能用。參考配置獲得更多信息。 延時一個任務到指定時間。這個函數用在循環任務以確保一定頻率執行。這個函數在一個重要方面上不同于vTaskDelay(),vTaskDelay() 指定的這個時間(任務希望開啟)是與vTaskDelay() 有關,而vTaskDelayUntil() 指定是一個絕對時間(任務希望開啟
81、) vTaskDelay()中斷任務從調用這個函數開始到指定時間。很難使用vTaskDelay()自身來產生一個固定的執行頻率,因為:隨著調用vTaskDelay()一個任務開啟的時間和任務下一次調用vTaskDelay()的時間,這兩者之間可能不是固定的【任務可能采取不同方式,可能通過調用,可能來自中斷,或者優先取得每次任務執行的時間】。 而vTaskDelay()指定的時間與調用這個函數相關,vTaskDelayUntil() 指定的是絕對時間(任務希望開啟的)。 應該注意:vTaskDelayUntil() 如果指定的蘇醒時間使用完,將立
82、即返回。因此,一個使用vTaskDelayUntil() 來周期性的執行的任務,如果執行周期因為任何原因(例如任務是臨時為懸掛狀態)暫停而導致任務錯過一個或多個執行周期,那么需要重新計算蘇醒時間。通過檢查像pxPreviousWakeTime可變的參數來組織當前時間片計數。然而在大多數使用中并不是必須的。 產量 portTICK_RATE_MS 用來計算時間片頻率的實時時間- 按照一個時間片周期。 參數: pxPreviousWakeTime 指定一個變量來掌握任務最后開啟的時間。這個變量在第一次使用中(參考下面的
83、例子)必須使用當前時間來初始化。在vTaskDelayUntil()中,這個變量是自動修改的 xTimeIncrement 循環周期時間。任務將在一定時間開啟(*pxPreviousWakeTime + xTimeIncrement)。使用相同的xTimeIncrement參數值,來調用vTaskDelayUntil()將使任務按固定的周期執行。5. uxTaskPriorityGettask. h unsigned portBASE_TYPE uxTaskPriorityGet( xTaskH
84、andle pxTask );設置INCLUDE_vTaskPriorityGet 為1,此函數才能用。參考配置以獲得更多信息。 獲得任務的優先級。 參數: pxTask 需要處理的任務. 當傳遞NULL時,將返回所調用任務的優先級Returns: pxTask的優先級6. vTaskPrioritySettask. h void vTaskPrioritySet( xTaskHandle pxTask, unsigned p
85、ortBASE_TYPE uxNewPriority );設置INCLUDE_vTaskPrioritySet為1,才能使用此函數。參考配置獲得更多信息。 設置任務的優先級。 如果設置的優先級高于當前執行任務的優先級,則上下文切換將在此函數返回之前發生。 參數: pxTask 需要設置優先級的任務。當傳遞NULL,將設置調用任務的優先級uxNewPriority 任務需要設置的優先級7. vTaskSuspend task. h void vTaskSuspend(
86、 xTaskHandle pxTaskToSuspend );設置INCLUDE_vTaskSuspend 為1,此函數才能使用。參考配置獲得更多信息。 掛起任務,當掛起一個任務時,不管優先級是多少,不需要占用任何微控制器處理器時間。調用vTaskSuspend不會累積即:在統一任務中調用vTaskSuspend兩次,但只需調用一次vTaskResume () 來是掛起的任務就緒。 參數: pxTaskToSuspend 處理需要掛起的任務。傳遞NULL將掛起調用此函數的任務。8. v
87、TaskResume task. h void vTaskResume( xTaskHandle pxTaskToResume );設置INCLUDE_vTaskSuspend為1,此函數才能使用。參考配置獲得更多信息。 喚醒掛起的任務。 必須是調用 vTaskSuspend () 后掛起的任務,才有可能通過調用 vTaskResume ()重新運行。 Parameters: pxTaskToResume 就緒的任務的句柄9.
88、 vTaskResumeFromISRtask. h portBASE_TYPE vTaskResumeFromISR( xTaskHandle pxTaskToResume );設置INCLUDE_vTaskSuspend和INCLUDE_xTaskResumeFromISR都為1,才能使用此函數。參考配置獲得更過信息。從ISR中喚醒掛起的任務??赡芡ㄟ^多個 調用vTaskSuspend()掛起的任務,可以通過調用 xTaskResumeFromISR()再次運行。vTaskResumeFromISR()不應該用于任務和中斷同步,因為可能會在中斷發生期間,任務已經掛起這樣導致錯過中斷。使用信號量最為同步機制將避免這種偶然性。 參數: pxTaskToResume 就緒任務的句柄Returns: pdTRUE: 如果喚醒了任務將,引起上下文切換。pdFALSE.:用于ISR確定是否上下文切換10. vTaskSetApplicationTaskTag task. h void vTaskSetApplicationTaskTag(
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 行政管理專業素養培養試題及答案
- 行政管理經濟法實戰試題及答案總結
- 2025年護士資格考試趨勢試題及答案
- 如何備考2025年文化概論考試與試題及答案
- 科學復習衛生資格考試的試題與答案
- ??平洕荚囆枰脑囶}及答案
- 衛生資格考試成功案例分析與分享試題及答案
- 行政管理經濟法考點分布試題及答案
- 藥學專業基礎試題及答案剖析
- 護理教育與臨床實踐之間的橋梁試題及答案
- 紙塑工藝知識介紹
- 高二學考動員主題班會課件
- 水溝抹灰施工方案
- 人教版八年級物理下冊 實驗題03 浮力的實驗(含答案詳解)
- spc(xbar-r-xbar-s-中位數極差3合一控制圖)
- SCARA工業機器人手臂設計
- 公路工程竣工環境保護驗收調查報告
- 第二章殘疾康復
- 三年級下冊美術說課稿-第十二課 賽龍舟 ︳湘美版
- 國家開放大學電大《建筑制圖基礎》機考網考題庫及答案
- 上海市材料工程學校教師招聘考試真題2022
評論
0/150
提交評論