嵌入式技术william hill官网
直播中

麻酱

9年用户 1284经验值
擅长:MEMS/传感技术
私信 关注
[问答]

为什么在线程中用rt_delay挂起线程的时候会死呢?

问题1:

我最近在做一个程序,要通过串口读取外部设备发来的串口数据,然后判断和匹配

那么我思路是这样的:中断接收到一个包,就发送一个邮箱,然后建立一个等待线程,建立一个处理线程,如果按照谁急迫谁优先的话,那么显然接收线程应该高,但是问题来了,倘若接收线程大于处理线程,数据一直来,所以接收线程一直抢占,处理线程没有时间处理,这样也就没有意义,反过来,接收线程小于处理线程,那么当处理线程在处理的时候接收线程就不能保存来自串口的数据,丢失掉,肿木办?

问题2:

为什么在线程中用rt_delay挂起线程的时候会死呢?而在某些线程中却是没问题,我遇到过,比如说一个线程在等一个报警事件,当这个事件来临的时候我要鸣响警笛,延续5秒之后关闭,就是这个5秒我用的系统延时,按理说5秒之后应该进入这个线程,可是他开了就不关闭了,这个延时一旦被调用那么这个线程就会挂起,时间到了没有其他优先级更高的线程的话就会重新进入,但是确实没进入。难道是他挂起后,有别的比他优先级高的一直占用处理机?未可知?

问题3:

LWIP的网络。比如说我建立了一个SOCKET,然后在这个上面等待连接,如果有链接进来会被唤醒并且进入接收数据,但是为什么我进入连接之后向远端IP发送数据后出现了一个很奇怪的现象,线连的状态不确定,但是物理层工作正常,LWIP的三服务都正常,就是没有数据进来了,很郁闷。这个现象也是我测试的时候无意发现的,而且所有的上层网络相应都没有了,物理层还在那里正常的工作,跟踪数据发现到TCP、ip服务线程那里都给丢掉了!什么原因呢?奇怪。。。

回帖(2)

杨丽

2022-11-2 11:25:31
问题1.我最近做的一个项目也差不多。提供以下两种思路:

(1)数据接收,处理放在同一个线程下,接收到就处理。(不知道你的处理是否很复杂)
(2)将这数据接收和处理线程设置为相同的优先级,然后根据实际情况分配时间片,我是这么做的,我做的项目显示这样做一般不会破坏实时性,响应速度也很快。当然也和你的数据量有关,数据量较大或处理较复杂的时候不知道是否可行。

问题2.最好贴代码让大家看看吧,或者自己单步跟踪看看。

问题3.没研究过LWIP。。。

希望对你有帮助
举报

王萍

2022-11-2 11:25:42
并不是优先级的问题,而是处理能力的问题。
当处理线程处理不完时,肯定会导致丢包。但如果是突发情况,可以加缓冲以平衡处理速度。
比较好的方式是mail box。

调试。另外,需要记住,不要在定时器超时函数中再调用rt_thread_delay()函数;

“但是为什么我进入连接之后向远端IP发送数据后出现了一个很奇怪的现象,线连的状态不确定” 看不太明白。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分