news 2026/6/21 4:31:14

【deepseek】多任务调度详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【deepseek】多任务调度详解

RT-Thread 多任务调度详解

📊 调度器架构

RT-Thread 采用基于优先级的抢占式调度,支持时间片轮转

1. 任务状态

// 任务状态定义RT_THREAD_INIT// 初始状态RT_THREAD_READY// 就绪状态RT_THREAD_RUNNING// 运行状态RT_THREAD_SUSPEND// 挂起状态RT_THREAD_CLOSE// 关闭状态

2. 优先级管理

  • 优先级范围:0-255(0最高,255最低)
  • 系统优先级:0-31(系统线程)
  • 用户优先级:32-255(用户线程)
  • 相同优先级:支持时间片轮转调度

🔄 调度策略

抢占式调度

// 高优先级任务抢占低优先级任务voidhigh_priority_task(void*param){while(1){rt_kprintf("High priority task running\n");rt_thread_mdelay(1000);}}voidlow_priority_task(void*param){while(1){rt_kprintf("Low priority task running\n");rt_thread_mdelay(1000);}}// 创建任务(优先级不同)rt_thread_create("high",high_priority_task,NULL,512,10,10);rt_thread_create("low",low_priority_task,NULL,512,20,10);

时间片轮转

// 相同优先级任务使用时间片staticvoidtask1_entry(void*parameter){while(1){rt_kprintf("Task1 running\n");rt_thread_delay(5);// 主动让出CPU}}staticvoidtask2_entry(void*parameter){while(1){rt_kprintf("Task2 running\n");rt_thread_delay(5);}}// 创建相同优先级任务,设置时间片rt_thread_ttask1=rt_thread_create("task1",task1_entry,NULL,512,10,10);// 优先级10,时间片10 ticksrt_thread_ttask2=rt_thread_create("task2",task2_entry,NULL,512,10,10);// 优先级10,时间片10 ticks

⚙️ 调度相关API

任务控制

// 创建线程rt_thread_trt_thread_create(constchar*name,void(*entry)(void*parameter),void*parameter,rt_uint32_tstack_size,rt_uint8_tpriority,rt_uint32_ttick);// 启动线程rt_err_trt_thread_startup(rt_thread_tthread);// 删除线程rt_err_trt_thread_delete(rt_thread_tthread);// 挂起线程rt_err_trt_thread_suspend(rt_thread_tthread);// 恢复线程rt_err_trt_thread_resume(rt_thread_tthread);// 让出CPUrt_err_trt_thread_yield(void);

延时函数

// 系统延时(基于系统节拍)rt_err_trt_thread_delay(rt_tick_ttick);// 相对延时rt_err_trt_thread_sleep(rt_tick_ttick);// 同delayrt_err_trt_thread_mdelay(rt_int32_tms);// 毫秒延时// 绝对时间延时rt_err_trt_thread_delay_until(rt_tick_t*tick,rt_tick_tinc_tick);

📈 调度器工作流程

调度触发时机

  1. 主动触发

    rt_thread_yield();// 主动让出CPUrt_thread_delay();// 延时等待rt_thread_suspend();// 挂起自己
  2. 被动触发

    • 中断处理完成时
    • 任务状态改变时
    • 时间片用完时
    • 优先级改变时

调度器源码简析

// 调度器核心(简化版)voidrt_schedule(void){// 1. 查找最高优先级就绪任务structrt_thread*to_thread;to_thread=_get_highest_priority_thread();// 2. 检查是否需要切换if(to_thread!=rt_current_thread){// 3. 执行上下文切换rt_hw_context_switch((rt_uint32_t)&rt_current_thread->sp,(rt_uint32_t)&to_thread->sp);}}

🎯 调度示例

示例1:优先级演示

#include<rtthread.h>staticrt_thread_ttid1,tid2,tid3;staticvoidthread1_entry(void*parameter){rt_uint32_tcount=0;while(1){rt_kprintf("thread1 count: %d\n",count++);rt_thread_mdelay(500);// 延时500ms}}staticvoidthread2_entry(void*parameter){rt_uint32_tcount=0;while(1){rt_kprintf("thread2 count: %d\n",count++);rt_thread_mdelay(1000);// 延时1s}}staticvoidthread3_entry(void*parameter){rt_uint32_tcount=0;while(1){rt_kprintf("thread3 count: %d\n",count++);rt_thread_mdelay(2000);// 延时2s}}intscheduler_demo(void){// 创建三个不同优先级的线程tid1=rt_thread_create("thread1",thread1_entry,RT_NULL,1024,6,10);tid2=rt_thread_create("thread2",thread2_entry,RT_NULL,1024,7,10);tid3=rt_thread_create("thread3",thread3_entry,RT_NULL,1024,8,10);// 启动线程if(tid1!=RT_NULL)rt_thread_startup(tid1);if(tid2!=RT_NULL)rt_thread_startup(tid2);if(tid3!=RT_NULL)rt_thread_startup(tid3);return0;}

示例2:时间片轮转

