rt_thread_idle_sethook(根据tick灯变化闪烁);空闲函数跑了一会,就不再执行,其他线程正常执行
以下是根据你提供的截图,开展的一段简单分析思路,供参考。
看到你的log中,tidle0线程的Error是-2,表示-RT-ETIMEOUT。
使用list_thread或者ps命令,打印线程的信息,会打印变量thread->error,即线程error状态。
在RT的源代码中,使得thread->error为-2的语句只有5条。
使用CTRL+H在整个工程中搜索,分别在rt_mutex_take、rt_event_recv、rt_mb_recv、rt_mq_recv和rt_thread_timeout函数中。
因此,你重点看一下,你设置的hook函数中到底发生了什么?是不是你的钩子函数存在等待某种资源的操作?
钩子函数必须足够简单,且不要存在阻塞(Block)或者挂起(Suspend)的操作。
另外,值得注意的还有以下两点:
rt_thread_idle_sethook函数只需要调用一次,设置钩子函数即可,即将某个函数指针写入到idle_hook_list数组中。
idle线程中,会依次从idle_hook_list数组中取出函数指针变量,当它不为空,则调用钩子函数。调用钩子函数完毕后,再执行rt_defunct_execute函数释放各种资源。
从你的描述来看,你设置钩子函数使得led按照tick闪烁,应该是在hook中调用了rt_thread_delay之类的操作吧。
空闲是根据数值累加,led进行反转,不涉及延时
@123456wl
如果没有用delay之类的操作,单纯在hook中通过tick差值进行判断来点灯,我想不出来其他原因了。
能否放出你的hook代码?