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