MSS代码解读-MmwDemo_mboxReadTask线程(八)
摘要:本篇文章主要是圍繞著MmwDemo_mboxReadTask任務線程函數講解郵箱讀取消息的過程,該任務用于處理從郵箱虛擬通道接收的毫米波 demo 消息。接下來將對該任務線程進行分片段進行講解,并適當拓展。
1.任務線程函數原型:
描述:
用于處理郵箱虛擬通道接收的毫米波demo消息。
參數
兩個Task 參數都沒有使用,這里不拓展。
返回值
無返回值
2.參數聲明部分
跳轉進入到MmwDemo_mboxReadTask任務線程函數,按照老套路,在函數開頭都會首先定義該線程所需結構體來存儲相關的消息,回到該任務線程函數,仍是如此(如下代碼片段),可以看到定義了兩個參數。
1)參數 1 (message)
這是用于DSS/MSS通信交互的消息結構體,該結構定義了用于在MSS和DSS之間通信的消息結構。結構體原型如下;
從MmwDemo_message(參數1的結構體類型)結構體原型中可以看到它總共有三個元素,其中從上到下依次是type、subFrameNum、body,其中
?type??? mmWave demo中用于MSS和DSS之間郵箱通信的消息類型。它是MmwDemo_message_type類型的枚舉,保存mmWave demo中MSS和
??????????? DSS之間用于郵箱通信的所有消息類型。
?subFrameNum 此消息適用的子幀號。?僅當使用高級幀配置時有效。?當高級幀配置不使用時,該字段應該設置為
??????????????????????????????? MMWDEMO_SUBFRAME_NUM_FRAME_LEVEL_CONFIG。
?body? 毫米波演示中用于將配置從MSS傳遞到DSS的消息體。它的結構體原型如下;
從MmwDemo_message_body(參數1中元素body的結構體類型)結構體中可以看到,它總共有四個屬性,其中從上到下依次是detObj、dataLogger、assertInfo、dss2mssISRinfoAdress,其中它們的作用如下
detObj? DSS處理好的探測信息,即用于報告從數據路徑到MSS的檢測信息的消息?,消息的格式滿足TLV報文格式。
dataLogger 數據路徑輸出數據流大小的設置
assertInfo? DSS斷言消息,即用于報告DSS斷言信息的消息?,該結構定義了應轉發到MSS的關于DSS異常的信息的消息體。
dss2mssISRinfoAddress DSS到MSS ISR信息存儲的地址,通常在HSRAM中?,通常HSRAM也叫做共享寄存器,用來存放DSS/MSS產生的消息,換句話說??
???????????????????????????????? DSS將處理好的消息存放到HSRAM,并告訴MSS,這時MSS就會去訪問HSRAM并處理消息,同樣MSS也如此;
補充:
TLV消息格式
攜帶檢測信息的輸出報文每幀通過UART發送出去。?每個報文由頭MmwDemo_output_message_header_t和包含MmwDemo_output_message_type_e中枚舉類型的各種數據信息的TLV條目數組成(即在下面的結構體原型中的tlv元素,它是一個數組,數組的長度是MmwDemo_output_message_type_e枚舉類型)。?類型的數值可以在mmw_output.h中找到。?每個TLV項(看下圖tlv結構體)由類型、長度和載荷信息(通常為地址信息)組成。?輸出包的結構如下圖所示。?由于數據包的長度取決于檢測到的對象的數量,因此它可以在幀與幀之間變化。?包的結尾被填充,因此包的總長度總是32字節的倍數。?
tlv結構體:
2)參數 2(retVal)
這個參數用于接收API的返回值,并通過這個返回值來判斷API的執行狀態。這里聲明后直接賦值為0;
3.讀取消息
在聲明參數后,接下來就是在一個while循環里讀取郵箱中的信息,進入while循環首先看到 Semaphore_pend代碼,這是用來阻塞線程執行的,因為這個while循環是一個無限循環的函數且,可以將 Semaphore_pend當做函數的出口,它需要等待郵箱執行回調函數 MmwDemo_mboxCallback釋放信號量才能接著執行,當DSS向郵箱寫入消息時,促發這個回調函數,從而釋放信號量,在信號量釋放后,由于此時郵箱中已經有消息寫入了,這時就需要將消息讀取出來存儲在前面聲明的參數message中(這個過程是由 Mailbox_read API完成的),并將API的返回值傳遞給參數retVal,然后通過retVal的值(這個值是返回讀取的字節數)來判斷Mailbox_read API的執行狀態,如果小于0則說明讀取失敗,等于0則表明消息為空,繼續循壞這個while循壞,如果都不是,則成功將DSS存放在HSRAM寄存器中的數據讀取出來存放在message參數中,接下來就是對這個消息進行讀取。
?MmwDemo_mboxCallback回調函數
在成功將消息讀取到message參數后,接下來就是對message進行后續處理,從而通過串口(UART)將數據發送到上位機。在進行后續處理前,首先需要將郵箱的內容清除,以表明消息已處理完畢。?這將允許我們在處理接收到的消息時在郵箱中接收另一條消息。這個過程是由?Mailbox_readFlush API完成的。如下代碼片段;
郵箱消息清除完成后,接下來就是通過switch 語句對message進行后續處理,通過判斷message.type(消息類型)選擇需要執行的代碼塊,當這個消息類型為MMWDEMO_DSS2MSS_DETOBJ_READY(DSS到MSS的消息,數據處理完成消息)時,表明message.body中存儲的是數據路徑處理完成的數據,開始執行對應的操作。值得注意的是,在這里,它將執行如下的代碼片段完成message.body中消息的傳輸;
在上面的代碼中,首先聲明三個局部參數,依次為totalPacketLen、numPaddingBytes、itemIdx;
totalPacketLen? 用于記錄數據包的總長度
numPaddingBytes 用于記錄數據報后需要填充的bite數
itemIdx 由于循壞的參數
局部參數聲明完成后,接下來就是對消息通過UART串口發送到上位機,消息頭和消息體依次發送;
發送消息頭:
totalPacketLen = sizeof(MmwDemo_output_message_header);//表示先計算消息頭的長度,后續每發送一個Tlv報文,這個數據包長度就增加一個tlv長度
發送消息體:
消息體需要通過一個for循壞來多次發送,主要是因為一個數據包中,包含多個TLV報文
將消息頭和消息體都發送完成后,由于每個數據包總是32字節的倍數,所以需要檢查這個數據包是否滿足這個條件,如果不滿足則需要在數據包后進行填充0,使其滿足這個條件為止,如下代碼片段所示;
到此就完整的將一個數據包發送到上位機,即參數(message)中的信息已經成功通過數據包發送給上位機,接下來就是MSS向郵箱存放消息告知DSS已經將你存放的消息處理完成了,值得注意的是,MSS在進行相關的郵箱寫入操作時,需要將參數(message)初始化為了0。如下所示,在這里MSS通過外部函數MmwDemo_mboxWrite完成郵箱寫入過程;
MmwDemo_mboxWrite函數:
到這里為止,當message.type=MMWDEMO_DSS2MSS_DETOBJ_READY類型的情況已經講解完。當message.type=MMWDEMO_DSS2MSS_ASSERT_INFO(DSS到MSS的斷言信息),代碼塊如下;
這表明,當參數(message)消息頭等于這個時候,說明DSS發生了某些錯誤,需要中斷程序,即調用斷言函數,并且將錯誤信息顯示在CLI命令行窗口,這是通過CLI_write API完成的。
在這個switch開關函數中除了上述描述的兩種類型的消息頭有定義外,其余的都無定義,在控制臺顯示錯誤信息,如下所示。
函數原型:
1)
描述
函數,從郵箱讀取數據。郵箱一次只能從遠程端點讀取一條消息。?可以對郵箱中的同一消息執行多個Mailbox_read()調用。例如,應用程序可以讀取消息的一部分來計算整個消息的長度,并發出后續的Mailbox_read()。郵箱驅動程序在內部跟蹤為消息讀取的字節數。?消息的第一個Mailbox_read()總是從字節0開始。?對于同一消息調用多個Mailbox_read()的情況,后續讀取將從前一次讀取停止的位置的下一個字節開始。?一旦應用程序完成讀取消息,它必須發出Mailbox_readFlush()來釋放郵箱緩沖區并通知遠程端點。郵箱緩沖區的最大大小由MAILBOX_DATA_BUFFER_SIZE( (int32_t) 2044U)給出。?如果郵件的大小大于郵箱緩沖區,則應用程序代碼負責對郵件進行分段處理。?所有與讀取操作相關的中斷都由驅動程序管理,不向應用程序公開。?返回已讀取或錯誤的字節數。?
參數
?handle 郵箱控制句柄
?buffer 指向空緩沖區的指針,接收到的數據應寫入其中。
?size 要寫入緩沖區的字節數
返回值
返回已從郵箱中讀取的字節數。?如果發生錯誤,則返回郵箱錯誤碼之一。?
2)
描述
應在應用程序完成讀取消息后調用的函數。通知遠程端點,在讀取上一條消息之后,本地郵箱已準備好接收新消息。在本地端點發出Mailbox_readFlush()之前,遠程端點不能向本地端點發送新消息。?一旦發出Mailbox_readFlush(),本地端點必須假定先前接收到的消息不再位于郵箱緩沖區中,并且后續的Mailbox_read()將不返回任何數據,直到新消息到達郵箱。?
參數
?handle 郵箱控制句柄
返回值
在失敗時返回錯誤代碼。
3)
描述
這個函數啟動一個向UART控制器寫入數據的操作,將數據寫入UART。
參數
?handle UART控制句柄
?buffer 指向緩沖區的指針,其中包含要寫入UART的數據?
?size 緩沖區中應該寫入UART的字節數?
返回值
返回已寫入UART的字節數。?如果發生錯誤,則返回其中一個UART錯誤碼。
4)
描述
將數據寫入郵箱的函數。郵箱一次只能向遠程端點發送一條消息。?數據復制到郵箱緩沖區后,驅動程序觸發對遠程端點的中斷。?這意味著對Mailbox_write()的調用始終是一個完整的郵箱事務。?只有在前一條消息得到遠程端點的確認之后,才能發送新消息。?確認過程由驅動程序內部處理。?所有與寫操作相關的中斷都由驅動程序管理,不向應用程序公開。?如果調用時使用的數據將超過郵箱緩沖區的最大大小,則寫入操作將失敗,并顯示錯誤代碼,并且不會向郵箱緩沖區寫入任何內容。?返回寫入的字節數或錯誤。
參數
?handle UART控制句柄
?buffer 指向包含要寫入郵箱的數據的緩沖區的指針。
?size 緩沖區中應該寫入郵箱的字節數。
返回值
返回已寫入郵箱的字節數。?如果發生錯誤,則返回郵箱錯誤碼之一。
5)
描述
將消息記錄到CLI控制臺。
參數
?format 格式字符串
返回值
無
結束語
讀取郵箱的任務線程函數到這里就結束了,如有任何疑問,或小編有寫錯的地方,可以私信相互溝通學習。
參考資料
mmwave_automotive_toolbox\mmwave_automotive_toolbox_3_5_0\labs\lab0002_short_range_radar
mmwave_sdk_03_05_00_04\docs\mmwave_sdk_module_documentation.html
總結
以上是生活随笔為你收集整理的MSS代码解读-MmwDemo_mboxReadTask线程(八)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 出去野餐怎么发朋友圈 烧烤配啤酒怎么接下
- 下一篇: R地图包·给一些国家上色