查看: 2817|回复: 6

[求助] uCOS系统的消息邮箱问题

[复制链接]

该用户从未签到

3

主题

10

帖子

0

注册会员

Rank: 2

积分
59
最后登录
2017-7-3
发表于 2016-2-5 03:29:01 | 显示全部楼层 |阅读模式
本帖最后由 LeoZhou34 于 2016-6-12 17:17 编辑

各位好,我刚刚接触uCOS系统,现在有个关于消息邮箱使用的问题,请帮忙!

我使用的NXP M3,尝试使用消息邮箱将串口2接收到的数据传递到串口任务中,进行相关数据解析,但没有成功。现象是:当确定串口2接收到全部数据后,利用消息邮箱将这些数据传递给串口任务,而此时任务中的没有接收到这些传递的数据。主要代码如下:

1、串口2中断服务程序

static  void  BSP_IntHandlerUART2 (void)
{
    CPU_INT08U  lsr;
    CPU_INT08U  iir;
    OS_CPU_SR    cpu_sr;
   
    OS_ENTER_CRITICAL();
    OSIntNesting++;
    OS_EXIT_CRITICAL();
   
    iir = BSP_SER_REG_U2_IIR & 0x0F;
   
    while (iir != 1)
    {
        switch (iir)
        {
            // other program

            case  4:                             
                lsr           = BSP_SER_REG_U2_LSR;
                BSP_SerRxData = BSP_SER_REG_U2_RBR;
                bsp_ser_rx_data (BSP_SerRxData);          // 数据检测程序         
                (void)lsr;
                break;

            default:
                break;
        }
        
        iir = BSP_SER_REG_U2_IIR & 0x0F;      
    }
   
    OSIntExit();
}

2、数据检测程序

void  bsp_ser_rx_data (CPU_INT08U  rx_data)
{     
      static CPU_INT08U    msg_buff_index=0, msg_buff[9]={0}, msg_buff_len=0;

      msg_buff[msg_buff_index] = rx_data;
      
      
        //...  略去条件判断部分
       {     
           msg_buff_index++;

            if (msg_buff_len == msg_buff_index)
            {               
                OSMboxPost(App_SerMbox2, (void *)&msg_buff);
                msg_buff_len   = 0;
                msg_buff_index = 0;
            }
            else if (msg_buff_len < msg_buff_index)
            {
                msg_buff_len   = 0;
                msg_buff_index = 0;
             }
        }
}

3、串口任务

static     void  App_TaskCom (void    *p_arg)
{
      CPU_INT08U    err;
    CPU_INT08U    *box_data;
    CPU_INT08U    buff[9];
   
      (void)p_arg;
   
    while (DEF_TRUE)
    {        
          box_data = (CPU_INT08U *)OSMboxPend(App_SerMbox2, 0, &err);
        
        buff[0] = box_data[0];
        buff[1] = box_data[1];
        buff[2] = box_data[2];
        buff[3] = box_data[3];
        buff[4] = box_data[4];
        buff[5] = box_data[5];
        buff[6] = box_data[6];
        buff[7] = box_data[7];
        buff[8] = box_data[8];
        buff[9] = box_data[9];
        OSTimeDlyHMSM(0, 0, 10, 0);        
    }   
}

注:

1) 在任务中 App_TaskCom中无法获取到串口中断中传递的数据。
2) 使用全局变量,则可以实现。

各位,请予指正!
谢谢!


我知道答案 目前已有6人回答
回复

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2016-2-5 09:57:31 | 显示全部楼层
楼主你好!
请给出你使用芯片的具体型号!
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

10

帖子

0

注册会员

Rank: 2

积分
59
最后登录
2017-7-3
 楼主| 发表于 2016-2-14 00:11:44 | 显示全部楼层
本帖最后由 LeoZhou34 于 2016-2-14 17:00 编辑
FSL_TICS_ZJJ 发表于 2016-2-5 09:57
楼主你好!
请给出你使用芯片的具体型号!

您好,芯片的型号是NXP LPC1768FBD100,请予帮忙!

另外,我增加了消息邮箱发送和接收部分的返回值验证(该部分代码如下),发现返回值是OS_ERR_EVENT_TYPE,提示是pevent不是指向消息邮箱的指针。
void  bsp_ser_rx_data (CPU_INT08U  rx_data)
{     
      static CPU_INT08U    msg_buff_index=0, msg_buff[9]={0}, msg_buff_len=0;
      CPU_INT08U   err;

      msg_buff[msg_buff_index] = rx_data;
      
      
        //...  略去条件判断部分
       {     
           msg_buff_index++;

            if (msg_buff_len == msg_buff_index)
            {               
                OSMboxPost(App_SerMbox2, (void *)&msg_buff);
                 
                 if (err == OS_NO_ERR)
                 {//... }
                  else
                  {//... }
                  
                msg_buff_len   = 0;
                msg_buff_index = 0;
            }
            else if (msg_buff_len < msg_buff_index)
            {
                msg_buff_len   = 0;
                msg_buff_index = 0;
             }
        }
}

注:该消息邮箱创建如:App_SerMbox2 = OSMboxCreate((void *)0)

请各位提点,如何解决!
谢谢!



回复 支持 反对

使用道具 举报

该用户从未签到

124

主题

3600

帖子

0

金牌会员

Rank: 6Rank: 6

积分
5781
最后登录
1970-1-1
发表于 2016-2-15 10:47:26 | 显示全部楼层
LeoZhou34 发表于 2016-2-14 00:11
您好,芯片的型号是NXP LPC1768FBD100,请予帮忙!

另外,我增加了消息邮箱发送和接收部分的返回值验证( ...

新年快乐,
楼主,我先看一下,有结论再回复你
回复 支持 反对

使用道具 举报

该用户从未签到

124

主题

3600

帖子

0

金牌会员

Rank: 6Rank: 6

积分
5781
最后登录
1970-1-1
发表于 2016-2-15 14:38:32 | 显示全部楼层
LeoZhou34 发表于 2016-2-14 00:11
您好,芯片的型号是NXP LPC1768FBD100,请予帮忙!

另外,我增加了消息邮箱发送和接收部分的返回值验证( ...

我的建议
1. 不要在中断做过多复杂的操作,越简短越好
2. 你按照这个例子,重新创建一下消息邮箱,只做个简单操作看看
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

10

帖子

0

注册会员

Rank: 2

积分
59
最后登录
2017-7-3
 楼主| 发表于 2016-2-17 22:26:31 | 显示全部楼层
FSL_TICS_ZP 发表于 2016-2-15 14:38
我的建议
1. 不要在中断做过多复杂的操作,越简短越好
2. 你按照这个例子,重新创建一下消息邮箱,只做个 ...

多谢!

我已经找到问题了,是创建消息邮箱的位置不对,将消息邮箱挪到串口初始化前就可以了!
回复 支持 反对

使用道具 举报

该用户从未签到

124

主题

3600

帖子

0

金牌会员

Rank: 6Rank: 6

积分
5781
最后登录
1970-1-1
发表于 2016-2-18 12:40:17 | 显示全部楼层
LeoZhou34 发表于 2016-2-17 22:26
多谢!

我已经找到问题了,是创建消息邮箱的位置不对,将消息邮箱挪到串口初始化前就可以了! ...

不客气!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-7-22 12:55 , Processed in 0.096804 second(s), 27 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表