色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

重點講解如何結合RTOS進行處理數據

454398 ? 來源:面包板社區 ? 作者:小小毛 ? 2021-02-09 09:15 ? 次閱讀

我們巧妙的利用了RTSO自帶的消息隊列,我們可以把每一個接收的數據看做一個消息元素。
先回顧一下知識點:

FreeRTOS消息隊列

基于 FreeRTOS 的應用程序由一組獨立的任務構成——每個任務都是具有獨立權限的程序。這些獨立的任務之間的通訊與同步一般都是基于操作系統提供的IPC通訊機制,而FreeRTOS 中所有的通信與同步機制都是基于隊列實現的。
消息隊列是一種常用于任務間通信的數據結構,隊列可以在任務與任務間、中斷和任務間傳送信息,實現了任務接收來自其他任務或中斷的不固定長度的消息。任務能夠從隊列里面讀取消息,當隊列中的消息是空時,掛起讀取任務,用戶還可以指定掛起的任務時間;當隊列中有新消息時,掛起的讀取任務被喚醒并處理新消息,消息隊列是一種異步的通信方式。

隊列特性

1.數據存儲

隊列可以保存有限個具有確定長度的數據單元。隊列可以保存的最大單元數目被稱為隊列的“深度”。在隊列創建時需要設定其深度和每個單元的大小。
通常情況下,隊列被作為 FIFO(先進先出)緩沖區使用,即數據由隊列尾寫入,從隊列首讀出。當然,由隊列首寫入也是可能的。
往隊列寫入數據是通過字節拷貝把數據復制存儲到隊列中;從隊列讀出數據使得把隊列中的數據拷貝刪除。

2.讀阻塞

當某個任務試圖讀一個隊列時,其可以指定一個阻塞超時時間。在這段時間中,如果隊列為空,該任務將保持阻塞狀態以等待隊列數據有效。當其它任務或中斷服務例程往其等待的隊列中寫入了數據,該任務將自動由阻塞態轉移為就緒態。當等待的時間超過了指定的阻塞時間,即使隊列中尚無有效數據,任務也會自動從阻塞態轉移為就緒態。
由于隊列可以被多個任務讀取,所以對單個隊列而言,也可能有多個任務處于阻塞狀態以等待隊列數據有效。這種情況下,一旦隊列數據有效,只會有一個任務會被解除阻塞,這個任務就是所有等待任務中優先級最高的任務。而如果所有等待任務的優先級相同,那么被解除阻塞的任務將是等待最久的任務。

說些題外話,ucos中是具有廣播消息的,當有多個任務阻塞在隊列上,當發送消息的時候可以選擇廣播消息,那么這些阻塞的任務都能被解除阻塞。

3.寫阻塞

與讀阻塞想反,任務也可以在寫隊列時指定一個阻塞超時時間。這個時間是當被寫隊列已滿時,任務進入阻塞態以等待隊列空間有效的最長時間。
由于隊列可以被多個任務寫入,所以對單個隊列而言,也可能有多個任務處于阻塞狀態以等待隊列空間有效。這種情況下,一旦隊列空間有效,只會有一個任務會被解除阻塞,這個任務就是所有等待任務中優先級最高的任務。而如果所有等待任務的優先級相同,那么被解除阻塞的任務將是等待最久的任務。

消息隊列的工作流程1.發送消息

任務或者中斷服務程序都可以給消息隊列發送消息,當發送消息時,如果隊列未滿或者允許覆蓋入隊, FreeRTOS 會將消息拷貝到消息隊列隊尾,否則,會根據用戶指定的阻塞超時時間進行阻塞,在這段時間中,如果隊列一直不允許入隊,該任務將保持阻塞狀態以等待隊列允許入隊。當其它任務從其等待的隊列中讀取入了數據(隊列未滿),該任務將自動由阻塞態轉為就緒態。當任務等待的時間超過了指定的阻塞時間,即使隊列中還不允許入隊,任務也會自動從阻塞態轉移為就緒態,此時發送消息的任務或者中斷程序會收到一個錯誤碼 errQUEUE_FULL。
發送緊急消息的過程與發送消息幾乎一樣,唯一的不同是,當發送緊急消息時,發送的位置是消息隊列隊頭而非隊尾,這樣,接收者就能夠優先接收到緊急消息,從而及時進行消息處理。
下面是消息隊列的發送API接口,函數中有FromISR則表明在中斷中使用的。

o4YBAGAP0tyAcqp2AABD05nzisM612.png

消息隊列讀取

o4YBAGAP0uqABC4FAAAxVSVZBSc338.png


任務調用接收函數收取隊列消息, 函數首先判斷當前隊列是否有未讀消息, 如果沒有, 則會判斷參數 xTicksToWait, 決定直接返回函數還是阻塞等待。
如果隊列中有消息未讀, 首先會把待讀的消息復制到傳進來的指針所指內, 然后判斷函數參數 xJustPeeking == pdFALSE的時候, 符合的話, 說明這個函數讀取了數據, 需要把被讀取的數據做出隊處理, 如果不是, 則只是查看一下(peek),只是返回數據,但是不會把數據清除。
對于正常讀取數據的操作, 清除數據后隊列會空出空位, 所以查看隊列中的等待列表中是否有任務等發送數據而被掛起, 有的話恢復一個任務就緒, 并根據優先級判斷是否需要出進行任務切換。
對于只是查看數據的, 由于沒有清除數據, 所以沒有空間新空出,不需要檢查發送等待鏈表, 但是會檢查接收等待鏈表, 如果有任務掛起會切換其到就緒并判斷是否需要切換。

