嵌入式技术论坛
直播中

向日葵的花季

8年用户 1234经验值
擅长:电源/新能源
私信 关注
[问答]

如何将卡死线程恢复到初始状态呢?

一、使用uwb模块测距,如果模块没加载,uwb线程会卡死,但不会影响其他线程;
二、uwb线程:1.进入后初始化uwb模块;2.while循环中只处理uwb的测距程序;
三、uwb测距,uwb测距使用的是单向测距,其中有一个延时函数(程序就是在这里卡死);
四、想知道:如何将线程重新回复初始化;有相应的函数吗?

回帖(8)

李玉兰

2023-4-17 18:07:42
看syswatch依赖项是RT_Thread 4.0
Nano应该是不行的
不过syswatch本质还是看门狗实现的
你看自己的实际需求,是否可以使用看门狗来实现线程异常的检测?
如果可行,自己添加看门狗也是可以的
举报

李玉兰

2023-4-17 18:07:47
另外你说你的程序运行到 rt_thread_delay(10);后,就不会继续执行循环了。
这应该是被其他线程一直占用cpu了,所以导致你当前的线程无法继续执行。
可以检查下你的所有线程优先级的设置是否合适。。。
举报

向日葵的花季

2023-4-17 18:08:19
一、看门狗已经使用了,不过是作为整个系统的跑飞时的恢复措施;
二、另外卡死,并不是在延时rt_thread_delay(10);而是在uwb_app(),测距函数中,有一个等待回复的while循环(此循环,在模块配置时会配置延时等待时间,时间一到,会直接退出这个循环;但是如果在这个过程中uwb模块因为外界原因,导致模块电压不稳,或者物理损坏,就会直接卡在那个循环里);
三、并且此线程会一直卡在那里,并且不会对其他线程造成影响
四、并且此时,再次对线程模块中写入参数,也是不可行;(硬件上已有方案,就是添加开关;但还是想看看能不能软件解决)
举报

李玉兰

2023-4-17 18:08:28
明白了, 关键在于对uwb模块的使用了
建议搞清楚uwb模块进入while死循环的原因,是硬件故障导致还是软件时序或配置错误导致
如果是硬件故障,只有通过硬件解决。如果是软件原因,才能从软件解决了
可以在while内部增加超时判断,可以检测出uwb故障,但解决还需从uwb模块本身入手了
举报

向日葵的花季

2023-4-17 18:08:38
是的,已在while中添加超时判断,并在一天的测试中,也并没有发现线程卡死现象;这个问题只能是来说是解决了;
举报

向日葵的花季

2023-4-17 18:08:44
不过关于模块出现故障,再次使用软件复位,还是没成功,需要再次研究;
举报

李鑫

2023-4-17 18:08:52
1.线程执行延时函数不是卡在这了,每个线程的while(1)里必须得有延时函数,线程执行完操作后执行延时,释放出CPU去执行别的线程,这是正常的;
2.你这种情况建议可以这样操作:
①如果初始化失败,则不进入while(1)测距,可以在这里等待并循环初始化,直到初始化成功再执行while(1)测距;
②可以在while(1)测距循环中使用跳转语句,当判断需要重新初始化uwb时,跳转到开始的初始化即可。
以上供参考。
举报

向日葵的花季

2023-4-17 18:09:09
感谢
一、回答1,线程中是有延时的
static void uwb_thread_entry(void *parameter)
{
printf(“uwb_thread start\r\n”);

printf("uwb_config\r\n");
//UWB模块初始化配置
uwb_config();
while(1)
{
    /*APP*/
        uwb_app();
    rt_thread_delay(10);
}
二、回答2,初始化并没有失败;至于在循环中添加跳转,这个好像不太行,我之前试过,在每次测距之前,都初始化一变UWB模块,但是初始化后并不能测距(猜测是多次初始化对UWB模块造成了什么错误);
举报

更多回帖

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