RT_Thread 定时器调用几次超时函数之后,系统挂起,原因不明。请教一下
程序中定义了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()函数,否则会死机。 用0.4.x版本的代码来试试,0.3.0正式版中rt_thread_timeout中有个地方有些问题。0.3.1分支会把这些bug的修复情况从0.4.x上合并过来。
页:
[1]