接下來,我們可以從中斷再到任務這樣一個流程去編寫代碼:

如下的框圖來說明一下 FreeRTOS 消息隊列的實現,讓大家有一個形象的認識。

o4YBAGAP0viAbhHtAACALIk2QMw805.png

1. 中斷如何處理:

///

void LpUart0_IRQHandler(void)

{

BaseType_t xHigherPriorityTaskWoken = pdFALSE;

uint8_t res=0;

// if(LPUart_GetStatus(M0P_LPUART0, LPUartPE))/*奇偶檢驗錯誤*/

// {

// LPUart_ClrStatus(M0P_LPUART0, LPUartPE);

// }

if(LPUart_GetStatus(M0P_LPUART0, LPUartRC)) ///接收數據中斷

{

LPUart_ClrStatus(M0P_LPUART0, LPUartRC); ///<清接收中斷請求? ?? ???

res =LPUart_ReceiveData(M0P_LPUART0);

xQueueSendFromISR(usart_Queue,(void *) &res,&xHigherPriorityTaskWoken);

portYIELD_FROM_ISR(xHigherPriorityTaskWoken);

}

}

任務中接收信號,這里并不是每一條消息都接收嗎,因為沒有空閑中斷,而是做了100ms絕對延時,確保一幀數據接收完成。

/**

***********************************************************************

** \brief 2400波特率:'100ms = 24bytes'

**

**

** \param 1 :void

** \retval void

***********************************************************************/

void APP_LocalCOM_ReadData(void)

