关于STM32 uC/OS-II中任务调度和串口丢数据的原因
来源:互联网 发布:linux内核源代码分析 编辑:程序博客网 时间:2024/06/05 09:06
贴上代码,记录遇到的问题:这部分代码只是记录调试遇到的问题,和当时的一些想法,欢迎拍砖。
void uart4_task(void *pdata){ //INT8U RxBuffer1[MAX_SERIAL_LEN4];//UART3D 接收缓存数组是全局的和局部的效果一样 unsigned char i=0,RxCounter1=0,checksum=0;unsigned char bTemp1,bTemp2; while(1){ if(USART_GetFlagStatus(UART4, USART_FLAG_RXNE) != RESET) { // USART_ClearFlag(UART4, USART_FLAG_RXNE); RxBuffer1[RxCounter1++] = USART_ReceiveData(UART4); //将读寄存器的数据缓存到接收缓冲区里 USART_ClearFlag(UART4, USART_FLAG_RXNE); if(RxBuffer1[RxCounter1-1]=='$'){RxBuffer1[0]='$'; RxCounter1=1;} //判断起始标志 if(RxBuffer1[RxCounter1-1]==0x0a) //判断结束标志是否是0x0d 0x0a { // SendChar3 ('A'); //201402071101 // SendChar3 (RxCounter1); //201402071101 // 为什么RxCounter1的值才是17// //usart4_flag=1;// SendChar3 ('A'); //201402071101 //20140210 for(i=1; i< RxCounter1-5; i++) {checksum=checksum^RxBuffer1[i];}//计算收到数据的校验值// unsigned char bTemp1,bTemp2; //ASCLL 变字符 bTemp1 = checksum >> 4; if(bTemp1 > 9)bTemp1 += 0x37; else bTemp1 += 0x30; bTemp2 = checksum & 0x0f; if(bTemp2 > 9)bTemp2 += 0x37; else bTemp2 += 0x30; //ASCLL 变字符 vSendSerialString3(RxBuffer1); //if((bTemp1==RxBuffer1[RxCounter1-4])&&(bTemp2==RxBuffer1[RxCounter1-3])){//判断校验是否正确,若正确则执行此块语句// //20140210 for(i=0; i< RxCounter1; i++) {TxBuffer1[i] = RxBuffer1[i];/* RxBuffer1[i] = 0;*/ }//将接收缓冲器的数据转到发送缓冲区,准备转发//wogaide //接收成功标志 Rec_Len=RxCounter1;// RxBuffer1[MAX_SERIAL_LEN4]={0};//毎接收完整的一帧RMC消息,接收缓冲区清零20140208// memset(RxBuffer1,0,sizeof(RxBuffer1));//201402081024 //usart4_flag=1;//完整的一帧RMC消息标识20140208 RxCounter1=0; //毎接收完一帧RMC消息,RxCounter1归零20140208 // if(TxBuffer1[3]=='R'&& TxBuffer1[4]=='M'&&TxBuffer1[5]=='C')// {// GPRMC_DAT();// } //接收完成,传送信号量usart4_flag=1; //}else{SendChar3 ('A');} //201402101329 } }//delay_ms(10);//这个地方的延时不能太小,否则UCOS任务得不到调度,太长的话影响串口数据的处理 };}
串口接收的处理不应该放在这个任务中,应该放在中断中, 否则delay_ms函数执行时会丢掉很多数据,我之前就没有考虑到这块,就耽误了很多不应该耽误的宝贵时间。
若将串口接收数据放到中断里,串口接收的计数值RxCounter1是一个全局变量,在中断接收中, 收到一个字节有效数据就自加,收到帧结束就RxCounter1置零,而在对串口数据的处理中,需要使用到RxCounter1这个全局变量,有可能在串口中断处理的过程中,RxCounter1的值已经被中断接收修改了,这里就有问题了,中断修改RxCounter1和对串口数据的处理所使用的RxCounter1应为互斥访问。
0 0
- 关于STM32 uC/OS-II中任务调度和串口丢数据的原因
- uC/OS-II的任务管理和调度
- uC/OS-II的任务调度和时钟
- uC/OS-II的任务管理和调度
- uC /OS-II中任务的挂起和恢复
- uC/OS-II任务调度中判断最高优先级
- uC/OS-II的任务调度与时钟
- uc/os-ii任务调度的锁定与解锁
- 2、uc/os:ucos-ii的任务调度机制
- uc/os-ii任务调度(一)
- uc/os-ii任务调度(二)
- uC/OS-II的任务
- uC/OS-II任务就绪表及任务调度
- 嵌入式上UC/OS - II使用注意点------任务调度
- uC/OS-II就绪任务的管理
- uC/OS-II的任务切换总结
- UC/OS-II的任务切换
- uC/OS-II就绪任务的管理
- 这门课程没做出的也没去做的题目。
- win8下tomcat配置
- android ScrollView嵌套ListView
- win7 64位上cocos2dx2.0.4移植android的全过程
- 创建Fragment
- 关于STM32 uC/OS-II中任务调度和串口丢数据的原因
- android:view的状态保存
- Github学习总结
- poj 1651 Multiplication Puzzle(区间DP,直接用矩阵相乘的方式也对)
- Oracle connect by
- 开源虚拟化操作系统OSv初探
- C++的成员函数在多线程下运行的测试
- 虚函数对C++多态的影响
- 选择排序 冒泡排序