/* * Copyright (c) 2006-2022, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2018-08-24 yangjie the first version */ /* * 程序清单:空闲任务钩子例程 * * 这个例程创建一个线程,通过延时进入空闲任务钩子,用于打印进入空闲钩子的次数 */ #include #include #define THREAD_PRIORITY 20 #define THREAD_STACK_SIZE 1024 #define THREAD_TIMESLICE 5 /* 指向线程控制块的指针 */ static rt_thread_t tid = RT_NULL; /* 空闲函数钩子函数执行次数 */ volatile static int hook_times = 0; /* 空闲任务钩子函数 */ static void idle_hook() { if (0 == (hook_times % 10000)) { rt_kprintf("enter idle hook %d times.\n", hook_times); } rt_enter_critical(); hook_times++; rt_exit_critical(); } /* 线程入口 */ static void thread_entry(void *parameter) { int i = 5; while (i--) { rt_kprintf("enter thread1.\n"); rt_enter_critical(); hook_times = 0; rt_exit_critical(); /* 休眠500ms */ rt_kprintf("thread1 delay 500ms.\n"); rt_thread_mdelay(500); } rt_kprintf("delete idle hook.\n"); /* 删除空闲钩子函数 */ rt_thread_idle_delhook(idle_hook); rt_kprintf("thread1 finish.\n"); } int idle_hook_sample(void) { /* 设置空闲线程钩子 */ rt_thread_idle_sethook(idle_hook); /* 创建线程 */ tid = rt_thread_create("thread1", thread_entry, RT_NULL, THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); if (tid != RT_NULL) rt_thread_startup(tid); return 0; } /* 导出到 msh 命令列表中 */ MSH_CMD_EXPORT(idle_hook_sample, idle hook sample);