FreeRTOS 入门
一、簡介
在嵌入式領域中,嵌入式實時操作系統正得到越來越廣泛的應用。采用嵌入式實時操作系統(RTOS)可以更合理、更有效地利用CPU的資源,簡化應用軟件的設計,縮短系統開發時間,更好地保證系統的實時性和可靠性。
FreeRTOS是一個迷你的實時操作系統內核。作為一個輕量級的操作系統,功能包括:任務管理、時間管理、信號量、消息隊列、內存管理、記錄功能、軟件定時器、協程等,可基本滿足較小系統的需要。
由于RTOS需占用一定的系統資源(尤其是RAM資源),只有μC/OS-II、embOS、salvo、FreeRTOS等少數實時操作系統能在小RAM單片機上運行。相對μC/OS-II、embOS等商業操作系統,FreeRTOS操作系統是完全免費的操作系統,具有源碼公開、可移植、可裁減、調度策略靈活的特點,可以方便地移植到各種單片機上運行,其最新版本為10.3.1版。
二、原理實現
任務調度機制是嵌入式實時操作系統的一個重要概念,也是其核心技術。對于可剝奪型內核,優先級高的任務一旦就緒就能剝奪優先級較低任務的CPU使用權,提高了系統的實時響應能力。不同于μC/OS-II,FreeRTOS對系統任務的數量沒有限制,既支持優先級調度算法也支持輪換調度算法,因此FreeRTOS采用雙向鏈表而不是采用查任務就緒表的方法來進行任務調度。
三、任務函數
頭文件:task.h
1、任務創建:
portBASE_TYPE xTaskCreate (
?pdTASK_CODE pvTaskCode, 指向任務的實現函數的指針。效果上僅僅是函數名
const portCHAR * const pcNane, 具有描述性的任務名。FreeRTOS 不會使用它。
?unsigned portSHORT usStackDepth, 指定任務堆棧的大小
?void *pvParameters, 指針用于作為一個參數傳向創建的任務?
?unsigned portBASE_TYPE uxPriority, 任務運行時的優先級
?xTaskHandle *pvCreatedTask 用于傳遞任務的句柄,可以引用從而對任務進行其他操作。
)
2、任務刪除:
void vTaskDelete (?
xTaskHandle pxTask 處理要刪除的任務。傳遞 NULL 將刪除自己
)
3、任務延時:
void vTaskDelay (?
?portTickType xTicksToDelay 時間數量,調用任務應該鎖住的時間片周期?
)
4、任務延遲到指定時間:
portTickType *pxPreviousWakeTime, 指定一個變量來掌握任務最后開啟的時間, 第一次使用時必須
使用當前時間來初始化, 在 vTaskDelayUntil 中,這個變量是自
動修改的
portTickType xTimeIncrement 循環周期時間
)
5、獲得任務優先級:
unsigned portBASE_TYPE uxTaskPriorityGet (?
?xTaskHandle pxTask 需要處理的任務. 當傳遞 NULL 時,將返回調用該任務的優先級?
)
6、設置任務優先級:
void vTaskPrioritySet (?
xTaskHandle pxTask , 需要設置優先級的任務。當傳遞 NULL,將設置調用任務的優先級
unsigned portBASE_TYPE uxNewPriority 任務需要設置的優先級?
)
7、掛起任務:
void vTaskSuspend (?
xTaskHandle pxTaskToSuspend 處理需要掛起的任務。傳遞 NULL 將掛起調用此函數的任務?
)?
8、喚醒掛起的任務:
portBase_TYPE vTaskResumeFromISR (?
xTaskHandle pxTaskToResum 就緒任務的句柄
)
9、從中斷喚醒掛起的任務:
portBase_TYPE vTaskResumeFromISR (?
xTaskHandle pxTaskToResum 就緒任務的句柄
)
10、為任務分配標簽值:
void vTaskSetApplicationTaskTag (
?xTaskHandle xTask , 將分配給標簽值的任務。傳遞 NULL 將分配標簽給調用的任務。
pdTASK_HOOK_CODE pxTagValue 分配給任務的標簽值 類型為 pdTASK_HOOK_CODE 允許一
個函數指針賦值給標簽,因此實際上任何值都可以分配
)
四、內核函數
頭文件:task.h
1、啟動實時內核處理:
void vTaskStartScheduler ( void );
2、停止實時內核運行:
void vTaskEndScheduler ( void );
3、掛起所有活動的實時內核,同時允許中斷:
void vTaskSuspendAll ( void );
五、隊列管理
隊列是內部通信的主要形式。它可以用于在任務和任務之間以及任務和中斷之間發送消息。
頭文件:queue.H
1、設置一個新的隊列:
xQueueHandle xQueueCreate (?
?unsigned portBASE_TYPE uxQueueLength, 隊列中包含最大項目數量
?unsigned portBASE_TYPE uxItemSize 隊列中每個項目所需的字節數
?);
?2、傳遞一個項目到隊列:
?portBASE_TYPE xQueueSend (?
?xQueueHandle xQueue, 將項目傳進的隊列
?const void * pvItemToQueue, 項目的指針【源數據】
?portTickType xTicksToWait 等待的最大時間量【時間使用滴答周期】
?);
?3、傳遞項目到一個隊列中的后面:
?portBASE_TYPE xQueueSendToBack (
?xQueueHandle xQueue, 將項目傳進的隊列
?const void * pvItemToQueue, 項目的指針【源數據】
?portTickType xTicksToWait 等待的最大時間量
?);
?4、從隊列接收一個項目:
?portBASE_TYPE xQueueReceive (?
?xQueueHandle xQueue, 發送項目的隊列句柄
?void *pvBuffer, 指向緩沖區的指針,將接收的項目被復制進去
?portTickType xTicksToWait 任務中斷并等待隊列中可用空間的最大時間
?);
?5、從中斷傳遞一個項目到隊列的后面:
?portBASE_TYPE xQueueSendFromISR (?
?xQueueHandle pxQueue, 將項目傳進的隊列
?const void *pvItemToQueue, 項目的指針【源數據】
?portBASE_TYPE *pxHigherPriorityTaskWoken 因空間數據問題被掛起的任務是否解鎖
?);
?6、從中斷傳遞項目到一個隊列中的后面:
? portBASE_TYPE xQueueSendToBackFromISR (?
?xQueueHandle pxQueue,?
?const void *pvItemToQueue,?
?portBASE_TYPE *pxHigherPriorityTaskWoken
?);
?7、從中斷傳遞一個項到隊列的前面:
portBASE_TYPE xQueueSendToFrontFromISR (
?xQueueHandle pxQueue,?
?const void *pvItemToQueue,?
?portBASE_TYPE *pxHigherPriorityTaskWoken
?);
?8、中斷時從隊列接收一個項目:
portBASE_TYPE xQueueReceiveFromISR (?
?xQueueHandle pxQueue, 發送項目的隊列句柄
?void *pvBuffer, 指向緩沖區的指針,將接收的項目被復制進去
?portBASE_TYPE *pxTaskWoken 任務將鎖住,等待隊列中的可用空間
?);
?9、為隊列命名,并加入隊列到登記管理中:
void vQueueAddToRegistry (?
?xQueueHandle xQueue, 將要添加登記的隊列句柄
?signed portCHAR *pcQueueName, 為指定的隊列命名。 僅僅是文本串,方便調試。
?);
?10、從登記管理中移除隊列:
void vQueueUnregisterQueue (?
?xQueueHandle xQueue, 從登記管理處中移出的隊列句柄
?);
總結
以上是生活随笔為你收集整理的FreeRTOS 入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hping3 应用笔记
- 下一篇: 大数据电影可视化系统