平台stm32f407
lwip版本2.1.2
rtthread版本5.1.0
今天偶然发现设备在运行过程中插(偶尔出现)、拔(必现)网线会出现rt_sem_release中RT_ASSERT(rt_object_get_type(&sem->parent.parent) == RT_Object_Class_Semaphore)这个断言错误
//断言错误位置
RT_ASSERT(rt_object_get_type(&sem->parent.parent) == RT_Object_Class_Semaphore);
注掉断言增加打印
// RT_ASSERT(rt_object_get_type(&sem->parent.parent) == RT_Object_Class_Semaphore);
if (!(rt_object_get_type(&sem->parent.parent) == RT_Object_Class_Semaphore))
{
rt_thread_t pid = rt_thread_self();
char name[8] = {0};
rt_err_t ret = rt_thread_get_name(pid, name, 8);
rt_kprintf("fail pthread name[%s], ret[%d].\n", pid->parent.name, ret);
rt_kprintf("SEM ERROR : name[%s].\n", sem->parent.parent.name);
rt_kprintf("SEM ERROR : type[%d].\n", sem->parent.parent.type);
rt_kprintf("SEM ERROR : flag[%d].\n", sem->parent.parent.flag);
rt_kprintf("get type : flag[%d].\n", rt_object_get_type(&sem->parent.parent));
while(1);
}
打印结果如下:
msh />fail pthread name[tidle0], ret[0].
SEM ERROR : name[stimer].
SEM ERROR : type[31].
SEM ERROR : flag[0].
get type : flag[31].
这种情况让我很困惑:
1.为什么会出现打印出idle线程的名字。
2.stimer信号量我追踪了一下,并没有出现连续release 2次的情况,就是在正常release时后出现的,不知道为什么会造成这种结果。
这方面的调试经验不多,还请大家指教,感谢。
感谢回复,这里我比较困惑的是为什么会在断言错误点打印出idle的的线程名来,是真有这个可能?还是说这个打印已经是错误的了?
rt_thread_t pid = rt_thread_self();
没有加锁,可能在执行这条语句前,调度器已经发生调度,当系统负载不高,CPU大多时间在空闲线程,这里获取到的可能就是空闲线程,理论上来说多调试打印,可能也会打印其他线程名。
可参考
rt_sem_release()这里在打印获取当前线程是加了锁的。
再次感谢回复,我再研究一下