一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

基于FreeRTOS應(yīng)用程序的數(shù)據(jù)處理

電子設(shè)計(jì) ? 來(lái)源:CSDN博主 ? 作者:小小毛 ? 2021-01-28 14:16 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

這里,我重點(diǎn)講解如何結(jié)合RTOS進(jìn)行處理數(shù)據(jù)。我們巧妙的利用了RTSO自帶的消息隊(duì)列,我們可以把每一個(gè)接收的數(shù)據(jù)看做一個(gè)消息元素。

先回顧一下知識(shí)點(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ù)接收來(lái)自其他任務(wù)或中斷的不固定長(zhǎng)度的消息。任務(wù)能夠從隊(duì)列里面讀取消息,當(dāng)隊(duì)列中的消息是空時(shí),掛起讀取任務(wù),用戶還可以指定掛起的任務(wù)時(shí)間;當(dāng)隊(duì)列中有新消息時(shí),掛起的讀取任務(wù)被喚醒并處理新消息,消息隊(duì)列是一種異步的通信方式。

隊(duì)列特性1.數(shù)據(jù)存儲(chǔ)

隊(duì)列可以保存有限個(gè)具有確定長(zhǎng)度的數(shù)據(jù)單元。隊(duì)列可以保存的最大單元數(shù)目被稱(chēng)為隊(duì)列的“深度”。在隊(duì)列創(chuàng)建時(shí)需要設(shè)定其深度和每個(gè)單元的大小。

通常情況下,隊(duì)列被作為 FIFO(先進(jìn)先出)緩沖區(qū)使用,即數(shù)據(jù)由隊(duì)列尾寫(xiě)入,從隊(duì)列首讀出。當(dāng)然,由隊(duì)列首寫(xiě)入也是可能的。

往隊(duì)列寫(xiě)入數(shù)據(jù)是通過(guò)字節(jié)拷貝把數(shù)據(jù)復(fù)制存儲(chǔ)到隊(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ì)列中寫(xiě)入了數(shù)據(jù),該任務(wù)將自動(dòng)由阻塞態(tài)轉(zhuǎn)移為就緒態(tài)。當(dāng)?shù)却臅r(shí)間超過(guò)了指定的阻塞時(shí)間,即使隊(duì)列中尚無(wú)有效數(shù)據(jù),任務(wù)也會(huì)自動(dòng)從阻塞態(tài)轉(zhuǎn)移為就緒態(tài)。

由于隊(duì)列可以被多個(gè)任務(wù)讀取,所以對(duì)單個(gè)隊(duì)列而言,也可能有多個(gè)任務(wù)處于阻塞狀態(tài)以等待隊(duì)列數(shù)據(jù)有效。這種情況下,一旦隊(duì)列數(shù)據(jù)有效,只會(huì)有一個(gè)任務(wù)會(huì)被解除阻塞,這個(gè)任務(wù)就是所有等待任務(wù)中優(yōu)先級(jí)最高的任務(wù)。而如果所有等待任務(wù)的優(yōu)先級(jí)相同,那么被解除阻塞的任務(wù)將是等待最久的任務(wù)。

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

3.寫(xiě)阻塞

與讀阻塞想反,任務(wù)也可以在寫(xiě)隊(duì)列時(shí)指定一個(gè)阻塞超時(shí)時(shí)間。這個(gè)時(shí)間是當(dāng)被寫(xiě)隊(duì)列已滿時(shí),任務(wù)進(jìn)入阻塞態(tài)以等待隊(duì)列空間有效的最長(zhǎng)時(shí)間。

由于隊(duì)列可以被多個(gè)任務(wù)寫(xiě)入,所以對(duì)單個(gè)隊(duì)列而言,也可能有多個(gè)任務(wù)處于阻塞狀態(tài)以等待隊(duì)列空間有效。這種情況下,一旦隊(duì)列空間有效,只會(huì)有一個(gè)任務(wù)會(huì)被解除阻塞,這個(gè)任務(wù)就是所有等待任務(wù)中優(yōu)先級(jí)最高的任務(wù)。而如果所有等待任務(wù)的優(yōu)先級(jí)相同,那么被解除阻塞的任務(wù)將是等待最久的任務(wù)。

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

