SAFERTOS中的流緩沖區(qū)(Stream buffer)機(jī)制,可以實(shí)現(xiàn)任務(wù)到任務(wù)或中斷到任務(wù)之間的通信。字節(jié)流是由發(fā)送方寫入緩沖區(qū),接收方讀取緩沖區(qū)數(shù)據(jù)。流緩沖區(qū)作為隊(duì)列的輕量級級替代方案,適合單讀單寫場景,寫者在流緩沖區(qū)中放置任意數(shù)量的字節(jié),讀者讀取任意數(shù)量的字節(jié)。
流緩沖區(qū)
顧名思義,存儲數(shù)據(jù)的結(jié)構(gòu)是一個先進(jìn)先出的緩沖區(qū)。通過調(diào)用xStreamBufferSend或xStreamBufferSendFromISR API寫緩沖區(qū),將數(shù)據(jù)添加到緩沖區(qū)末尾,可以使用任務(wù)通知發(fā)信號通知等待任務(wù)。
流緩沖區(qū)有一個觸發(fā)級別,其值為流緩沖區(qū)必須寫入的最小字節(jié)數(shù),因此,觸發(fā)級別值可以在1和流緩沖區(qū)的長度之間。緩沖區(qū)長度是有限的,這意味著如果從緩沖區(qū)讀操作發(fā)生得不夠快,緩沖區(qū)可能會滿。
因此,對緩沖區(qū)的寫入可以是阻塞的(非ISR函數(shù)可以阻塞),阻塞時間可以自定義??梢允褂萌蝿?wù)通知將緩沖區(qū)空閑空間通知寫任務(wù)。否則,所有數(shù)據(jù)需在阻塞時間內(nèi)發(fā)送。
大多數(shù)情況下,由于對發(fā)送數(shù)據(jù)的處理太慢(讀任務(wù)的優(yōu)先級太低,或者數(shù)據(jù)生成速度比預(yù)期的要快),緩沖區(qū)被盡可能多的字節(jié)填充,API將返回一個錯誤代碼以及寫入的數(shù)據(jù)量。
從流緩沖區(qū)中讀取數(shù)據(jù)通過調(diào)用xStreamBufferReceive或xStreamBufferReceiveFromISR完成。如果操作成功,函數(shù)返回一個狀態(tài)碼及讀取的數(shù)據(jù)。讀取數(shù)據(jù)的數(shù)量取決于流緩沖區(qū)中的可用字節(jié)數(shù)和指定數(shù)組的大小,可以指定阻塞時間(只有非ISR函數(shù)可以阻塞),如果規(guī)定的時間內(nèi)沒有數(shù)據(jù)可用,或沒有任務(wù)通知解除阻塞,則會超時。盡管發(fā)生了超時,但流緩沖區(qū)中可能有數(shù)據(jù),但不足以達(dá)到觸發(fā)級別(如果觸發(fā)級別大于1)。讀操作成功將返回可用數(shù)據(jù)。如果從滿流緩沖區(qū)中讀取數(shù)據(jù),則發(fā)送任務(wù)通知給等待寫數(shù)據(jù)但由于緩沖區(qū)滿而阻塞的任務(wù)。
圖1 Stream buffer示例
圖1的流緩沖器示例應(yīng)用是一個模數(shù)轉(zhuǎn)換器,當(dāng)數(shù)據(jù)可用時就會產(chǎn)生中斷。轉(zhuǎn)換后的數(shù)據(jù)在中斷服務(wù)程序中發(fā)送到緩沖區(qū)。然后,通知使用數(shù)據(jù)的任務(wù)從流緩沖區(qū)中讀取并處理數(shù)據(jù),如過濾數(shù)據(jù)或計(jì)算控制器步長。
消息緩沖(message buffer)
消息緩沖區(qū)建立在流緩沖區(qū)上,用于交換離散的消息。消息具有定義的長度,其長度被附加到有效負(fù)載中。這意味著當(dāng)發(fā)送10字節(jié)的消息時,消息的長度(數(shù)字10)首先添加到緩沖區(qū)中,因此接收方可以在讀取消息之前讀取該值,了解有多少字節(jié)的有效載荷。存儲消息長度的字節(jié)數(shù)是可配置的,必須預(yù)先定義,以便接收方確切地知道從緩沖區(qū)讀取多少字節(jié)以獲得下一條消息的長度。如何配置存儲消息長度的字節(jié)數(shù)取決于最大的消息長度,單個字節(jié)長度可用于最多255字節(jié)的消息,2字節(jié)長度字段可用于最多65535字節(jié)的消息。
緩沖區(qū)的大小應(yīng)考慮最大消息長度和長度字段,例如,報(bào)文長度為10字節(jié),長度字段2字節(jié),每個消息的緩沖區(qū)中占用12字節(jié)。
在SAFERTOS中,流緩沖區(qū)和消息緩沖區(qū)使用相同的API函數(shù)。為了區(qū)分兩者,在StreamBuffer結(jié)構(gòu)體中使用了一個額外的標(biāo)志,在創(chuàng)建流/消息緩沖區(qū)時指定。API函數(shù)的行為略有不同。
使用流緩沖區(qū)時,如果指定了阻塞時間(只有非ISR函數(shù)可以阻塞),讀取和寫入操作可以阻塞。消息緩沖區(qū)的行為與流緩沖區(qū)相似。如果消息緩沖區(qū)中沒有消息,則消息緩沖區(qū)的讀取操作將被阻塞,任務(wù)將阻塞,直到阻塞時間到或足夠的數(shù)據(jù)被發(fā)送到消息緩沖區(qū)。因?yàn)橄⒉粫糠职l(fā)送,對于消息緩沖區(qū),在大多數(shù)情況下觸發(fā)級別為1字節(jié)是最有用的,單個字節(jié)消息將解除等待任務(wù)阻塞。
如果緩沖區(qū)不夠用,寫操作就會阻塞,直到足夠的字節(jié)/消息從緩沖區(qū)中讀取,或阻塞時間超時。
圖2 stream buffer序列
多核應(yīng)用
流緩沖區(qū)和消息緩沖區(qū)也可以將在一個核上數(shù)據(jù)發(fā)送到另一個核上執(zhí)行的任務(wù)/中斷中。在非對稱多處理器配置中,每個處理器運(yùn)行自己的RTOS實(shí)例。為了在核間共享數(shù)據(jù),必須使用共享內(nèi)存保存流緩沖區(qū)數(shù)據(jù)。
為了通知讀核有新的數(shù)據(jù)產(chǎn)生,可以使用從一個核到另一個核的中斷。
SAFERTOS API有多個函數(shù)處理多核流緩沖區(qū)的使用,但核心功能很大程度上依賴于處理器體系結(jié)構(gòu)。因此這些函數(shù)為弱定義的樁,必須由應(yīng)用程序?qū)崿F(xiàn)特定于核的功能。
要通知讀核一個緩沖區(qū)寫入完成,可以使用API函數(shù)vStreamBufferSendCompletedMulticore和vStreamBufferSendCompletedFromISRMulticore。如果另一個核上的任務(wù)試圖從空的流/消息緩沖區(qū)中讀取數(shù)據(jù)并等待數(shù)據(jù)發(fā)送,則調(diào)用這些函數(shù)。使用這些函數(shù)來代替單核場景中的任務(wù)通知,并且可以觸發(fā)等待核的中斷,從而解除等待讀取任務(wù)的阻塞。
使用vStreamBufferReceiveCompletedMulticore和StreamBufferReceiveCompletedFromISRMulticore函數(shù)通知寫核可用的緩沖區(qū)空間。如果另一個核上的任務(wù)試圖寫滿的緩沖區(qū)并等待發(fā)送數(shù)據(jù),則調(diào)用這些函數(shù)。使用這些函數(shù)來代替單核場景中的任務(wù)通知,并且可以觸發(fā)等待核的中斷,從而解除等待寫入任務(wù)的阻塞。
多核應(yīng)用的一個重要方面是對流/消息緩沖區(qū)數(shù)據(jù)訪問的協(xié)調(diào)。在單核設(shè)備上,一次只能有一個任務(wù)或中斷處于活動狀態(tài),如果一個任務(wù)需要訪問數(shù)據(jù)結(jié)構(gòu)而不被中斷,它可以在臨界區(qū)內(nèi)操作。當(dāng)多個核同時處于活動狀態(tài)時,必須防止對共享數(shù)據(jù)結(jié)構(gòu)的并行訪問。因此,必須使用鎖定機(jī)制來確保核對緩沖區(qū)數(shù)據(jù)結(jié)構(gòu)的獨(dú)占訪問。SAFERTOS提供xStreamBufferAttemptToLock和vStreamBufferReleaseLock函數(shù)實(shí)現(xiàn)此功能。這些函數(shù)也是弱定義的樁,應(yīng)用程序必須基于特定于處理器的實(shí)現(xiàn)來協(xié)調(diào)訪問。
圖3 多核示例系統(tǒng)
基于流緩沖區(qū)機(jī)制可以實(shí)現(xiàn)任務(wù)間實(shí)時數(shù)據(jù)處理,有效地管理任務(wù)之間的數(shù)據(jù)流,確保RTOS應(yīng)用程序中的高效通信和同步。
麥克泰技術(shù)是安全預(yù)認(rèn)證操作系統(tǒng)SAFERTOS在中國的代理商,具有超過20年嵌入式實(shí)時操作系統(tǒng)和功能安全軟件服務(wù)的市場、服務(wù)和培訓(xùn)經(jīng)驗(yàn),聯(lián)系info@bmrtech.com。
-
控制器
+關(guān)注
關(guān)注
114文章
16838瀏覽量
182289 -
嵌入式
+關(guān)注
關(guān)注
5125文章
19438瀏覽量
313199 -
模數(shù)轉(zhuǎn)換器
+關(guān)注
關(guān)注
26文章
3273瀏覽量
127761 -
RTOS
+關(guān)注
關(guān)注
24文章
837瀏覽量
120587 -
Stream
+關(guān)注
關(guān)注
0文章
21瀏覽量
8080
原文標(biāo)題:RTOS的Stream buffer通信機(jī)制
文章出處:【微信號:麥克泰技術(shù),微信公眾號:麥克泰技術(shù)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
FreeRTOS進(jìn)階使用之流緩沖區(qū):高效處理字節(jié)流的秘密武器
基于狀態(tài)圖的緩沖區(qū)溢出攻擊分析
Windows緩沖區(qū)溢出攻擊的實(shí)例研究
緩沖區(qū)溢出攻擊的防護(hù)技術(shù)分析
清除鍵盤緩沖區(qū)原理
環(huán)形緩沖區(qū)的實(shí)現(xiàn)原理

緩沖區(qū)是啥意思 STM32串口數(shù)據(jù)接收之環(huán)形緩沖區(qū)
STM32串口數(shù)據(jù)接收 --環(huán)形緩沖區(qū)

消除IoT上的緩沖區(qū)溢出漏洞

消除物聯(lián)網(wǎng)上的緩沖區(qū)溢出漏洞
環(huán)形緩沖區(qū)的實(shí)現(xiàn)思路
C++環(huán)形緩沖區(qū)設(shè)計(jì)與實(shí)現(xiàn)

評論