|
程序中定义了3个定时器,都设置成为了 周期触发调用超时函数。
我在一个定时器中的超时函数中,只对某一个任务发送一个系统图标更新事件,
void GUI_System_State_Line(void *parameter)
{
rt_event_send(System_GUI_event,System_Screen_Line_Updata_Event);
}
这个定时器超时函数调用6次以后,退出切换任务,调用rt_thread_timeout( )函数,卡在函数断言处
void rt_thread_timeout(void* parameter)
{
struct rt_thread* thread;
thread = (struct rt_thread*) parameter;
/* thread check */
RT_ASSERT(thread != RT_NULL);
RT_ASSERT(thread->stat == RT_THREAD_SUSPEND);// 程序一直卡在这里,不在运行了。
/* set error number */
thread->error = -RT_ETIMEOUT;
/* remove from suspend list */
rt_list_remove(&(thread->tlist));
/* insert to schedule ready list */
rt_schedule_insert_thread(thread);
/* do schedule */
rt_schedule();
}
我通过单步跟踪,在卡住之前,系统的各个任务都是出于等待各自消息队列中的消息状态,而各个消息队列都是为空。而等待设置为 RT_WAITING_FOREVER;
故系统实际出于空闲状态。 我将此定时器停止,不启动运行,系统就一直运行良好,不会死机。
请教各位,定时器功能应用需要注意什么特别的地方? 我只发现在定时器超时函数中,不能调用rt_thread_delay()函数,否则会死机。 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|