#include<rtthread.h>#defineTHREAD_STACK_SIZE512#defineTHREAD_PRIORITY10#defineTHREAD_TIMESLICE5// 5个tick的时间片staticvoidthread_entry(void*parameter){rt_uint32_tvalue;rt_uint32_tcount=0;value=(rt_uint32_t)parameter;while(1){rt_kprintf("thread %d is running, count = %d\n",value,count++);// 长时间运行,测试时间片切换for(inti=0;i<1000000;i++);}}inttimeslice_demo(void){rt_thread_ttid;// 创建两个相同优先级的线程tid=rt_thread_create("thread1",thread_entry,(void*)1,THREAD_STACK_SIZE,THREAD_PRIORITY,THREAD_TIMESLICE);if(tid!=RT_NULL)rt_thread_startup(tid);tid=rt_thread_create("thread2",thread_entry,(void*)2,THREAD_STACK_SIZE,THREAD_PRIORITY,THREAD_TIMESLICE);if(tid!=RT_NULL)rt_thread_startup(tid);return0;}

🔍 调度调试技巧

1. 使用 Finsh 命令

# 查看线程状态list_thread# 输出示例thread pri status sp stack size max used left tick error -------- --- ------- ---------- ---------- ------ ---------- --- thread110running 0x00000060 0x0000020028% 0x0000000a 000 thread210ready 0x00000060 0x0000020030% 0x0000000a 000 tshell20ready 0x00000080 0x0000100015% 0x0000000a 000

2. 调度器钩子函数

// 注册调度器钩子voidmy_scheduler_hook(structrt_thread*from,structrt_thread*to){rt_kprintf("switch from [%s] to [%s]\n",from->name,to->name);}// 安装钩子rt_scheduler_sethook(my_scheduler_hook);

⚠️ 注意事项

  1. 优先级反转问题

    • 使用互斥锁的优先级继承机制
    • 避免高优先级任务等待低优先级任务
  2. 堆栈大小设置

    • 根据函数调用深度合理设置
    • 使用list_thread检查堆栈使用率
  3. 中断处理

    • 中断中不能使用可能导致阻塞的API
    • 快速处理,将耗时操作放到线程中
  4. 死锁预防

    • 按固定顺序获取多个锁
    • 设置超时机制

📊 性能优化建议

  1. 减少上下文切换

    • 合理设置时间片大小
    • 避免频繁创建/删除线程
  2. 优先级设置策略

    • I/O密集型任务:较低优先级
    • 计算密集型任务:较高优先级
    • 实时任务:最高优先级
  3. 使用静态线程

    // 静态线程创建(无动态内存分配)staticstructrt_threadthread;staticrt_uint8_tthread_stack[512];rt_thread_init(&thread,"static",thread_entry,RT_NULL,&thread_stack[0],sizeof(thread_stack),10,10);

需要我详细讲解调度算法实现、优先级反转解决方案或具体应用场景吗?

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/17 14:48:09

从职业烧伤到AI心理教练:开发者的自愈之路

在软件测试领域&#xff0c;职业倦怠&#xff08;俗称“职业烧伤”&#xff09;已成为普遍挑战&#xff0c;源于高强度工作、项目压力和创新需求匮乏。数据显示&#xff0c;2026年初&#xff0c;测试从业者离职率上升&#xff0c;部分原因包括长时间调试代码、应对紧急交付和缺…

作者头像 李华
网站建设 2026/6/10 21:58:48

20260205_183713_Agent四大范式___CRITIC:吴恩达力推Agent设

摘要 近期大型语言模型&#xff08;LLMs&#xff09;的进展令人瞩目。然而&#xff0c;这些模型偶尔会出现矛盾和问题行为&#xff0c;比如虚构事实、编写错误代码或产生攻击性内容。与人类不同&#xff0c;人类通常会借助外部工具来核实和优化他们的内容&#xff0c;例如利用搜…

作者头像 李华
网站建设 2026/6/13 16:34:05

manipulation十年演进

Manipulation&#xff08;操作/操纵&#xff09; 的十年&#xff08;2015–2025&#xff09;&#xff0c;是从“预定义轨迹的重复机械臂”向“具备人类级触觉与通用能力的柔性手”演进的十年。 这十年间&#xff0c;机器人操作的核心挑战从**“精确抓取”转向了“非结构化环境下…

作者头像 李华
网站建设 2026/6/18 20:41:52

计算机毕业设计springboot基于Java的校园内餐厅外送系统 高校智慧餐饮配送服务平台的设计与实现 基于微服务架构的校内食堂在线订餐系统

计算机毕业设计springboot基于Java的校园内餐厅外送系统k8i4c0gg&#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。 随着移动互联网技术的快速发展和校园生活节奏的加快&#xff0c…

作者头像 李华
网站建设 2026/6/18 23:37:18

计算机毕业设计springboot智慧社区服务平台 基于SpringBoot的社区数字化管理与生活服务平台 SpringBoot框架下的智能小区综合服务系统

计算机毕业设计springboot智慧社区服务平台434iut16 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。随着城镇化进程持续推进&#xff0c;传统社区管理模式面临效率低下、服务单一…

作者头像 李华
网站建设 2026/6/17 20:11:08

AI写论文哪个软件最好?实测5款热门工具,虎贲等考AI凭6大维度碾压

毕业季的论文战场&#xff0c;AI工具已成刚需&#xff0c;但“生成内容空洞”“文献虚假”“查重率飙红”等问题让学子们踩坑不断。AI写论文哪个软件最好&#xff1f;我们耗时15天&#xff0c;以“本科经管类硕士工科类毕业论文”为统一任务&#xff0c;实测虎贲等考AI、ChatGP…

作者头像 李华