往死里写--邮箱处理

来源:互联网 发布:新浪云数据库 编辑:程序博客网 时间: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;}