打印
[应用相关]

stm32 入门RT-Thread内核 空闲线程和两个常用的钩子函数

[复制链接]
906|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
空闲线程
空闲线程是一个比较特殊的系统线程,它具备最低优先级,当系统中无其他就绪态线程可运行时,调度器将调度到空闲线程。空闲线程还负责一些系统资源的回收以及将一些处于关闭态的线程从线程调度列表中移除的动作。空闲任务在形式上是一个无限循环结构,且永远不被挂起。

使用特权

评论回复
沙发
一路向北lm|  楼主 | 2021-1-10 22:03 | 只看该作者
空闲线程钩子函数
RT-Thread实时操作系统中的空闲线程向用户提供了钩子函数,空闲线程钩子函数可以让系统在空闲的时候执行一些非紧急的事物,例如系统运行指示闪烁,CPU使用率统计等。

使用特权

评论回复
板凳
一路向北lm|  楼主 | 2021-1-10 22:03 | 只看该作者
空闲线程两个钩子函数:
设置钩子函数  rt_err_t rt_thread_idle_sethook(void (*hook)(void));
删除钩子函数  rt_err_t rt_thread_idle_delhook(void (*hook)(void));

使用特权

评论回复
地板
一路向北lm|  楼主 | 2021-1-10 22:04 | 只看该作者
空闲线程钩子函数使用注意:
    空闲线程是一个线程状态永远为就绪态的线程,所有钩子函数中执行的相关代码必须保证空闲线程在任何时刻都不会被挂起,例如执行rt_thread_delay()、rt_sem_take()等,可能会导致线程挂起,因此不能在钩子函数中使用。此外,空闲线程可以设置多个钩子函数。

使用特权

评论回复
5
一路向北lm|  楼主 | 2021-1-10 22:04 | 只看该作者
基于STM32空闲线程钩子函数具体实例(CPU的占用率统计):
统计原理: 在相同时间内,统计CPU在不调度的情况和CPU在调度情况下变量的计数值,得出CPU空闲率,CPU的占用率 = 1 - CPU空闲率。
定义钩子函数 : static void cpu_usage_idle_hook(void);
将钩子函数添加到空闲线程中:  rt_thread_idle_sethook(cpu_usage_idle_hook);

使用特权

评论回复
6
一路向北lm|  楼主 | 2021-1-10 22:04 | 只看该作者
定义钩子函数代码实现:
#define CPU_USAGE_TICK     10
#define CPU_USAGE_LOOP     100
rt_uint8_t  cpu_usage_integer = 0;
rt_uint8_t  cpu_usage_decimal = 0;
// 空闲线程钩子函数 ,统计CPU利用率
static void cpu_usage_idle_hook(void)
{
    volatile rt_tick_t   tick  = 0;
    volatile rt_uint32_t count = 0;
    volatile rt_uint32_t loop  = 0;
    if(cpu_usage_count == 0)
    {
        rt_enter_critical();
        tick = rt_tick_get();
        while((rt_tick_get() - tick) < CPU_USAGE_TICK)
        {
            cpu_usage_count++;
            loop = 0;
            while(loop < CPU_USAGE_LOOP)
            {
                loop++;
            }
        }
        rt_exit_critical();
    }
    count = 0;
    tick  = rt_tick_get();
    while((rt_tick_get() - tick) < CPU_USAGE_TICK)
    {
        count++;
        loop = 0;
        while(loop < CPU_USAGE_LOOP)
        {
            loop++;
        }
    }

/* Calculate STM32 CPU Usage */
    if(count < cpu_usage_count)
    {
        count = cpu_usage_count - count;
        cpu_usage_integer =  (count * 100) / cpu_usage_count;
        cpu_usage_decimal = ((count * 100) % cpu_usage_count) * 100 / cpu_usage_count;
    }
    else
    {
        cpu_usage_count = count;
        cpu_usage_integer = 0;
        cpu_usage_decimal = 0;
    }
}


使用特权

评论回复
7
一路向北lm|  楼主 | 2021-1-10 22:05 | 只看该作者
效果展示:我只点亮了两个灯

