中级会员
- 积分
- 244
- 金钱
- 244
- 注册时间
- 2018-8-2
- 在线时间
- 73 小时
|
本帖最后由 chao超 于 2018-12-16 13:41 编辑
UCOSIII消息传递+串口空闲中断+DMA接收 任务可以收到数据程序没有问题
这里请大家分析一下红色处的问题
void USART1_IRQHandler(void) //串口1中断服务程序
{
OS_ERR err;
u8 Res,len=0,i=0;
u8 *prt;
CPU_SR_ALLOC();
OSIntEnter();
OS_CRITICAL_ENTER(); //进入临界区
if( USART1->SR & (1<<4) ) //接收中断
{
Res =USART_ReceiveData(USART1);//(USART1->DR); //读取接收到的数据
len=DataSize-DMA2_Stream2->NDTR;
prt=mymalloc(SRAMIN,len);
strcpy((char *)prt,(char *)DMA2RX_buff);
printf("%s, %d\n",prt,len);
printf("%s, %d\n",DMA2RX_buff,len);
for(i=0;i<=len;i++) 其次就是要将DMA的存储器接收的数据清空第二次显示才不会有问题 如果第一次发的数据长,第二次短,那么第二次显示就将第一次的一部分又重新显示一次很奇怪
DMA2RX_buff=0; 正常来说是不用清空数组的应为我开辟的空间是接收回来数据的长度,但是居然连第一次的没有覆盖的部分也显示出来不可思议,接收回来数据的长度是正确的
OSQPost((OS_Q* )&Data_message, // 指向一个消息队列
(void* )prt, //数据的首地址吧 首先是这里
如果我用DMA的存储器的首地址发过去,任务可以收到消息队列但是串口显示数据为空 (现在是strcpy((char *)prt,(char *)DMA2RX_buff);将数据复制到新的数组才没有问题不知道怎么回事)
(OS_MSG_SIZE)len, //数据的长度
(OS_OPT )OS_OPT_POST_FIFO, //待发送的消息保存在消息队列的末尾
(OS_ERR* )&err);
USART1->SR &=~(1<<4);
MYDMA_Enable(DMA2_Stream2,DataSize);
myfree(SRAMIN,prt); //释放内存
}
OS_CRITICAL_EXIT(); //退出临界区
OSIntExit(); //退出中断
}
|
|