往死里写--邮箱处理
来源:互联网 发布:新浪云数据库 编辑:程序博客网 时间:2024/06/06 10:43
//////////////////////////////////////////////////////////////////////////////////////////** \param pMbx 指针指向发送邮箱的命令(由主站来读) \param flags Bit 0-6: 邮箱协议的类型: 0x01 - 紧急服务 0x02 - CoE 服务 0x04 - SoE 服务 0x80 - EoE 服务 0x10 - AoE 服务 0x20 - VoE 服务 Bit 7: 0 - 没有更多的碎片发送给需要的邮箱服务 1 - 有更多的碎片发送给邮箱服务,对应的相关函数XXXX_ContinueInd-function将会被带调用来产生新的碎片
\return 0: Success - 邮箱服务将会被存储在发送邮箱里 1: Failed - 邮箱命令不能被存储在发送邮箱,函数XXXX_ContinueInd service将会被调用当邮箱被主站读的时候。
\brief 这个函数放一个新的邮箱服务在发送邮箱*////////////////////////////////////////////////////////////////////////////////////////UINT8 MBX_MailboxSendReq( TMBX MBXMEM * pMbx, UINT8 flags ){ UINT8 result = 0; /* HBu 06.02.06: 在INIT状态,一个邮箱发送请求将会被拒绝 */ if ( (nAlStatus & STATE_MASK) == STATE_INIT ) return ERROR_INVALIDSTATE; ENTER_MBX_CRITICAL; DISABLE_MBX_INT; /* 计数器在邮箱头里面,将会增加在每个新的邮箱服务被发送,如果邮箱的数据链路层被支持。 (software switch MAILBOX_REPEAT_SUPPORTED set)*/ pMbx->MbxHeader.Flags[MBX_OFFS_COUNTER] &= ~MBX_MASK_COUNTER; /* HBu 13.02.06: 如果邮箱服务不能发送,那么Repeat_Counter将会添加得太多 */ /* u8MbxCounter 保留了一个实际的计数器给数据帧头,只有值1~7才被允许,假如邮箱的数据链路层支持的话。 */ if ( (u8MbxReadCounter & 0x07) == 0 ) u8MbxReadCounter = 1; pMbx->MbxHeader.Flags[MBX_OFFS_COUNTER] |= u8MbxReadCounter << MBX_SHIFT_COUNTER; /* 尝试将邮箱的命令拷贝到ESC里面 */ if ( MBX_CopyToSendMailbox(pMbx) != 0 ) { /* 没有成功,说明发送邮箱已满,设置标志位 */#if MAILBOX_QUEUE result = PutInMbxQueue(pMbx, &sMbxSendQueue); if (result != 0) flags |= FRAGMENTS_FOLLOW; else u8MbxReadCounter++;#else flags |= FRAGMENTS_FOLLOW; result = 1;#endif } /* HBu 13.02.06: Repeat-Counter会增加得太多,如果邮箱服务可能发送 */ else { u8MbxReadCounter++; } if ( flags & FRAGMENTS_FOLLOW ) { /* 存储对应的邮箱服务,对应的XXX_ContinueInd函数将被调用当发送邮箱将被主站读,因为这里有一些邮箱命令发送给这个服务*/
u8MailboxSendReqStored |= (flags & ((UINT8) ~FRAGMENTS_FOLLOW)); } ENABLE_MBX_INT; LEAVE_MBX_CRITICAL; return result;}