往死里写--邮箱处理

/
/**
 \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;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值