SAFERTOS中的流緩沖區(Stream buffer)機制,可以實現任務到任務或中斷到任務之間的通信。字節流是由發送方寫入緩沖區,接收方讀取緩沖區數據。流緩沖區作為隊列的輕量級級替代方案,適合單讀單寫場景,寫者在流緩沖區中放置任意數量的字節,讀者讀取任意數量的字節。
流緩沖區
顧名思義,存儲數據的結構是一個先進先出的緩沖區。通過調用xStreamBufferSend或xStreamBufferSendFromISR API寫緩沖區,將數據添加到緩沖區末尾,可以使用任務通知發信號通知等待任務。
流緩沖區有一個觸發級別,其值為流緩沖區必須寫入的最小字節數,因此,觸發級別值可以在1和流緩沖區的長度之間。緩沖區長度是有限的,這意味著如果從緩沖區讀操作發生得不夠快,緩沖區可能會滿。
因此,對緩沖區的寫入可以是阻塞的(非ISR函數可以阻塞),阻塞時間可以自定義。可以使用任務通知將緩沖區空閑空間通知寫任務。否則,所有數據需在阻塞時間內發送。
大多數情況下,由于對發送數據的處理太慢(讀任務的優先級太低,或者數據生成速度比預期的要快),緩沖區被盡可能多的字節填充,API將返回一個錯誤代碼以及寫入的數據量。
從流緩沖區中讀取數據通過調用xStreamBufferReceive或xStreamBufferReceiveFromISR完成。如果操作成功,函數返回一個狀態碼及讀取的數據。讀取數據的數量取決于流緩沖區中的可用字節數和指定數組的大小,可以指定阻塞時間(只有非ISR函數可以阻塞),如果規定的時間內沒有數據可用,或沒有任務通知解除阻塞,則會超時。盡管發生了超時,但流緩沖區中可能有數據,但不足以達到觸發級別(如果觸發級別大于1)。讀操作成功將返回可用數據。如果從滿流緩沖區中讀取數據,則發送任務通知給等待寫數據但由于緩沖區滿而阻塞的任務。
圖1 Stream buffer示例
圖1的流緩沖器示例應用是一個模數轉換器,當數據可用時就會產生中斷。轉換后的數據在中斷服務程序中發送到緩沖區。然后,通知使用數據的任務從流緩沖區中讀取并處理數據,如過濾數據或計算控制器步長。
消息緩沖(message buffer)
消息緩沖區建立在流緩沖區上,用于交換離散的消息。消息具有定義的長度,其長度被附加到有效負載中。這意味著當發送10字節的消息時,消息的長度(數字10)首先添加到緩沖區中,因此接收方可以在讀取消息之前讀取該值,了解有多少字節的有效載荷。存儲消息長度的字節數是可配置的,必須預先定義,以便接收方確切地知道從緩沖區讀取多少字節以獲得下一條消息的長度。如何配置存儲消息長度的字節數取決于最大的消息長度,單個字節長度可用于最多255字節的消息,2字節長度字段可用于最多65535字節的消息。
緩沖區的大小應考慮最大消息長度和長度字段,例如,報文長度為10字節,長度字段2字節,每個消息的緩沖區中占用12字節。
在SAFERTOS中,流緩沖區和消息緩沖區使用相同的API函數。為了區分兩者,在StreamBuffer結構體中使用了一個額外的標志,在創建流/消息緩沖區時指定。API函數的行為略有不同。
使用流緩沖區時,如果指定了阻塞時間(只有非ISR函數可以阻塞),讀取和寫入操作可以阻塞。消息緩沖區的行為與流緩沖區相似。如果消息緩沖區中沒有消息,則消息緩沖區的讀取操作將被阻塞,任務將阻塞,直到阻塞時間到或足夠的數據被發送到消息緩沖區。因為消息不會部分發送,對于消息緩沖區,在大多數情況下觸發級別為1字節是最有用的,單個字節消息將解除等待任務阻塞。
如果緩沖區不夠用,寫操作就會阻塞,直到足夠的字節/消息從緩沖區中讀取,或阻塞時間超時。
圖2 stream buffer序列
多核應用
流緩沖區和消息緩沖區也可以將在一個核上數據發送到另一個核上執行的任務/中斷中。在非對稱多處理器配置中,每個處理器運行自己的RTOS實例。為了在核間共享數據,必須使用共享內存保存流緩沖區數據。
為了通知讀核有新的數據產生,可以使用從一個核到另一個核的中斷。
SAFERTOS API有多個函數處理多核流緩沖區的使用,但核心功能很大程度上依賴于處理器體系結構。因此這些函數為弱定義的樁,必須由應用程序實現特定于核的功能。
要通知讀核一個緩沖區寫入完成,可以使用API函數vStreamBufferSendCompletedMulticore和vStreamBufferSendCompletedFromISRMulticore。如果另一個核上的任務試圖從空的流/消息緩沖區中讀取數據并等待數據發送,則調用這些函數。使用這些函數來代替單核場景中的任務通知,并且可以觸發等待核的中斷,從而解除等待讀取任務的阻塞。
使用vStreamBufferReceiveCompletedMulticore和StreamBufferReceiveCompletedFromISRMulticore函數通知寫核可用的緩沖區空間。如果另一個核上的任務試圖寫滿的緩沖區并等待發送數據,則調用這些函數。使用這些函數來代替單核場景中的任務通知,并且可以觸發等待核的中斷,從而解除等待寫入任務的阻塞。
多核應用的一個重要方面是對流/消息緩沖區數據訪問的協調。在單核設備上,一次只能有一個任務或中斷處于活動狀態,如果一個任務需要訪問數據結構而不被中斷,它可以在臨界區內操作。當多個核同時處于活動狀態時,必須防止對共享數據結構的并行訪問。因此,必須使用鎖定機制來確保核對緩沖區數據結構的獨占訪問。SAFERTOS提供xStreamBufferAttemptToLock和vStreamBufferReleaseLock函數實現此功能。這些函數也是弱定義的樁,應用程序必須基于特定于處理器的實現來協調訪問。
圖3 多核示例系統
基于流緩沖區機制可以實現任務間實時數據處理,有效地管理任務之間的數據流,確保RTOS應用程序中的高效通信和同步。
麥克泰技術是安全預認證操作系統SAFERTOS在中國的代理商,具有超過20年嵌入式實時操作系統和功能安全軟件服務的市場、服務和培訓經驗,聯系info@bmrtech.com。
-
控制器
+關注
關注
114文章
17022瀏覽量
183276 -
嵌入式
+關注
關注
5143文章
19571瀏覽量
315696 -
模數轉換器
+關注
關注
26文章
3311瀏覽量
128055 -
RTOS
+關注
關注
24文章
845瀏覽量
120858 -
Stream
+關注
關注
0文章
21瀏覽量
8107
原文標題:RTOS的Stream buffer通信機制
文章出處:【微信號:麥克泰技術,微信公眾號:麥克泰技術】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
解析RZ/N2L CANFD模塊的緩沖區機制(1)

解析RZ/N2L CANFD模塊的緩沖區機制(2)

FreeRTOS進階使用之流緩沖區:高效處理字節流的秘密武器
基于狀態圖的緩沖區溢出攻擊分析
緩沖區是啥意思 STM32串口數據接收之環形緩沖區
STM32串口數據接收 --環形緩沖區

消除IoT上的緩沖區溢出漏洞

消除物聯網上的緩沖區溢出漏洞
環形緩沖區的實現思路
C++環形緩沖區設計與實現

評論