FreeRROS的模塊
- Co-routine協同程序
- Events事件
- FreeRTOS-MPU Specific
- FreeRTOS
- Kerner control內核控制
- List列表
- Queue Set隊列設置
- Queues Managment隊列管理
- Semphore/Mutexes信號量/互斥信號
- Software Timers軟件定時器
- Task Control任務控制
- Task Creation任務創建
- Task Utilities任務應用程序
- Trace描述
基於FreeRTOS API Reference 8.1.2
一、什麼事協同程序
'Co-routine'這是FreeRTOS開發組中的一個雞肋,過去是應用在小設備上,目前基本上極少使用了!但是開發組不打算刪除,但也不再優化和投入開發了!
協同程序從概念上將有點類似任務task,但個任務又有根本上的區別:
1)堆棧用量 所有的協同程序共用一個堆棧,對比task來說大大減少了RAM的需求;
2)時序和優先級 協同程序優先級時序遵從其他協同程序 ,但也可用於搶佔式任務
3)宏實現 協同程序的執行時通過宏實現的;
4)限制條件 較小的RAM需求是以嚴格的約束如何協同爲代價實現的;
二、協同程序的特點
協同程序總結:
- 協同程序共用一個堆棧,RAM佔用少;
- 重入故障少;
- 架構便捷;
- 整體的優先級依賴於其他協同程序,但總是被任務搶佔如果兩者混用的時候
- 沒有堆棧時需特殊考慮
- 限制API何處被調用;
- 協同程序只能在協同程序直接操作;
三、協同程序中的API:
- crDELAY 阻塞一個協同程序一段時間
- crQUEUE_RECEIVE 協同程序消息接收請求,類似同於任務中的消息接收請求
- crQUEUE_RECEIVE_FROM_ISR 協同程序來自中斷服務程序中消息的接收請求,類似任務中的來自中斷服務程序中消息的接收請求
- crQUEUE_SEND 協同程序消息發送,類似同於任務中的消息接收發送
- crQUEUE_SEND_FROM_ISR 協同程序從中斷服務程序中消息的發送,類似任務中的從中斷服務程序中消息的發送
- crSTART and crEND 開始和接收協同程序,分別位於每個協同程序的頭和尾
- vCoRoutineSchedule 協同程序調度,
- xCoRoutineCreate 創建協同程序
四、具體實現
crDELAY( CoRoutineHandle_t xHandle, TickType_t xTicksToDelay );延時的是當前協同程序自己
參數:xHandle 被延時的協同程序的句柄
xTickToDelay 延時的時間長度,實際時間的數值是通過配置TICK_RATE_HZ (set in FreeRTOSConfig.h)定義的,也可以通過以下計算轉換成ms.
xTickType xDelayTime = 200 / portTICK_PERIOD_MS表徵的是200ms
crQUEUE_RECEIVE(
CoRoutineHandle_t xHandle,
QueueHandle_t pxQueue,
void *pvBuffer,
TickType_t xTicksToWait,
BaseType_t *pxResult
)
參數:xHandle 接收的協同程序句柄
pxQueue 被接收消息隊列的句柄,一般是API xQueueCreate()的返回值;
pvBuffer 被接收消息隊列的緩存器,數據長度消息隊列創建時已知
xTicksToWait 等待接收消息的滴答時間數
pxResult 從消息隊列中重讀數據的結果,成功/失敗
crQUEUE_SEND_FROM_ISR(
QueueHandle_t pxQueue,
void *pvBuffer,
BaseType_t * pxCoRoutineWoken
)
參數:pxQueue 被髮送出來的消息隊列的句柄
pvBuffer 拷貝接收數據的緩存,數據長度消息隊列創建時已知
pxCoRoutineWoken 協同程序被阻塞一段時間等待消息隊列
返回:接收成功和失敗,pdTRUE 或者pdFALSE