OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5288|回复: 4

串口接收容易卡死

[复制链接]

2

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2017-9-11
在线时间
11 小时
发表于 2018-7-18 14:39:39 | 显示全部楼层 |阅读模式
2金钱
本帖最后由 yup1983 于 2018-7-18 15:10 编辑

大家好,目前我有一个项目,使用8266远程调试用,最近遇到一个问题,在  StartTask_main 任务运行正常的工作程序,以交流电的50HZ周期作为外部中断,一般每次运行20ms的16倍,由于对RTOS不太熟练,8266串口的接收中断里使用全局变量接收服务器发来的控制命令,然后在 StartTask_8266 任务中做解析。最近遇到的问题是,如果在 StartTask_main 中每次发送一组80~100字节的一个数据包,上位机同时下发一个控制命令,这个控制命令会通过UART1发送命令,然后写flash,然后再通过8266回复上位机,这个控制命令发送得太频繁程序就会大部分时间卡在UART接收中断里,但是也不会进入 HardFault_Handler 或者 BusFault_Handler 中,请问这是什么问题?大概要怎么尝试解决?  我 StartTask_main 任务必须以50hz这个中断作为运行起始点,每次必须运行2N个20ms时间,同时还要处理上位机发来的控制命令,处理控制命令不能干扰到 StartTask_main 的时序,应该怎么设置优先级更合理一些?有没有类似程序参考一下结构?
[mw_shl_code=c,true]/* Create the thread(s) */
  /* definition and creation of defaultTask */
  osThreadDef(defaultTask, StartDefaultTask, osPriorityIdle, 0, 128);
  defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);

  /* definition and creation of myTask_main */
  osThreadDef(myTask_main, StartTask_main, osPriorityLow, 0, 512);
  myTask_mainHandle = osThreadCreate(osThread(myTask_main), NULL);

  /* definition and creation of myTask_8266 */
  osThreadDef(myTask_8266, StartTask_8266, osPriorityNormal, 0, 512);
  myTask_8266Handle = osThreadCreate(osThread(myTask_8266), NULL);[/mw_shl_code]

最佳答案

查看完整内容[请看2#楼]

感谢大家回复,经过仿真发现是出现了溢出错误但是HAL库没有能够自动处理,我在发送串口数据的函数里增加了HAL_UART_Receive_IT(&huart1, uart1_rx_buffer, 1)这样一条语句就好了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2017-9-11
在线时间
11 小时
 楼主| 发表于 2018-7-18 14:39:40 | 显示全部楼层
感谢大家回复,经过仿真发现是出现了溢出错误但是HAL库没有能够自动处理,我在发送串口数据的函数里增加了HAL_UART_Receive_IT(&huart1, uart1_rx_buffer, 1)这样一条语句就好了。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2018-7-22 02:12:31 | 显示全部楼层
仿真找问题
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2018-8-8
在线时间
4 小时
发表于 2018-8-8 20:09:49 | 显示全部楼层
看了你的任务处理逻辑,感觉是存在问题的。在中断中接收数据会频繁进入中断,影响其它任务运行。另外在中断函数中处理数据会消耗时间,很容易造成接受数据丢失。既然你用了操作系统,有很多办法可以解决的。如果8266有dma,你可以使用dma接受数据,减小进入中断次数,接收完一帧数据后进入中断发送信号量,通知其它任务处理。如果没有dma,则完全可以使用等待阻塞的方式,把数据接受打包成一个单独的任务
回复

使用道具 举报

18

主题

149

帖子

0

精华

高级会员

Rank: 4

积分
764
金钱
764
注册时间
2015-11-28
在线时间
208 小时
发表于 2018-8-13 16:05:01 | 显示全部楼层
8266怎么个仿真法?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 23:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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