请教 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);
}
}
在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积分