{

uint8_ttemp_bytes = 0; /*隊列中字節長度new*/

uint8_t cnt;

static uint8_tbuff[QueueSIZE] = {0}; /*暫存接收協議,從0x68開始,用于crc計算*/

static TickType_t StartTick = 0;

static uint8_t ShadowBytes = 0;/*old*/

temp_bytes = uxQueueMessagesWaiting(usart_Queue);//檢查消息數

if(temp_bytes == 0)//檢查隊列的長度

{

ShadowBytes = 0;

}

else

{

if(ShadowBytes != temp_bytes)//有新的數據

{

ShadowBytes = temp_bytes;

StartTick = xTaskGetTickCount();

}

else

{

if(xTaskGetTickCount() - StartTick > 100)

{

for(cnt = 0; cnt

{

xQueueReceive(usart_Queue,(void*)&buff[cnt%QueueSIZE],(TickType_t)100);//接收數據

}

protocol_parse(buff,temp_bytes);

//BSP_UARTx_SendBytes(M0P_UART0,temp_bytes, buff); //test

}

}

}

}
編輯:hfy

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據存儲
    +關注

    關注

    5

    文章

    977

    瀏覽量

    50955
  • FreeRTOS
    +關注

    關注

    12

    文章

    484

    瀏覽量

    62226
  • 隊列
    +關注

    關注

    1

    文章

    46

    瀏覽量

    10921
收藏 人收藏

    評論

    相關推薦

    HPLC通信與云計算的結合 HPLC通信信號處理方法

    HPLC通信與云計算的結合 HPLC通信與云計算的結合是當前電力系統及物聯網領域的一個重要發展趨勢。以下是關于兩者結合的分析: 數據實時傳輸與分析 : HPLC通信技術具有高速率、低延
    的頭像 發表于 12-02 14:13 ?164次閱讀

    ASR與自然語言處理結合

    。以下是對ASR與自然語言處理結合的分析: 一、ASR與NLP的基本概念 ASR(自動語音識別) : 專注于將人類的語音轉換為文字。 涉及從聲音信號中提取特征,并將這些特征映射到文本。 NLP(自然語言處理) : 涉及理解和解釋
    的頭像 發表于 11-18 15:19 ?449次閱讀

    全志T113雙核異構處理器的使用基于Tina Linux5.0——RTOS簡介

    、Preempt Linux系統。 而其中的RISC-V屬于超高能效副核心,標配內存管理單元,可運行RTOS或裸機程序。T113的主核運行Linux(Openwrt或者Preempt Linux)進行
    發表于 11-18 09:33

    【驅動教程】iTOP-RK3568開發板進行講解第十三期,主要講解輸入子系統,共計24 講

    驅動視頻全新升級,并持續更新~更全,思路更科學,入門更簡單。 迅為基于iTOP-RK3568開發板進行講解,本次更新內容為第十三期,主要講解輸入子系統,共計24 講。 學習鏈接 本期視頻教程已上傳至
    發表于 10-11 11:31

    處理器SDK RTOS定制:修改板庫以更改UART實例

    電子發燒友網站提供《處理器SDK RTOS定制:修改板庫以更改UART實例.pdf》資料免費下載
    發表于 10-11 09:53 ?0次下載
    <b class='flag-5'>處理</b>器SDK <b class='flag-5'>RTOS</b>定制:修改板庫以更改UART實例

    RTOS正在縮小與Linux的差距

    RTOS與Linux的物聯網設備操作系統之爭已經持續了很多年。Linux以其強大的計算能力和豐富的軟件生態,在需要復雜處理和軟件支持的物聯網設備上占據一席之地;RTOS憑借實時響應和資源節約的特性
    的頭像 發表于 09-10 08:07 ?796次閱讀
    <b class='flag-5'>RTOS</b>正在縮小與Linux的差距

    freertos和rtos區別是什么

    RTOS 的主要特點是實時性、多任務處理、資源管理、中斷處理等。 FreeRTOS 是一個開源的實時操作系統,由英
    的頭像 發表于 09-02 14:18 ?1340次閱讀

    RTOS的特性和類型

    實時操作系統(RTOS)是一種可運行實時計算應用程序的軟件平臺,用于處理具有明確時間約束的事件和數據。與通用操作系統(GPOS)不同,RTOS必須在有限的硬件資源上調度應用程序之間的
    的頭像 發表于 08-20 11:29 ?621次閱讀

    RTOS開發最佳實踐

    基于RTOS編寫應用程序時,有一些要注意事項。在本節中,您將學習RTOS開發最佳實踐,例如POSIX合規性、安全性和功能安全認證。
    的頭像 發表于 08-20 11:24 ?472次閱讀

    簡單認識RTOS實時操作系統

    RTOS(Real Time Operating System,實時操作系統)是一種專門設計用于在嚴格時間限制內處理任務的操作系統。它以其高實時性、多任務處理能力和資源管理能力在工業自動化、醫療設備、航空航天、汽車電子等眾多領域
    的頭像 發表于 08-20 11:20 ?2917次閱讀

    是否可以擴展esp_iot_rtos_sdk以具有api功能來進行云更新?

    是否可以擴展esp_iot_rtos_sdk以具有 api 功能來進行云更新?SDK 編程指南(盡管我認為它不適用于 rtos sdk)表明存在
    發表于 07-15 08:19

    用ESP8266_RTOS_SDK進行代碼編譯,如何更改tick數據

    我用ESP8266_RTOS_SDK進行代碼編譯,可以正常工作,但是感覺os的tick太長,默認是10ms調度一次。我嘗試修改宏定義configTICK_RATE_HZ,并且重新編譯了庫文件libfreerots.a,但是程序運行后,tick并沒有改變,請問我該怎么做?
    發表于 07-10 08:16

    ESP8266_RTOS3.0串口0傳輸大量數據丟包的原因?

    傳輸數據最大1500字節,使用的ESP8266_RTOS3.0,先使用的example示例中的uart_events,結果發現當我向串口0發送長度大約800字節的數據時,重復收到消息隊列,數據
    發表于 07-09 06:32

    基于RTOS的應用進程中的典型線程

    RTOS中的關鍵因素是最小的中斷延遲和最小的線程切換延遲。RTOS的價值在于它的響應速度或可預測性,而不是它在給定時間段內可以執行的工作量。
    發表于 03-05 09:32 ?654次閱讀
    基于<b class='flag-5'>RTOS</b>的應用進程中的典型線程

    請問RTOS USBSetuPcb回調函數是在中斷還是單獨線程中處理的?

    解決這個問題,我需要知道的是:USBsetuPcb 是如何處理的。 - > 在處理 USB Setup 請求時,我的 RTOS AppThread 是否中斷(并停止了? 還是在 RTO
    發表于 02-23 06:10
    主站蜘蛛池模板: 99久久久国产精品免费调教| 99热在线精品免费全部my| 伊人网综合| 国内精品七七久久影院| 日本美女靠逼| 高清一区二区亚洲欧美日韩| 老头扒开粉缝亲我下面| 亚洲欧美一区二区三区蜜芽| 国产日韩成人内射视频| 无人在线观看免费高清视频播放| 高清日本片免费观看| 日本久久中文字幕精品| NANANA在线观看高清影院| 男人J桶进男人屁股过程| 91嫩草国产在线观看免费| 老年日本老年daddy| 2022国产麻豆剧传媒剧情| 嫩草影院永久在线一二三四| vivoe另类| 午夜DV内射一区区| 韩国hd高清xxx| 中文无码热在线视频| 欧美特级午夜一区二区三区| 99久久久久亚洲AV无码| 色cccwww| 含羞草国产亚洲精品岁国产精品| 一本之道高清视频在线观看| 在线看片成人免费视频| 牛牛在线(正)精品视频| 纯肉无码AV在线看免费看| 亚洲 欧美 制服 校园 动漫| 久久66热在线视频精品| 91视频3p| 无码乱人伦一区二区亚洲| 久久婷婷国产五月综合色啪最新 | 东北老妇xxxxhd| 亚洲高清在线视频| 久久机热免费视频| qvod在线观看| 亚洲一区在线视频观看| 欧美午夜特黄AAAAAA片|