任務(wù)或者中斷服務(wù)程序都可以給消息隊(duì)列發(fā)送消息,當(dāng)發(fā)送消息時(shí),如果隊(duì)列未滿或者允許覆蓋入隊(duì), FreeRTOS 會(huì)將消息拷貝到消息隊(duì)列隊(duì)尾,否則,會(huì)根據(jù)用戶指定的阻塞超時(shí)時(shí)間進(jìn)行阻塞,在這段時(shí)間中,如果隊(duì)列一直不允許入隊(duì),該任務(wù)將保持阻塞狀態(tài)以等待隊(duì)列允許入隊(duì)。當(dāng)其它任務(wù)從其等待的隊(duì)列中讀取入了數(shù)據(jù)(隊(duì)列未滿),該任務(wù)將自動(dòng)由阻塞態(tài)轉(zhuǎn)為就緒態(tài)。當(dāng)任務(wù)等待的時(shí)間超過(guò)了指定的阻塞時(shí)間,即使隊(duì)列中還不允許入隊(duì),任務(wù)也會(huì)自動(dòng)從阻塞態(tài)轉(zhuǎn)移為就緒態(tài),此時(shí)發(fā)送消息的任務(wù)或者中斷程序會(huì)收到一個(gè)錯(cuò)誤碼 errQUEUE_FULL。

發(fā)送緊急消息的過(guò)程與發(fā)送消息幾乎一樣,唯一的不同是,當(dāng)發(fā)送緊急消息時(shí),發(fā)送的位置是消息隊(duì)列隊(duì)頭而非隊(duì)尾,這樣,接收者就能夠優(yōu)先接收到緊急消息,從而及時(shí)進(jìn)行消息處理。

下面是消息隊(duì)列的發(fā)送API接口,函數(shù)中有FromISR則表明在中斷中使用的。

o4YBAGASVjSAdvbpAAEBNLday3g764.png

消息隊(duì)列讀取

o4YBAGASVkCAQN_fAADQPe5wf9s477.png

任務(wù)調(diào)用接收函數(shù)收取隊(duì)列消息, 函數(shù)首先判斷當(dāng)前隊(duì)列是否有未讀消息, 如果沒(méi)有, 則會(huì)判斷參數(shù) xTicksToWait, 決定直接返回函數(shù)還是阻塞等待。

如果隊(duì)列中有消息未讀, 首先會(huì)把待讀的消息復(fù)制到傳進(jìn)來(lái)的指針?biāo)竷?nèi), 然后判斷函數(shù)參數(shù) xJustPeeking == pdFALSE的時(shí)候, 符合的話, 說(shuō)明這個(gè)函數(shù)讀取了數(shù)據(jù), 需要把被讀取的數(shù)據(jù)做出隊(duì)處理, 如果不是, 則只是查看一下(peek),只是返回?cái)?shù)據(jù),但是不會(huì)把數(shù)據(jù)清除。

對(duì)于正常讀取數(shù)據(jù)的操作, 清除數(shù)據(jù)后隊(duì)列會(huì)空出空位, 所以查看隊(duì)列中的等待列表中是否有任務(wù)等發(fā)送數(shù)據(jù)而被掛起, 有的話恢復(fù)一個(gè)任務(wù)就緒, 并根據(jù)優(yōu)先級(jí)判斷是否需要出進(jìn)行任務(wù)切換。

對(duì)于只是查看數(shù)據(jù)的, 由于沒(méi)有清除數(shù)據(jù), 所以沒(méi)有空間新空出,不需要檢查發(fā)送等待鏈表, 但是會(huì)檢查接收等待鏈表, 如果有任務(wù)掛起會(huì)切換其到就緒并判斷是否需要切換。

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

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

