# MCU任务调度器(裸机) **Repository Path**: miniwave/mcu_schedule ## Basic Information - **Project Name**: MCU任务调度器(裸机) - **Description**: 一款利用编译器内置宏___LINE__实现的裸机任务调度器(非软件定时器),它的接口以及用法近似RTOS,它并不通过修改CPU寄存器实现上下文切换,理论上可移植到任何内核平台(已知C51内核需要进行特殊配置),并且无需过多关心竞态问题。 - **Primary Language**: C - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 16 - **Created**: 2022-12-10 - **Last Updated**: 2022-12-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: fork ## README # MCU裸机任务调度器 #### 介绍 这是一个裸机任务调度器,任务函数以及接口接近于常用的RTOS用法,应用移植到RTOS仅需修改RTOS的接口。它通过利用C编译器自带__LINE__宏获取行号,任务阻塞退出时调度器保存当前行作为下次跳转断点,任务等待资源就绪后被唤醒并通过switch(line)跳转到断点继续运行,从而实现任务的调度,由于裸机无需过多关心竞态冒险问题。 #### 任务调度器具备的功能 1.任务数量无限制,取决于RAM大小 2.不可抢占式任务优先级[0~15] 3.任务等待资源阻塞(通过宏调用子函数,子函数内部也能阻塞) 4.任务信号 5.消息队列 6.软件定时器 #### 组件 1.按钮组件(短按/短按释放/长按/长按释放/长按连发模式/长按连发模式释放/双击) 2.引入其他开源printf库 3.PID库(内含有 野火多功能串口助手-PID调试助手的通信协议C文件,可快速调用接口通信) 4.更多组件会持续更新。。。 #### 已做移植的MCU 1. STM32F103 2. STC8A 3. STC8G 4. HC32F460 5. PY32F003 #### 源码目录结构 ![目录结构](Doc/%E6%BA%90%E7%A0%81%E7%9B%AE%E5%BD%95%E7%BB%93%E6%9E%84.jpg) #### 调度器工作原理 ![工作原理](Doc/MCU%E8%B0%83%E5%BA%A6%E5%99%A8%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86.jpg) #### 移植文档 移植文档在DOC文件夹 #### 任务优先级 1. 16个优先级,范围是[0~15],数值越小优先级越高 2. 优先级策略可配置 #### 子函数调用接口 1.通过特定的宏调用子函数,子函数则具备调用阻塞类接口的功能 2.子函数嵌套调用深度可配置(默认8个子函数嵌套) #### 阻塞延时 1. 任务延时不影响其他任务的执行,时间到达后任务将被唤醒接着执行,有3个接口 os_delay_tick:阻塞延时单位为tick. os_task_sleep_ms:阻塞延时单位为毫秒(需要在os_config.h中进行配置 1tick = nMS) os_task_sleep_s :阻塞延时单位为秒(需要在os_config.h中进行配置 1tick = nMS) #### 任务信号 1.每个任务都绑定一个信号 2.通过给任务对象发送信号,唤醒任务 #### 消息队列 1.消息队列与任务绑定,任务创建时可配置是否使用消息队列 2.采用环形队列 3.消息等待可配置(超时时间/永久等待) 4.消息等待阻塞,收到消息后任务唤醒接着执行,或等待超时唤醒 #### 软件定时器 1.周期定时/单次定时 2.软件定时/硬件定时器(在sysTick中断运行) #### 调度器使用注意事项 1.任务/任务子函数中的变量如需保持数据,请加static关键字,因为所有的任务都共享一个堆栈,产生任务切换会退出函数 2.不可在任务体使用 switch(){case},只能使用if(){}else if(){}代替 #### 硬件要求 1.内核平台:无要求 2.ROM:10K+ 3.RAM: 1K+(创建32个不带消息队列的任务)