代码:
/* hook thread define start*/
#define HOOK_THREAD_PRIORITY 20
#define HOOK_THREAD_STACK_SIZE 1024
#define HOOK_THREAD_TIMESLICE 10
ALIGN(RT_ALIGN_SIZE) // 设置为字节对齐
static rt_uint8_t hook_thread_stack1[HOOK_THREAD_STACK_SIZE]; // 线程的堆栈
static rt_uint8_t hook_thread_stack2[HOOK_THREAD_STACK_SIZE]; // 线程的堆栈
static struct rt_thread hook_tid1; // 线程控制块1
static struct rt_thread hook_tid2; // 线程控制块2
// 针对每个线程的计数器
volatile rt_uint32_t count[2];
/*hook thread define end*/
/* 线程1,2共用一个入口,但入口参数不同 */
static void hook_thraed_entry(void* parameter)
{
rt_uint32_t value; // 接收线程传递的参数
value = (rt_uint32_t)parameter;
while(1)
{
rt_kprintf("thread %d is running,thread %d count = %d\n",value,value,count[value-1]++); // 输出是那个线程运行
rt_thread_delay(1000); // 延时1s
}
}
static void hook_of_scheduler(struct rt_thread* from,struct rt_thread* to)
{
rt_kprintf("from: %s --> to: %s\n", from->name,to->name); // 调度钩子函数,打印调度的线程信息
}
int scheduler_hook_thread(void)
{
rt_err_t re; // 创建线程返回值
/* 设置调度器钩子 */
rt_scheduler_sethook(hook_of_scheduler);
/* 静态创建线程 */
/* 初始化线程1 */
re = rt_thread_init(&hook_tid1, // 接收线程的指针
"thread1", // 线程的名字
hook_thraed_entry, // 线程的入口函数
(void*)1, // 线程入口函数的参数
hook_thread_stack1, // 线程的堆栈
HOOK_THREAD_STACK_SIZE, // 线程堆栈的大小
HOOK_THREAD_PRIORITY, // 线程的优先级
HOOK_THREAD_TIMESLICE); // 线程的时间片
if(re == RT_EOK) // 线程创建成功
{
/* 启动线程 */
rt_thread_startup(&hook_tid1); // 启动线程
}
/* 初始化线程2 */
re = rt_thread_init(&hook_tid2, // 接收线程的指针
"thread2", // 线程的名字
hook_thraed_entry, // 线程的入口函数
(void*)2, // 线程入口函数的参数
hook_thread_stack2, // 线程的堆栈
HOOK_THREAD_STACK_SIZE, // 线程堆栈的大小
HOOK_THREAD_PRIORITY, // 线程的优先级
HOOK_THREAD_TIMESLICE); // 线程的时间片
if(re == RT_EOK) // 线程创建成功
{
/* 启动线程 */
rt_thread_startup(&hook_tid2); // 启动线程
}
return 0; // 返回
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(scheduler_hook_thread, scheduler_hook_thread sample);
结果:
详细文档
链接