swordlife 发表于 2010-6-14 17:21:36

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()函数,否则会死机。

ffxz 发表于 2010-6-14 19:02:11

用0.4.x版本的代码来试试,0.3.0正式版中rt_thread_timeout中有个地方有些问题。0.3.1分支会把这些bug的修复情况从0.4.x上合并过来。
页: [1]
查看完整版本: RT_Thread 定时器调用几次超时函数之后,系统挂起,原因不明。请教一下