FreeRTOS學習——協同程序

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

發佈了19 篇原創文章 · 獲贊 14 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章