时间片轮询法
一、前言
为了方便理解和查阅本人所需的知识,在此做笔记。知识点来源书本与网络,如有侵权,联系删除。
二、框架
1.任务结构
typedef struct _TASK_COMPONENTS
{
uint8 Run; // 程序运行标记:0-不运行,1运行
uint8 Timer; // 计时器
uint8 *ItvTime; // 任务运行间隔时间
void (*TaskHook)(void); // 要运行的任务函数
} TASK_COMPONENTS; // 任务定义
2.任务运行标志出来,此函数就相当于中断服务函数
void TaskRemarks(void)
{
uint8 i;
for (i = 0; i < TASKS_MAX; i++) // 逐个任务时间处理
{
if (TaskComps[i].Timer) // 时间不为0
{
TaskComps[i].Timer--; // 减去一个节拍
if (TaskComps[i].Timer == 0) // 时间减完了
{
TaskComps[i].Timer = *TaskComps[i].ItvTime; // 恢复计时器值,从新下一次
TaskComps[i].Run = 1; // 任务可以运行
}
}
}
}
3.任务处理
void TaskProcess(void)
{
uint8 i;
for (i = 0; i < TASKS_MAX; i++) // 逐个任务时间处理
{
if (TaskComps[i].Run) // 时间不为0
{
if(NULL != TaskComps[i].TaskHook)
{
TaskComps[i].TaskHook(); // 运行任务
}
TaskComps[i].Run = 0; // 标志清0
}
}
}
4.任务列表
static TASK_COMPONENTS TaskComps[] =
{
{0, 60, (uint32*)&TaskDisplayTime, TaskDisplayClock}, // 显示时钟
{0, 20, 20, TaskKeySan}, // 按键扫描
{0, 30, 30, TaskDispStatus}, // 显示工作状态
// 这里添加你的任务。。。。
};
5.任务清单
typedef enum _TASK_LIST
{
TAST_DISP_CLOCK, // 显示时钟
TAST_KEY_SAN, // 按键扫描
TASK_DISP_WS, // 工作状态显示
// 这里添加你的任务。。。。
TASKS_MAX // 总的可供分配的定时任务数目
} TASK_LIST;
6.中断
void TIM_IRQHandler (void)
{
if ( TIM_GetITStatus( TIM, TIM_IT_Update) != RESET ) //确保是否产生了中断
{
TaskRemarks();
TIM_ClearITPendingBit(TIM , TIM_IT_Update); //清除中断标志
}
}
7.主函数
int main(void)
{
InitSys(); // 初始化
while (1)
{
TaskProcess(); // 任务处理
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?