应用于单片机的简易时间触发调度器
- 在TTSCfg.h中,根据所使用MCU,配置进出临界段宏开关
- 任务初始化
- 在TTSCfg.h中,添加任务名到枚举TaskName中
- 定义一个无返回值无参的任务函数,任务函数不得包含死循环
- 使用TaskCfg结构体配置任务,调用TTS_InitTask函数初始化任务
- TTS使用
- 定义一个空闲任务函数,调用TTS_Init初始化调度器
- 创建任务:调用TTS_CreateTask函数,传入任务指针及延时执行时间,延时执行时间为0则立即执行
- 根据所使用的MCU,及任务执行时间,初始化合适的时基,并在时基中断服务函数中条用TTS_Sched函数 如:使用定时器或系统滴答定时器产生TTS所需时基,建议10ms,过快导致调度频繁,过慢则任务响应延迟
- 调用TTS_Run函数,TTS开始运行
- 与抢占式调度不同,TTS采用的是合作式调度,任务函数体不得包含任何死循环等导致任务无法退出的代码
- 执行时间较长的任务函数建议采用状态机对任务进行分解,分解至一个时基间隔内能够完成的状态函数 状态函数切换状态后,调用TTS_SetTask修改执行周期后再返回,执行周期为0则状态返回后不再执行下一状态 需要重新创建任务,调度器才会再次调度;周期为1则延时1个时基时间后,再执行下一状态。
- 任务函数需要较长延时时,采用2中的方式,分解为延时前状态,延时状态,延时后状态。 延时前状态执行完成时,设置下一执行状态为延时后状态,并调用TTS_SetTask,修改任务循环执行周期为所需延时时间,状态返回 延时后状态执行完成时,设置下一执行状态为延时前状态,并恢复循环执行周期,状态返回。任务便可按照设定周期循环执行
- 对TTS_SetTask函数说明,建议在任务自身状态内调整任务本身的周期以适配各个状态的切换 不建议在任务内调整其他任务的执行周期,避免对其他任务造成影响
- demo.c中简单地示例任务在one和two状态之间50个时基来回切换