o4YBAGASVkyAWhlTAACpQwtzoqE071.png

1. 中斷如何處理:

///《LPUART0 中斷服務(wù)函數(shù)

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); ///《清接收中斷請(qǐng)求

res = LPUart_ReceiveData(M0P_LPUART0);

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

portYIELD_FROM_ISR(xHigherPriorityTaskWoken);

}

}

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

/**

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

**

**

** \param 1 :void

** \retval void

void APP_LocalCOM_ReadData(void)

{

uint8_t temp_bytes = 0; /*隊(duì)列中字節(jié)長(zhǎng)度new*/

uint8_t cnt;

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

static TickType_t StartTick = 0;

static uint8_t ShadowBytes = 0; /*old*/

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

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

{

ShadowBytes = 0;

}

else

{

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

{

ShadowBytes = temp_bytes;

StartTick = xTaskGetTickCount();

}

else

{

if(xTaskGetTickCount() - StartTick 》 100)

{

for(cnt = 0; cnt《temp_bytes; 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)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)存儲(chǔ)

    關(guān)注

    5

    文章

    997

    瀏覽量

    51717
  • 數(shù)據(jù)處理
    +關(guān)注

    關(guān)注

    0

    文章

    627

    瀏覽量

    29152
  • FreeRTOS
    +關(guān)注

    關(guān)注

    12

    文章

    492

    瀏覽量

    64248
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    數(shù)據(jù)處理程序

    數(shù)據(jù)處理程序各子程序程序
    發(fā)表于 01-17 15:43

    數(shù)據(jù)處理問(wèn)題!

    數(shù)據(jù)處理基本包涵擬合,插值,濾波等,LabVIEW中一般處理的都是N行1列數(shù)據(jù),怎么處理N行,M列數(shù)據(jù),我現(xiàn)在需要將所有組
    發(fā)表于 05-08 22:43

    求助基于LabVIEW的數(shù)據(jù)處理程序

    我是個(gè)新手,最進(jìn)在研究基于LabVIEW的數(shù)據(jù)處理,有沒(méi)有大神指教
    發(fā)表于 03-26 21:05

    求大佬分享USART串口接收數(shù)據(jù)處理程序

    求大佬分享USART串口接收數(shù)據(jù)處理程序
    發(fā)表于 12-09 07:36

    FreeRTOS隊(duì)列創(chuàng)建任務(wù)間通信的基本應(yīng)用程序

    應(yīng)用程序 : 此代碼是 FreeRTOS 隊(duì)列創(chuàng)建任務(wù)間通信的基本應(yīng)用程序 。 BSP 版本: M480系列 BSP CMSIS V3.04.000 硬件: NuMaker-PFM-M487
    發(fā)表于 08-22 07:12

    FreeRTOS任務(wù)創(chuàng)建到閃存LED的基本應(yīng)用程序

    應(yīng)用程序 : 本代碼是 FreeRTOS 任務(wù)的基本應(yīng)用程序, 用于創(chuàng)建閃存 LED 任務(wù) 。 BSP 版本: M480系列 BSP CMSIS V3.04.000 硬件
    發(fā)表于 08-22 06:28

    FreeRTOS隊(duì)列創(chuàng)建任務(wù)間通信的基本應(yīng)用程序

    應(yīng)用程序 : 此代碼是 FreeRTOS 隊(duì)列創(chuàng)建任務(wù)間通信的基本應(yīng)用程序 。 BSP 版本: M480系列 BSP CMSIS V3.04.000 硬件: NuMaker-PFM-M487
    發(fā)表于 08-30 07:56

    用于創(chuàng)建閃存LED任務(wù)的FreeRTOS應(yīng)用程序

    應(yīng)用程序 : 本代碼是 FreeRTOS 任務(wù)的基本應(yīng)用程序, 用于創(chuàng)建閃存 LED 任務(wù) 。 BSP 版本: M480系列 BSP CMSIS V3.04.000 硬件
    發(fā)表于 08-30 07:55

    LabVIEW環(huán)境下基于數(shù)據(jù)文件讀寫(xiě)的數(shù)據(jù)處理程序設(shè)計(jì)

    針對(duì)基于LabVIEW 平臺(tái)的數(shù)據(jù)處理程序設(shè)計(jì)中,常遇到的數(shù)據(jù)文件的讀寫(xiě)及數(shù)據(jù)格式的轉(zhuǎn)換等問(wèn)題,以實(shí)測(cè)隨機(jī)振動(dòng)環(huán)境數(shù)據(jù)的功率譜密度計(jì)算
    發(fā)表于 09-03 17:44 ?50次下載

    基于Matlab的轉(zhuǎn)爐耳軸軸承狀態(tài)檢測(cè)數(shù)據(jù)處理程序的開(kāi)發(fā)

    在低速重載軸承的狀態(tài)檢測(cè)中,對(duì)測(cè)試數(shù)據(jù)的合理分析是整個(gè)測(cè)試工作中最重要、最具挑戰(zhàn)性的部分。為了便于時(shí)大量現(xiàn)場(chǎng)數(shù)據(jù)的分析,開(kāi)發(fā)了基于Madab的數(shù)據(jù)處理程序。該
    發(fā)表于 01-16 13:58 ?25次下載

    密立根油滴實(shí)驗(yàn)-數(shù)據(jù)處理C程序

    大學(xué)物理實(shí)驗(yàn)中密立根實(shí)驗(yàn)數(shù)據(jù)處理為方便大家處理復(fù)雜的實(shí)驗(yàn)數(shù)據(jù)
    發(fā)表于 11-16 17:11 ?8次下載

    網(wǎng)上錄取數(shù)據(jù)處理中重復(fù)記錄去除程序的設(shè)計(jì)_董國(guó)鋼

    網(wǎng)上錄取數(shù)據(jù)處理中重復(fù)記錄去除程序的設(shè)計(jì)_董國(guó)鋼
    發(fā)表于 03-15 11:41 ?0次下載

    Thumb數(shù)據(jù)處理指令

    Thumb數(shù)據(jù)處理指令 數(shù)據(jù)處理指令是指那些操作寄存器中數(shù)據(jù)的指令。Thumb指令集中的數(shù)據(jù)處理指令是ARM指令集數(shù)據(jù)處理指令的一個(gè)子集,其
    發(fā)表于 10-19 10:04 ?0次下載

    基于AD574模數(shù)轉(zhuǎn)換的數(shù)據(jù)處理程序設(shè)計(jì)

    本文主要介紹了基于AD574模數(shù)轉(zhuǎn)換的數(shù)據(jù)處理程序設(shè)計(jì)。通過(guò)AD574與單片機(jī)的接口電路設(shè)計(jì)以及AD574和單片機(jī)的接口數(shù)據(jù)處理程序的編程設(shè)計(jì),在模擬信號(hào)的
    發(fā)表于 12-18 17:20 ?7505次閱讀
    基于AD574模數(shù)轉(zhuǎn)換的<b class='flag-5'>數(shù)據(jù)處理</b><b class='flag-5'>程序</b>設(shè)計(jì)

    在TM4C MCU上用FreeRTOS開(kāi)發(fā)通用應(yīng)用程序應(yīng)用說(shuō)明

    電子發(fā)燒友網(wǎng)站提供《在TM4C MCU上用FreeRTOS開(kāi)發(fā)通用應(yīng)用程序應(yīng)用說(shuō)明.pdf》資料免費(fèi)下載
    發(fā)表于 09-11 14:15 ?0次下載
    在TM4C MCU上用<b class='flag-5'>FreeRTOS</b>開(kāi)發(fā)通用<b class='flag-5'>應(yīng)用程序</b>應(yīng)用說(shuō)明