# cotTask **Repository Path**: MagicBude/cot_task ## Basic Information - **Project Name**: cotTask - **Description**: 嵌入式设备中使用定时器实现任务调度的模块组件代码 - **Primary Language**: C - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-06-16 - **Last Updated**: 2025-06-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 轻量级任务调度模块(增强注释版) 本项目基于[大橙子疯](https://blog.csdn.net/qq_24130227)的[轻量级时间片轮转任务调度框架](https://gitee.com/cot_package/cot_task),在原有代码基础上增加了详细的注释和文档,更易于理解和使用。 ## 功能特点 - **简单轻量**:代码量少,结构清晰,易于移植和使用 - **基于时间片轮转**:适用于各种裸机系统,不依赖操作系统 - **优先级支持**:具备简易的任务优先级机制,高优先级任务优先执行 - **动态管理**:支持动态添加和删除普通任务及中断任务 - **系统监控**:可选的CPU负载率监控功能(通过宏定义开启) - **非阻塞设计**:任务函数不应阻塞,保证系统响应性 ## 文件结构 - **cot_task.h**:头文件,定义了API接口和数据类型 - **cot_task.c**:实现文件,包含所有调度逻辑的具体实现 - **cot_task_cfg.h**:配置文件,用于设置任务数量和功能选项 ## 原理说明 该模块采用非抢占式的时间片轮转调度方式: > 并非抢占式,而是等正在执行的任务回调函数执行结束后,优先执行就绪且优先级高的任务回调函数。 1. 使用1ms定时器作为基本时间片,在中断中更新任务计时器 2. 任务按优先级顺序排列,值越小优先级越高 3. 每次循环只执行一个最高优先级的就绪任务 4. 中断任务直接在定时器中断中执行,适用于要求极高的任务 ## 使用说明 ### 1. 初始化与配置 首先通过配置文件 `cot_task_cfg.h` 设置: ```c /* 支持的最大通用任务数目 */ #define COT_TASK_SUPPORT_NUM 10 /* 支持的最大中断任务数目 */ #define COT_TASK_ISR_SUPPORT_NUM 5 /* 定义使用负载率计算, 若定义, 则会占用一个通用任务和一个中断任务 */ // #define COT_CTASK_USE_LOAD_RATE ``` ### 2. 基本步骤 1. 调用 `cotTask_Init()` 初始化任务系统 2. 创建需要的任务函数:`cotTask_Creat()` 和 `cotTask_IsrCreat()` 3. 在1ms定时器中断中调用 `cotTask_Remarks()` 4. 在主函数中调用 `cotTask_Start()` 启动调度(该函数不会返回) ### 3. 示例代码 #### 初始化和创建任务 ```c int main(void) { /* 初始化硬件 */ MX_TIM6_Init(); FML_KEY_Init(); FML_LED_Init(); /* 初始化任务系统 */ cotTask_Init(); /* 创建任务 - 参数分别为:任务函数、执行周期(ms)、优先级(5-250) */ cotTask_Creat(ScanKeyTask, 20, 5); /* 按键扫描任务,20ms执行一次,优先级5 */ cotTask_Creat(ScanLedTask, 20, 6); /* LED控制任务,20ms执行一次,优先级6 */ /* 启动任务调度 - 该函数不会返回 */ cotTask_Start(); /* 后续代码不会执行 */ return 0; } ``` #### 配置定时器中断 ```c /* 中断函数 */ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == TIM6) { /* 在1ms定时器中断中调用任务调度标记函数 */ cotTask_Remarks(); } } ``` #### 任务函数示例 ```c /* 按键扫描任务 */ void ScanKeyTask(void) { /* 扫描按键并获取事件 */ cotKey_Scan(HAL_GetTick()); /* 菜单任务处理 */ cotMenu_Task(); } /* LED控制任务 */ void ScanLedTask(void) { cotLed_Ctrl(HAL_GetTick()); } ``` ## 注意事项 1. 任务函数不能被阻塞,应尽量保证执行时间小于1ms,以免影响整体实时性 2. 调度周期必须大于任务函数耗时,建议将耗时较长的操作分解为多个小任务 3. 中断任务应当尽可能简短,避免影响系统实时性 4. 任务优先级设置应当合理,避免低优先级任务因资源竞争而得不到执行机会 5. 优先级范围为5-250,值越小优先级越高,5为最高优先级 ## 高级功能 ### 负载率监控 通过定义 `COT_CTASK_USE_LOAD_RATE` 可启用CPU负载率监控功能,可通过 `cotTask_GetLoadRate()` 获取当前系统负载百分比。 ### 动态任务管理 可在运行时动态添加和删除任务: ```c /* 动态创建普通任务 */ cotTask_Creat(NewTask, 100, 20); /* 动态销毁普通任务 */ cotTask_Destory(NewTask); /* 动态创建中断任务 */ cotTask_IsrCreat(NewIsrTask, 5); /* 动态销毁中断任务 */ cotTask_IsrDestory(NewIsrTask); ``` ## 性能与资源占用 - 代码尺寸:约2KB(取决于编译器优化) - RAM占用:取决于配置的任务数量 - 每个普通任务约8字节 - 每个中断任务约6字节 - 加上任务管理器的基本开销 ## 关于项目 本项目是对原有轻量级任务调度框架的增强注释版本,旨在提高代码的可读性和易用性。