# MCU任务调度器-协程方式 **Repository Path**: panlin_code/mcu_schedule ## Basic Information - **Project Name**: MCU任务调度器-协程方式 - **Description**: 一个使用协程实现的裸机调度器,类似协程库,由于裸机无需过多关心竞态冒险问题,,理论上可以移植到任何MCU平台。 - **Primary Language**: C - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 35 - **Forks**: 13 - **Created**: 2022-06-14 - **Last Updated**: 2025-05-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: C51, stm32, 单片机, mcu ## README # 调度器 #### 介绍 一个使用协程实现的裸机调度器,类似协程库,但任务函数以及接口被封装成近似RTOS用法。通过利用C编译器自带__LINE__宏获取行号,任务阻塞退出时调度器保存当前行作为下次跳转断点,任务等待资源就绪后被唤醒并通过switch(line)跳转到断点继续运行,从而实现任务的调度,由于裸机无需过多关心竞态冒险问题。 #### 任务调度器具备的功能 1.任务数量无限制,取决于RAM/ROM大小 2.协作式任务优先级[0~15](任务主动放弃CPU)。 3.任务等待资源阻塞(通过特殊的宏调用子函数,子函数内部也能阻塞) 4.任务信号 5.消息队列 6.软件定时器 7.通用异步等待接口(新增) 8.延迟调用接口(新增) 9.空闲函数(新增) #### 已做移植的MCU 1. STM32F103 2. STC8A 3. STC8G 4. HC32F460 5. PY32F003 #### 移植文档 移植文档在DOC文件夹 #### 任务优先级 1. 16个优先级,范围是[0~15],数值越小优先级越高 2. 优先级策略可配置 #### 子函数调用接口 1.通过特定的宏调用子函数,子函数则具备调用阻塞类接口的功能 2.子函数嵌套调用深度可配置 #### 阻塞延时 1. 任务延时不影响其他任务的执行,时间到达后任务将被唤醒接着执行,有3个接口 os_delay_tick:阻塞延时单位为tick. os_sleep_ms:阻塞延时单位为毫秒(需要在os_config.h中进行配置 1tick = nMS) os_sleep_s :阻塞延时单位为秒(需要在os_config.h中进行配置 1tick = nMS) #### 任务信号 1.每个任务都绑定一个信号 2.通过给任务对象发送信号,唤醒任务 #### 消息队列 1.消息队列与任务绑定,任务创建时可配置是否使用消息队列 2.采用环形队列 3.消息等待可配置(超时时间/永久等待) 4.消息等待阻塞,收到消息后任务唤醒接着执行,或等待超时唤醒 #### 软件定时器 1.周期定时/单次定时 2.软件定时(轮询中执行)/硬件定时器(在sysTick中断执行) #### 通用异步等待接口(新增) 1.处理函数由用户自定义,处理完成后由返回值决定是否唤醒正在等待的任务。 2.使用通用异步等待接口,实现类同步的编程方式,代码执行流更加的清晰。 #### 延迟调用接口(新增) 轻量的定时器,在某些场景下能代替软件定时器,无需创建,直接一个接口搞定定时,省事 #### 空闲函数接口(新增) 类似于RTOS的空闲钩子函数,调用接口设置空闲函数后,当没有任务被调度时,它将被调用。 #### 调度器使用注意事项 1.任务/任务子函数中的变量如需保持数据,请加static关键字,因为所有的任务都共享一个堆栈,产生任务切换会退出函数 2.不可在任务体使用 switch(){case},只能使用if(){}else if(){}代替 #### 硬件要求 1.内核平台:无要求 (已知C51需要特殊配置) 2.ROM-无裁剪:10K+ 3.ROM-极致裁剪:4.6K+ 4.RAM: 1K+