1. RTOS核心
RTOS 系統的核心就是任務管理,FreeRTOS 也不例外,上手 RTOS 系統首先必須掌握的也是任務的創建、洗掉、掛起和恢復等操作,
2. 任務堆疊
FreeRTOS 之所以能正確的恢復一個任務的運行就是因為有任務堆疊在保駕護航,任務調度器在進行任務切換的時候會將當前任務的現場(CPU 暫存器值等)保存在此任務的任務堆疊中,等到此任務下次運行的時候就會先用堆疊中保存的值來恢復現場,恢復現場以后任務就會接著從上次中斷的地方開始運行,
3. 空閑任務
呼叫函式 vTaskStartScheduler()開啟任務調度器,此函式會創建一個名為“IDLE”的任務,這個任務叫做空閑任務(空閑的時候運行的任務),也就是系統中其他的任務由于各種原因不能運行的時候空閑任務就在運行,空閑任務是 FreeRTOS 系統自動創建的,不需要用戶手動創建,
空閑任務使用最低優先級,如果應用中有其他高優先級任務處于就緒態的話這個空閑任務就不會跟高優先級的任務搶占 CPU 資源,
空閑任務還有另外一個重要的職責,判斷系統是否有任務洗掉,如果有的話就在空閑任務中釋放被洗掉任務的任務堆疊和任務控制塊的記憶體,除此以外空閑任務就沒有什么特別重要的功能了,所以可以根據實際情況減少空閑任務使用 CPU 的時間(比如,當 CPU 運行空閑任務的時候使處理器進入低功耗模式),
3. FreeRTOS和UCOS對比
3.1 freertos的使用方法:
main()
{
//初始化時鐘、串口、HAL庫等等
//創建開始任務
//開啟任務調度
}
開始任務的任務函式()
{
//進入臨界區
//創建N個任務
//洗掉開始任務
//退出臨界區
}
//創建開始任務
xTaskCreate((TaskFunction_t )start_task, //任務函式
(const char* )"start_task", //任務名稱
(uint16_t )START_STK_SIZE, //任務堆疊大小
(void* )NULL, //傳遞給任務函式的引數
(UBaseType_t )START_TASK_PRIO, //任務優先級
(TaskHandle_t* )&StartTask_Handler); //任務句柄
3.2 ucos的使用方法:
main()
{
//初始化時鐘、串口、HAL庫等等,[初始化OS]
//創建開始任務
//開啟ucos
}
開始任務的任務函式()
{
//進入臨界區
//創建N個任務
//洗掉開始任務
//退出臨界區
}
//創建開始任務
OSTaskCreate((OS_TCB* )&StartTaskTCB, //任務控制塊
(CPU_CHAR* )"start task", //任務名字
(OS_TASK_PTR )start_task, //任務函式
(void* )0, //傳遞給任務函式的引數
(OS_PRIO )START_TASK_PRIO, //任務優先級
(CPU_STK* )&START_TASK_STK[0], //任務堆疊基地址
(CPU_STK_SIZE )START_STK_SIZE/10, //任務堆疊深度限位
(CPU_STK_SIZE )START_STK_SIZE, //任務堆疊大小
(OS_MSG_QTY )0, //任務內部訊息佇列能夠接收的最大訊息數目,為0時禁止接收訊息
(OS_TICK )0, //當使能時間片輪轉時的時間片長度,為0時為默認長度
(void* )0, //用戶補充的存盤區
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR|OS_OPT_TASK_SAVE_FP,(OS_ERR* )&err); //存放該函式錯誤時的回傳值
4. 驅動
RTOS中對drivers的使用,采用直接呼叫的方法(函式名呼叫),而不是和Linux一樣有套復雜的注冊、匹配步驟,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/286469.html
標籤:其他
