女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

重點(diǎn)講解如何結(jié)合RTOS進(jìn)行處理數(shù)據(jù)

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

我們巧妙的利用了RTSO自帶的消息隊(duì)列,我們可以把每一個(gè)接收的數(shù)據(jù)看做一個(gè)消息元素。
先回顧一下知識點(diǎn):

FreeRTOS消息隊(duì)列

基于 FreeRTOS 的應(yīng)用程序由一組獨(dú)立的任務(wù)構(gòu)成——每個(gè)任務(wù)都是具有獨(dú)立權(quán)限的程序。這些獨(dú)立的任務(wù)之間的通訊與同步一般都是基于操作系統(tǒng)提供的IPC通訊機(jī)制,而FreeRTOS 中所有的通信與同步機(jī)制都是基于隊(duì)列實(shí)現(xiàn)的。
消息隊(duì)列是一種常用于任務(wù)間通信的數(shù)據(jù)結(jié)構(gòu),隊(duì)列可以在任務(wù)與任務(wù)間、中斷和任務(wù)間傳送信息,實(shí)現(xiàn)了任務(wù)接收來自其他任務(wù)或中斷的不固定長度的消息。任務(wù)能夠從隊(duì)列里面讀取消息,當(dāng)隊(duì)列中的消息是空時(shí),掛起讀取任務(wù),用戶還可以指定掛起的任務(wù)時(shí)間;當(dāng)隊(duì)列中有新消息時(shí),掛起的讀取任務(wù)被喚醒并處理新消息,消息隊(duì)列是一種異步的通信方式。

隊(duì)列特性

1.數(shù)據(jù)存儲

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

2.讀阻塞

當(dāng)某個(gè)任務(wù)試圖讀一個(gè)隊(duì)列時(shí),其可以指定一個(gè)阻塞超時(shí)時(shí)間。在這段時(shí)間中,如果隊(duì)列為空,該任務(wù)將保持阻塞狀態(tài)以等待隊(duì)列數(shù)據(jù)有效。當(dāng)其它任務(wù)或中斷服務(wù)例程往其等待的隊(duì)列中寫入了數(shù)據(jù),該任務(wù)將自動由阻塞態(tài)轉(zhuǎn)移為就緒態(tài)。當(dāng)?shù)却臅r(shí)間超過了指定的阻塞時(shí)間,即使隊(duì)列中尚無有效數(shù)據(jù),任務(wù)也會自動從阻塞態(tài)轉(zhuǎn)移為就緒態(tài)。
由于隊(duì)列可以被多個(gè)任務(wù)讀取,所以對單個(gè)隊(duì)列而言,也可能有多個(gè)任務(wù)處于阻塞狀態(tài)以等待隊(duì)列數(shù)據(jù)有效。這種情況下,一旦隊(duì)列數(shù)據(jù)有效,只會有一個(gè)任務(wù)會被解除阻塞,這個(gè)任務(wù)就是所有等待任務(wù)中優(yōu)先級最高的任務(wù)。而如果所有等待任務(wù)的優(yōu)先級相同,那么被解除阻塞的任務(wù)將是等待最久的任務(wù)。

說些題外話,ucos中是具有廣播消息的,當(dāng)有多個(gè)任務(wù)阻塞在隊(duì)列上,當(dāng)發(fā)送消息的時(shí)候可以選擇廣播消息,那么這些阻塞的任務(wù)都能被解除阻塞。

3.寫阻塞

與讀阻塞想反,任務(wù)也可以在寫隊(duì)列時(shí)指定一個(gè)阻塞超時(shí)時(shí)間。這個(gè)時(shí)間是當(dāng)被寫隊(duì)列已滿時(shí),任務(wù)進(jìn)入阻塞態(tài)以等待隊(duì)列空間有效的最長時(shí)間。
由于隊(duì)列可以被多個(gè)任務(wù)寫入,所以對單個(gè)隊(duì)列而言,也可能有多個(gè)任務(wù)處于阻塞狀態(tài)以等待隊(duì)列空間有效。這種情況下,一旦隊(duì)列空間有效,只會有一個(gè)任務(wù)會被解除阻塞,這個(gè)任務(wù)就是所有等待任務(wù)中優(yōu)先級最高的任務(wù)。而如果所有等待任務(wù)的優(yōu)先級相同,那么被解除阻塞的任務(wù)將是等待最久的任務(wù)。

