微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 请教 UCOSIII下CAN总线的接收问题

请教 UCOSIII下CAN总线的接收问题

时间:10-02 整理:3721RD 点击:
小弟目前再弄UCOSIII,在CAN总线接收上面遇到了难题,肯定各位帮帮忙,指点指点迷津!具体现象是,连续下发4个不同的报文,任务处理函数中串口打印出的数据只有第1条和第4条,并且第四条打印了3次,总的报文数是对的,但就是第2、3条报文没有,第4条报文多了两次。使用任务内消息和消息列表现象都一样。下面是主要的两个函数

在CAN接收中断中:
extern OS_TCB        Can1TaskTCB;
extern OS_TCB        Can2TaskTCB;
extern OS_FLAG_GRP        EVENTFLAH_GRP;
void CAN1_RX0_IRQHandler(void)
{
        OS_ERR   err;        
        static uint8_t i=0,j=0;
        static uint8_t *can1buf[8];
        
        OSIntEnter();
        can1buf[j]=mymalloc(SRAMIN,8);
        CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);
        //for(i=0;i<8;i++)
        //{
                can1buf[j] = (uint8_t*)RxMessage.Data;
        //}
        
        /* 发布任务消息到任务 AppTaskUsart */
//                OSTaskQPost ((OS_TCB      *)&Can1TaskTCB,      //目标任务的控制块
//                             (void        *)can1buf[j],             //消息内容的首地址
//                             (OS_MSG_SIZE  )8,                     //消息长度
//                             (OS_OPT       )OS_OPT_POST_FIFO,      //发布到任务消息队列的入口端
//                             (OS_ERR      *)&err);                 //返回错误类型
               
        OSQPost ((OS_Q*                )&CAN1_QUEUE,
                 (void*                )can1buf[j],
                 (OS_MSG_SIZE   )8,
                 (OS_OPT        )OS_OPT_POST_FIFO,
                 (OS_ERR*        )&err);
        j++;
                if(j==8)
                        j=0;
        OSIntExit();            //退出中断
}

在CAN任务处理控制块中
void can1_task(void *p_arg)
{
        OS_ERR err;
        uint8_t *p,i;
        OS_MSG_SIZE        size;
        p_arg = p_arg;
        while(1)
        {
//                p = OSTaskQPend ((OS_TICK        )0,                    //无期限等待
//                                 (OS_OPT         )OS_OPT_PEND_BLOCKING, //没有消息就阻塞任务
//                                 (OS_MSG_SIZE   *)&size,            //返回消息长度
//                                 (CPU_TS        *)0,                    //返回消息被发布的时间戳
//                                 (OS_ERR        *)&err);                //返回错误类型
                p = OSQPend ((OS_Q*                )&CAN1_QUEUE,
                             (OS_TICK                )0,
                             (OS_OPT                 )OS_OPT_PEND_BLOCKING,
                             (OS_MSG_SIZE*        )&size,
                             (CPU_TS*                )0,
                             (OS_ERR*                )&err);
                for(i=0;i<8;i++)
                {
                        printf("%c",*p++);
                }
                myfree(SRAMIN,p);        //释放内存
                GPIO_ResetBits(GPIOC,GPIO_Pin_1);
                OSTimeDlyHMSM ((CPU_INT16U   )0,
                               (CPU_INT16U   )0,
                               (CPU_INT16U   )1,
                               (CPU_INT32U   )0,
                               (OS_OPT       )OS_OPT_TIME_HMSM_NON_STRICT,
                               (OS_ERR*             )&err);
        }
}


已退回5积分

上一篇:单片机 C51
下一篇:STM32按键检测

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top