mailbox.c Implementation
郵箱buffer處理的描述(MAILBOX_QUEUE = 0):
兩個郵箱buffer用於發送和接收郵箱服務。
正常運行:
啟動郵箱處理(handler) psWriteMbx以及郵箱buffer 1,、psReadMbx、psRepeatMbx和psStoreMbx為0。
在此狀態下,將忽略Repeat請求,因為尚未發送任何服務。
發送第一個郵箱服務時(在MBX_CopyToSendMailbox中),psWriteMbx獲取郵箱buffer 2,psReadMbx獲取發送郵箱buffer 1,psRepeatMbx 和 psStoreMbx仍為0。
從主站讀取第一個郵箱服務時,發送的郵箱buffer 1存儲在psRepeatMbx(MBX_MailboxReadInd)中。
在psReadMbx始終獲取實際發送的郵箱buffer之后,psWriteMbx設置為0(在發送郵箱服務被讀且調用MBX_MailboxReadInd之前,不會處理從主站接收的另一個郵箱服務)。
當讀取郵箱服務時,psWriteMbx得到psRepeatMbx的buffer,psRepeatMbx得到psReadMbx的buffer。
主站Repeat請求:
當主站發Repeat請求時(MBX_MailboxRepeatReq),有三種不同的可能:
-
自郵箱處理(handler)啟動以來未發送任何郵箱服務(psRepeatMbx=0):無需執行任何操作
-
接收到上一個已發送郵箱服務的確認(MBX_MailboxReadInd())(bSendMbxIsFull = 0):
上一個發送郵箱服務(psRepeatMbx)將被再次發送(在MBX_CopyToSendMailbox中)並存儲在psReadMbx中,psRepeatMbx將設為0 -
未接收到上一次的發送郵箱服務的確認(psReadMbx和psRepeatMbx包含不同的buffer,psReadMbx仍在郵箱中(因為尚未調用MBX_MailboxReadInd,bSendMbxIsFull = 1):
psReadMbx將在郵箱中被刪除(調用DisableSyncManChannel和EnableSyncManChannel)然后存儲在psStoreMbx中,psRepeatMbx將再次發送(在MBX_CopyToSendMailbox中)並存儲在psReadMbx中,psRepeatMbx將置為0。
發送重復郵箱服務(調用MBX_MailboxReadInd)時,psReadMbx將存儲在psRepeatMbx中,psStoreMbx將被發送(在mbx中)並存儲在psReadMbx中,psStoreMbx將被設為0。
郵箱buffer處理的描述(MAILBOX_QUEUE = 1):
有兩個郵箱buffer用於發送和接收郵箱服務。
正常操作(psWriteMbx僅用於本地存儲):
啟動郵箱處理(handler) psReadMbx,psRepeatMbx和psStoreMbx為0。
在此狀態下,將忽略Repeat請求,因為尚未發送任何服務。
當從主站接收到郵箱服務時(在MBX_CheckAndCopyMailbox中),郵箱buffer將使用APPL_AllocMailboxBuffer獲取,相應的協議服務功能將被調用(在MBX_WriteMailboxInd中)。
該buffer應用於協議服務響應。
發送第一個郵箱服務時(在MBX_CopyToSendMailbox中),psReadMbx將獲取發送郵箱buffer,psRepeatMbx和psStoreMbx仍為0。
讀取第一個來自主站的郵箱服務時,將存儲發送的郵箱buffer(psReadMbx)。在psRepeatMbx中(在MBX_MailboxReadInd中)。
之后,psReadMbx始終獲取實際發送的郵箱buffer(在MBX_CopyToSendMailbox中)當讀取郵箱服務時,將返回psRepeatMbx(使用appl eu freemailboxbuffer),psRepeatMbx將獲取psReadMbx的buffer。
主站Repeat請求:
當主站發Repeat請求時(mbx_mailboxrepeatreq),有三種不同的可能:
-
自郵箱處理(handler)啟動以來未發送任何郵箱服務(psRepeatMbx=0):無需執行任何操作
-
接收到上一個已發送郵箱服務的確認(以MBX_MailboxReadInd為單位)(bSendMbxIsFull=0):
最后發送的郵箱服務(psRepeatMbx)將再次發送(在MBX_CopyToSendMailbox中)並存儲在psReadMbx中,psRepeatMbx將設置為0 -
未收到最后發送的郵箱服務的確認(psReadMbx和psRepeatMbx包含不同的buffer,psReadMbx仍在郵箱中(因為尚未調用mbx_-mailboxreadind,bSendMbxIsFull=1):
psReadMbx將在郵箱中刪除(調用DisableSyncManChannel和EnableSyncManChannel)和存儲在psStoreMbx中,psRepeatMbx將再次發送(在MBX_CopyToSendMailbox中)並存儲在psReadMbx中,psRepeatMbx將設置為0。
發送重復郵箱服務(調用MBX_MailboxReadInd)時,psReadMbx將存儲在psRepeatMbx中。
psStoreMbx將被發送(在mbx中)並存儲在psReadMbx中,psStoreMbx將被設置為0。
mailbox.c 解析
1. UINT8 PutInMbxQueue(TMBX MBXMEM * pMbx, TMBXQUEUE MBXMEM * pQueue)
2. TMBX MBXMEM * GetOutOfMbxQueue(TMBXQUEUE MBXMEM * pQueue)
3. void MBX_Init(void)
4. UINT16 MBX_StartMailboxHandler(void)
5. void MBX_StopMailboxHandler(void)
6. UINT8 MailboxServiceInd(TMBX MBXMEM *pMbx)
checks the mailbox header:
(pMbx->Mbxheader.Flags[MBX_OFFS_TYPE] & MBX_MASK_TYPE) >> MBX_SHIFT_TYPE
when mailbox header type is MBX_TYPE_COE, it calls:
COE_ServiceInd((TCOEMBX MBXMEM *) pMbx);
7. void MBX_MailboxWriteInd(TMBX MBXMEM *pMbx)
8. void MBX_MailboxReadInd(void)
9. void MBX_MailboxRepeatReq(void)
10. UINT8 MBX_MailboxSendReq( TMBX MBXMEM * pMbx, UINT8 flags )
11. void MBX_CheckAndCopyMailbox(void)
Check if the received mailbox command can be processed, the contents of the Receive Mailbox will be copied in the variable sMbx.
12. UINT8 MBX_CopyToSendMailbox(TMBX MBXMEM *pMbx)
13. void MBX_Main(void)
- GetOutOfMbxQueue(&sMbxReceiveQueue);
to check if a received mailbox service was stroed. - MailboxServiceInd(pMbx);
to check the mailbox header for the requested service and calls the corresponding XXX_ServiceInd function. - if (bReceiveMbxIsLocked)
MBX_CheckAndCopyMailbox();