使用特权

评论回复
8
一路向北lm|  楼主 | 2021-1-10 22:05 | 只看该作者
系统调度钩子函数
系统的上下文切换是系统运行过程中最普遍的事件,有时候可能会想知道在某一个时刻发生了什么样的线程切换,RT-Thread向用户提供了一个系统调度钩子函数,这个钩子函数在系统任务切换时运行,通过这个钩子函数,我们可以了解到系统任务调度的一些信息。
void rt_scheduler_sethook(void (*hook)(rt_thread_t from, rt_thread_t to));

使用特权

评论回复
9
一路向北lm|  楼主 | 2021-1-10 22:06 | 只看该作者
基于STM32系统调度钩子函数具体实例:
static rt_thread_t  led1_thread = RT_NULL;
static rt_thread_t  led2_thread = RT_NULL;
// 入口函数
void led1_task(void *parameter)
{
    while(1)
                {
      LED1_TURN;
                   rt_thread_mdelay(1000);         
                }        
}
void led2_task(void *parameter)
{
    while(1)
                {
                  LED2_TURN;
                  rt_thread_mdelay(500);
                }       
}
// 系统调度钩子函数
static void hook_of_scheduler(struct rt_thread *from, struct rt_thread *to)
{
         rt_kprintf("form %s---> to %s\n",from->name,to->name);
}

// 添加系统调度钩子函数,创建线程并开启
rt_scheduler_sethook(hook_of_scheduler);
        led1_thread = rt_thread_create("led1",led1_task,RT_NULL,256,3,10);
        led2_thread = rt_thread_create("led2",led2_task,RT_NULL,256,3,5);
       
        if(led1_thread != RT_NULL)
                  rt_thread_startup(led1_thread);
  else
                 return -1;
        if(led2_thread != RT_NULL)
                  rt_thread_startup(led2_thread);
  else       
           return -1;


使用特权

评论回复
10
一路向北lm|  楼主 | 2021-1-10 22:06 | 只看该作者
系统任务调度的一些信息效果如下:

使用特权

评论回复
11
guanjiaer| | 2021-2-3 23:06 | 只看该作者
一直以为空闲的是一直被挂起的呢

使用特权

评论回复
12
heimaojingzhang| | 2021-2-3 23:08 | 只看该作者
偶没有可能永远不会执行空闲任务呢

使用特权

评论回复
13
keaibukelian| | 2021-2-3 23:10 | 只看该作者
最后的哪个调度信息是怎么显示的呢

使用特权

评论回复
14
labasi| | 2021-2-3 23:13 | 只看该作者
一直连接不了钩子的定义

使用特权

评论回复
15
paotangsan| | 2021-2-3 23:16 | 只看该作者
没有接触过的人很难理解

使用特权

评论回复
16
一路向北lm|  楼主 | 2021-2-4 17:06 | 只看该作者
guanjiaer 发表于 2021-2-3 23:06
一直以为空闲的是一直被挂起的呢

这会知道了吧

使用特权

评论回复
17
一路向北lm|  楼主 | 2021-2-4 17:06 | 只看该作者
paotangsan 发表于 2021-2-3 23:16
没有接触过的人很难理解

是的,感觉来逛ST论坛的大部分都知道

使用特权

评论回复
18
一路向北lm|  楼主 | 2021-2-4 17:07 | 只看该作者
labasi 发表于 2021-2-3 23:13
一直连接不了钩子的定义

理解不了?

使用特权

评论回复
19
一路向北lm|  楼主 | 2021-2-4 17:07 | 只看该作者
keaibukelian 发表于 2021-2-3 23:10
最后的哪个调度信息是怎么显示的呢

可以深入研究一下源码

使用特权

评论回复
20
一路向北lm|  楼主 | 2021-2-4 17:08 | 只看该作者
heimaojingzhang 发表于 2021-2-3 23:08
偶没有可能永远不会执行空闲任务呢

那CPU的利用率不就是 100%了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

273

主题

3745

帖子

74

粉丝