/***************************************************************************** 函 数 名 : mailbox_read_channel 接口类型 : 对内接口 功能描述 : 邮箱共享内存通道接受到新数据的处理回调函数. 输入参数 : unsigned long channel_id -- 邮箱通道号 输出参数 : 无 返 回 值 : 无 调用函数 : mailbox_receive_all_mails() 被调函数 : 修改历史 : 1.日 期 : 2012年9月24日 作 者 : 莫南 00176101 修改内容 : 新生成函数 *****************************************************************************/ MAILBOX_LOCAL long mailbox_read_channel(unsigned long channel_id) { struct mb_buff *mbuf = MAILBOX_NULL; /*邮箱操作句柄*/ struct mb *mb = MAILBOX_NULL; unsigned long ret_val = MAILBOX_OK; mb = mailbox_get_mb(); if (MAILBOX_NULL == mb) { return (unsigned long)MAILBOX_ERRO; } /*判断方向是否正确,是否为接收通道*/ if (mb->local_id != mailbox_get_dst_id(channel_id)) { return mailbox_logerro_p1(MAILBOX_ERR_GUT_INVALID_TARGET_CPU, channel_id); } /*打开此邮箱通道*/ ret_val = mailbox_request_channel(mb, &mbuf, channel_id); if (MAILBOX_OK != ret_val) { return ret_val; } /*接收此邮箱通道的所有邮件*/ ret_val = mailbox_receive_all_mails(mbuf); mailbox_flush_buff(mbuf); /*把邮箱通道操作符的信息写回邮箱头。*/ /*接收完成,关闭邮箱*/ if (MAILBOX_OK != mailbox_release_channel(mb, mbuf)) { return mailbox_logerro_p1(MAILBOX_ERR_GUT_RELEASE_CHANNEL, channel_id); } return ret_val; }
/*封信,准备发送*/ MAILBOX_EXTERN int mailbox_sealup_buff(struct mb_buff * mb_buf , unsigned int usr_size) { struct mb_mail mail = {0}; struct mb_queue *m_queue = MAILBOX_NULL; unsigned int time_stamp; unsigned long mail_addr; m_queue = &mb_buf->mail_queue; /*判断是否超过单次发送最大大小*/ if (usr_size > (mb_buf->config->single_max - sizeof(struct mb_mail) )){ return (int) mailbox_logerro_p2(MAILBOX_ERR_GUT_WRITE_EXCEED_MAX_SIZE, usr_size ,mb_buf->mailcode); } else { } time_stamp = (unsigned int)mailbox_get_timestamp(); /*填充消息头*/ mail.ulPartition = MAILBOX_MSGHEAD_NUMBER; mail.ulWriteSlice = time_stamp; mail.ulReadSlice = 0; mail.ulPriority = 0;/*此属性和OM核对已废弃,不使用*/ mail.ulSeqNum = mb_buf->seq_num; mail.ulMsgLength = usr_size ; mail.ulMailCode = mb_buf->mailcode; if (MAILBOX_SEQNUM_START == mb_buf->seq_num) { (void)mailbox_logerro_p1(MAILBOX_INFO_SEND_FIRST_MAIL, mb_buf->mailcode); } mb_buf->seq_num++; /*向邮箱队列中写入邮件头,并更新队列状态记录临时结构体*/ mail_addr = m_queue->front; (void)mailbox_queue_write(m_queue, (char*)(&mail), sizeof(struct mb_mail)); /*更新邮箱环形缓存信息*/ m_queue->front = mailbox_align_size(mb_buf->usr_queue.front, MAILBOX_ALIGN); (void)mailbox_flush_buff(mb_buf); /*把邮箱通道操作符的信息写回邮箱头。*/ #ifdef MAILBOX_OPEN_MNTN mailbox_record_send(&(mb_buf->mntn), mb_buf->mailcode, time_stamp, mail_addr); #endif /*准备下一封邮件写入*/ return mailbox_init_usr_queue(mb_buf); }