完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
大家好,目前我有一个项目,使用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 的时序,应该怎么设置优先级更合理一些?有没有类似程序参考一下结构?
[C] 纯文本查看 复制代码 /* 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); |
|
相关推荐
4个回答
|
|
感谢大家回复,经过仿真发现是出现了溢出错误但是HAL库没有能够自动处理,我在发送串口数据的函数里增加了HAL_UART_Receive_IT(&huart1, uart1_rx_buffer, 1)这样一条语句就好了。
|
|
|
|
仿真找问题
|
|
|
|
看了你的任务处理逻辑,感觉是存在问题的。在中断中接收数据会频繁进入中断,影响其它任务运行。另外在中断函数中处理数据会消耗时间,很容易造成接受数据丢失。既然你用了操作系统,有很多办法可以解决的。如果8266有dma,你可以使用dma接受数据,减小进入中断次数,接收完一帧数据后进入中断发送信号量,通知其它任务处理。如果没有dma,则完全可以使用等待阻塞的方式,把数据接受打包成一个单独的任务
|
|
|
|
8266怎么个仿真法?
|
|
|
|
只有小组成员才能发言,加入小组>>
710 浏览 0 评论
1120 浏览 1 评论
2497 浏览 5 评论
2836 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2677 浏览 6 评论
使用eim外接fpga可是端口一点反应都没有有没有大哥指点一下啊
662浏览 9评论
673浏览 7评论
请教大神怎样去解决iMX6Q在linux3.0.35内核上做AP失败的问题呢
791浏览 6评论
638浏览 5评论
681浏览 5评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-27 13:26 , Processed in 0.986779 second(s), Total 84, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号