chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

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

? 來源:面包板社區(qū) ? 作者:小小毛 ? 2021-02-09 09:15 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

FreeRTOS消息隊列

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

隊列特性

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

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

2.讀阻塞

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

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

3.寫阻塞

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

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

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

o4YBAGAP0tyAcqp2AABD05nzisM612.png

消息隊列讀取

o4YBAGAP0uqABC4FAAAxVSVZBSc338.png


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

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

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

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)) ///接收數(shù)據(jù)中斷

{

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

res =LPUart_ReceiveData(M0P_LPUART0);

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

portYIELD_FROM_ISR(xHigherPriorityTaskWoken);

}

}

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

/**

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

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

**

**

** \param 1 :void

** \retval void

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

void APP_LocalCOM_ReadData(void)

{

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

uint8_t cnt;

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

static TickType_t StartTick = 0;

static uint8_t ShadowBytes = 0;/*old*/

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

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

{

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)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 數(shù)據(jù)存儲
    +關(guān)注

    關(guān)注

    5

    文章

    1014

    瀏覽量

    52506
  • FreeRTOS
    +關(guān)注

    關(guān)注

    14

    文章

    497

    瀏覽量

    66292
  • 隊列
    +關(guān)注

    關(guān)注

    1

    文章

    46

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

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

    學(xué)習(xí)RTOS的意義?

    對于嵌入式軟件工程師,學(xué)習(xí)RTOS非常有必要。 1. 項目需要 隨著產(chǎn)品要實現(xiàn)的功能越來越多,單純的裸機系統(tǒng)已經(jīng)不能完美地解決問題,反而會使編程變得更加復(fù)雜,如果想降低編程的難度,就必須引入
    發(fā)表于 11-27 08:16

    嵌入式需要掌握哪些核心技能?

    嵌入式需要掌握哪些核心技能? 若想通過學(xué)習(xí)嵌入式技術(shù)提升就業(yè)競爭力,需重點掌握C語言、嵌入式硬件架構(gòu)、RTOS/Linux開發(fā)、通信協(xié)議四大核心技能,并結(jié)合行業(yè)需求積累項目經(jīng)驗。 以下為具體分析
    發(fā)表于 10-21 16:25

    請問編譯純rtos到底是選擇Linux+rtos的sdk編譯only rtos還是直接使用rtos sdk?

    編譯純rtos到底是選擇Linux+rtos的sdk編譯only rtos還是直接使用rtos sdk?
    發(fā)表于 07-11 07:22

    rtosrtos&amp;linux能否調(diào)整連接windows后的設(shè)備名稱?

    rtosrtos&amp;linux 能否調(diào)整連接windows后的設(shè)備名稱
    發(fā)表于 05-14 06:19

    程序設(shè)計與數(shù)據(jù)結(jié)構(gòu)

    的地址)出發(fā),采用推導(dǎo)的方式,深入淺出的分析了廣大C程序員學(xué)習(xí)和開發(fā)中遇到的難點。 2. 從方法論的高度對C語言在數(shù)據(jù)結(jié)構(gòu)和算法方面的應(yīng)用進行了深入講解和闡述。 3. 講解了絕大多
    發(fā)表于 05-13 16:45

    如何在Eclipse ThreadX RTOS中集成SystemView

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

    RTOS如何在FX3中工作?

    大家好, 我正在使用 FX3 進行一個項目。 我想知道 RTOS 調(diào)度是如何工作的。 我知道調(diào)用“CyU3PKernelEntry();”后 RTOS 就會開始工作。 如果我只注冊一個應(yīng)用程序線程。 我的線程什么時候執(zhí)行?
    發(fā)表于 05-06 13:20

    詳解RTOS中的Hook函數(shù)

    Hook函數(shù)是RTOS中的一個關(guān)鍵特性,通過該函數(shù),用戶可以增強對任務(wù)管理的控制,定義系統(tǒng)行為。
    的頭像 發(fā)表于 03-24 16:14 ?814次閱讀

    實現(xiàn)工業(yè)設(shè)備實時控制和聯(lián)網(wǎng)的微處理器RZ/T1數(shù)據(jù)手冊

    進行明確的實時響應(yīng)處理,無需通過高速緩沖存儲器即可實現(xiàn)從 CPU 的高速訪問, 內(nèi)置的瑞薩電子R-IN 引擎的 RZ/T1 設(shè)備是工業(yè)以太網(wǎng)通信的加速器,可通過硬件 RTOS(HW-RTOS
    的頭像 發(fā)表于 03-13 17:53 ?818次閱讀
    實現(xiàn)工業(yè)設(shè)備實時控制和聯(lián)網(wǎng)的微<b class='flag-5'>處理</b>器RZ/T1<b class='flag-5'>數(shù)據(jù)</b>手冊

    RTOS中的本地存儲指針使用

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

    如何使用DMA進行USART不定長度接收

    在上一講中,我們對USART進行了簡單介紹,并講解了如何在不使用DMA的情況下進行不定長度數(shù)據(jù)接收,本講將著重講解如何使用DMA
    的頭像 發(fā)表于 02-18 17:01 ?1334次閱讀
    如何使用DMA<b class='flag-5'>進行</b>USART不定長度接收

    如何在STM32CubeMX中集成Flexible Safety RTOS

    使用STM32處理器的用戶,可以通過STM32Cube工具生成基礎(chǔ)工程,免費評估功能安全操作系統(tǒng)Flexible Safety RTOS二進制庫了。
    的頭像 發(fā)表于 01-17 11:31 ?2234次閱讀
    如何在STM32CubeMX中集成Flexible Safety <b class='flag-5'>RTOS</b>

    Flexible Safety RTOS的技術(shù)特征

    Embedded Office的Flexible Safety RTOS是專為具有嚴格功能安全要求的嵌入式系統(tǒng)量身定制的、先進的實時操作系統(tǒng)。該RTOS專為工業(yè)自動化、汽車、鐵路和醫(yī)療設(shè)備等行業(yè)而設(shè)
    的頭像 發(fā)表于 01-07 11:29 ?981次閱讀

    使用 RISC-V 進行高效數(shù)據(jù)處理的方法

    使用RISC-V進行高效數(shù)據(jù)處理的方法涉及多個方面,包括處理器內(nèi)核與DSA(領(lǐng)域特定加速器)之間的通信優(yōu)化、內(nèi)存管理優(yōu)化、多線程性能提升等。以下是一些具體的方法: 一、處理器內(nèi)核與DS
    的頭像 發(fā)表于 12-11 17:52 ?1544次閱讀

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

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