消息隊(duì)列的工作流程1.發(fā)送消息

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

o4YBAGAP0tyAcqp2AABD05nzisM612.png

消息隊(duì)列讀取

o4YBAGAP0uqABC4FAAAxVSVZBSc338.png


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

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

如下的框圖來說明一下 FreeRTOS 消息隊(duì)列的實(shí)現(xiàn),讓大家有一個(gè)形象的認(rèn)識。

o4YBAGAP0viAbhHtAACALIk2QMw805.png

1. 中斷如何處理:

///

void LpUart0_IRQHandler(void)

{

BaseType_t xHigherPriorityTaskWoken = pdFALSE;

uint8_t res=0;

// if(LPUart_GetStatus(M0P_LPUART0, LPUartPE))/*奇偶檢驗(yàn)錯(cuò)誤*/

// {

// LPUart_ClrStatus(M0P_LPUART0, LPUartPE);

// }

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

{

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

res =LPUart_ReceiveData(M0P_LPUART0);

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

portYIELD_FROM_ISR(xHigherPriorityTaskWoken);

}

}

任務(wù)中接收信號,這里并不是每一條消息都接收嗎,因?yàn)闆]有空閑中斷,而是做了100ms絕對延時(shí),確保一幀數(shù)據(jù)接收完成。

/**

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

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

**

**

** \param 1 :void

** \retval void

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

void APP_LocalCOM_ReadData(void)

{

uint8_ttemp_bytes = 0; /*隊(duì)列中字節(jié)長度new*/

uint8_t cnt;

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

static TickType_t StartTick = 0;

static uint8_t ShadowBytes = 0;/*old*/

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

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

{

ShadowBytes = 0;

}

else

{

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

{

ShadowBytes = temp_bytes;

StartTick = xTaskGetTickCount();

}

else

{

if(xTaskGetTickCount() - StartTick > 100)

{

for(cnt = 0; cnt

{

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

}

protocol_parse(buff,temp_bytes);

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

}

}

}

}
編輯:hfy

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)存儲
    +關(guān)注

    關(guān)注

    5

    文章

    997

    瀏覽量

    51602
  • FreeRTOS
    +關(guān)注

    關(guān)注

    12

    文章

    487

    瀏覽量

    63714
  • 隊(duì)列
    +關(guān)注

    關(guān)注

    1

    文章

    46

    瀏覽量

    11032
