加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

RT-Thread 空闲钩子的使用方法

(2014-04-23 21:31:34)
分类: RT-Thread
研究了几天RTT,不得不被 FFXZ 的编程技巧所折服

大家知道,在系统空闲的时候才会运行idel线程.

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


1 楼
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)没跳出的,所以全部在这里执行了。
2楼
好像还有同学对其中一些并不是完全清楚,所以继续解析下,当做结贴:
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);的方式。
3楼

while(1)
{
   if ( indicator == RT_TRUE)
   {
      ....do something
   }
   else
      delay(20ms)
}
这样那20ms会执行idle线程吧,问题是idle 20ms够吗,如果我改20ms为5ms呢?
4楼
如果没有其他线程处理事务,将转换到idle线程去,通常idle线程中的系统任务会在0.xx ms以内执行完毕



文章来源

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有