完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
RTT在空闲的时候可以使用钩子函数执行些简单的任务,例如LED闪烁之类的程序,利用这个功能我们可以做个工作状态指示灯
要使用钩子必须在配置里打开钩子的配置,在rt-config.h里添加HOOK宏定义(如果没有的话) #define RT_USING_HOOK 然后在应用程序里设置钩子函数 #ifdef RT_USING_HOOK rt_thread_idle_sethook(rt_hw_led_flash); #endif 下面就是该怎样实现这个函数了 void rt_hw_led_flash(void) { rt_uint32_t i; rt_hw_led_init(); while (1) { for(i = 0; i < 2700000; i++); //500ms GPIO_WriteBit(state_led_gpio, state_led_pin, (BitAction)(1-GPIO_ReadOutputDataBit(state_led_gpio, state_led_pin))); } } 这样写过之后,在系统空闲的时候就会执行这个函数,当然,如果系统繁忙的时候是不会进入这个idel任务的,不过如果系统一直处于繁忙的状态就是有问题了 另外一点记住,在这个函数里不能调用系统提供的使线程挂起的函数 例如: rt thread delay, rt sem take 等 while (1) { for(i = 0; i < 2700000; i++); //500ms GPIO_WriteBit(state_led_gpio, state_led_pin, (BitAction)(1-GPIO_ReadOutputDataBit(state_led_gpio, state_led_pin))); } 关键是这个while(1)没跳出的,所以全部在这里执行了。 好像还有同学对其中一些并不是完全清楚,所以继续解析下,当做结贴: 1. idle线程是系统中最后一道防线,它将是系统中,如果无其他事可干时的最后能够运行的线程。 -- 所以idle线程不应该被阻塞。如果你有自己的线程能够成为这最后一道防线,那么这个限制将不存在。而对于一些原来系统中放在idle线程中做的工作(例如原来的最终的线程删除动作),在0.4.x中,可以手工调用rt_thread_idle_excute函数来执行。 2. 当系统空闲的时候,idle线程将执行这个钩子函数。 假设钩子函数一次运行会执行1ms,如果idle线程有机会运行200ms,那么钩子函数将被调用200次。 3. 钩子函数运行时,不应该把idle线程总是纠结在这个函数中运行,必须要让idle线程有机会去运行rt_thread_idle_excute函数(因为还有一些事情等待idle线程去处理)。 -- 所以在钩子函数中,不应该使用while(1);的方式。 while(1) { if ( indicator == RT_TRUE) { ....do something } else delay(20ms) } 这样那20ms会执行idle线程吧,问题是idle 20ms够吗,如果我改20ms为5ms呢? 如果没有其他线程处理事务,将转换到idle线程去,通常idle线程中的系统任务会在0.xx ms以内执行完毕 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
AI模型部署边缘设备的奇妙之旅:如何在边缘端部署OpenCV
1591 浏览 0 评论
tms320280021 adc采样波形,为什么adc采样频率上来波形就不好了?
1112 浏览 0 评论
1557 浏览 0 评论
1402 浏览 0 评论
1044 浏览 0 评论
74630 浏览 21 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-19 18:07 , Processed in 0.595714 second(s), Total 71, Slave 55 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号