收藏 人收藏

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    如何在Eclipse ThreadX RTOS中集成SystemView

    SEGGER實(shí)時(shí)軟件分析工具SystemView已經(jīng)在ThreadX v6.4.2上進(jìn)行了測試。SystemView從v3.60c版本支持Eclipse ThreadX(Azure RTOS),用戶
    的頭像 發(fā)表于 05-06 17:11 ?579次閱讀

    RTOS中的本地存儲指針使用

    本地存儲指針是RTOS中的一個(gè)重要特性,增強(qiáng)了任務(wù)管理和數(shù)據(jù)處理能力。在RTOS上下文中,本地存儲是指存儲在本地的特定任務(wù)或?qū)ο蟮?b class='flag-5'>數(shù)據(jù)。通常與任務(wù)本地存儲(Task Local Sto
    的頭像 發(fā)表于 02-28 16:33 ?826次閱讀
    <b class='flag-5'>RTOS</b>中的本地存儲指針使用

    HPLC通信與云計(jì)算的結(jié)合 HPLC通信信號處理方法

    HPLC通信與云計(jì)算的結(jié)合 HPLC通信與云計(jì)算的結(jié)合是當(dāng)前電力系統(tǒng)及物聯(lián)網(wǎng)領(lǐng)域的一個(gè)重要發(fā)展趨勢。以下是關(guān)于兩者結(jié)合的分析: 數(shù)據(jù)實(shí)時(shí)傳輸與分析 : HPLC通信技術(shù)具有高速率、低延
    的頭像 發(fā)表于 12-02 14:13 ?482次閱讀

    ASR與自然語言處理結(jié)合

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

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

    、Preempt Linux系統(tǒng)。 而其中的RISC-V屬于超高能效副核心,標(biāo)配內(nèi)存管理單元,可運(yùn)行RTOS或裸機(jī)程序。T113的主核運(yùn)行Linux(Openwrt或者Preempt Linux)進(jìn)行
    發(fā)表于 11-18 09:33

    【驅(qū)動教程】iTOP-RK3568開發(fā)板進(jìn)行講解第十三期,主要講解輸入子系統(tǒng),共計(jì)24 講

    驅(qū)動視頻全新升級,并持續(xù)更新~更全,思路更科學(xué),入門更簡單。 迅為基于iTOP-RK3568開發(fā)板進(jìn)行講解,本次更新內(nèi)容為第十三期,主要講解輸入子系統(tǒng),共計(jì)24 講。 學(xué)習(xí)鏈接 本期視頻教程已上傳至
    發(fā)表于 10-11 11:31

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

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

    RTOS正在縮小與Linux的差距

    RTOS與Linux的物聯(lián)網(wǎng)設(shè)備操作系統(tǒng)之爭已經(jīng)持續(xù)了很多年。Linux以其強(qiáng)大的計(jì)算能力和豐富的軟件生態(tài),在需要復(fù)雜處理和軟件支持的物聯(lián)網(wǎng)設(shè)備上占據(jù)一席之地;RTOS憑借實(shí)時(shí)響應(yīng)和資源節(jié)約的特性
    的頭像 發(fā)表于 09-10 08:07 ?997次閱讀
    <b class='flag-5'>RTOS</b>正在縮小與Linux的差距

    freertos和rtos區(qū)別是什么

    。RTOS 的主要特點(diǎn)是實(shí)時(shí)性、多任務(wù)處理、資源管理、中斷處理等。 FreeRTOS 是一個(gè)開源的實(shí)時(shí)操作系統(tǒng),由英
    的頭像 發(fā)表于 09-02 14:18 ?2608次閱讀

    RTOS的特性和類型

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

    RTOS開發(fā)最佳實(shí)踐

    基于RTOS編寫應(yīng)用程序時(shí),有一些要注意事項(xiàng)。在本節(jié)中,您將學(xué)習(xí)RTOS開發(fā)最佳實(shí)踐,例如POSIX合規(guī)性、安全性和功能安全認(rèn)證。
    的頭像 發(fā)表于 08-20 11:24 ?749次閱讀

    簡單認(rèn)識RTOS實(shí)時(shí)操作系統(tǒng)

    RTOS(Real Time Operating System,實(shí)時(shí)操作系統(tǒng))是一種專門設(shè)計(jì)用于在嚴(yán)格時(shí)間限制內(nèi)處理任務(wù)的操作系統(tǒng)。它以其高實(shí)時(shí)性、多任務(wù)處理能力和資源管理能力在工業(yè)自動化、醫(yī)療設(shè)備、航空航天、汽車電子等眾多領(lǐng)域
    的頭像 發(fā)表于 08-20 11:20 ?4757次閱讀

    是否可以擴(kuò)展esp_iot_rtos_sdk以具有api功能來進(jìn)行云更新?

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

    用ESP8266_RTOS_SDK進(jìn)行代碼編譯,如何更改tick數(shù)據(jù)?

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

    ESP8266_RTOS3.0串口0傳輸大量數(shù)據(jù)丟包的原因?

    傳輸數(shù)據(jù)最大1500字節(jié),使用的ESP8266_RTOS3.0,先使用的example示例中的uart_events,結(jié)果發(fā)現(xiàn)當(dāng)我向串口0發(fā)送長度大約800字節(jié)的數(shù)據(jù)時(shí),重復(fù)收到消息隊(duì)列,數(shù)據(jù)
    發(fā)表于 07-09 06:32