系统调度钩子函数

代码:


/* 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);

结果:

在这里插入图片描述
详细文档
链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值