- 打卡等级:偶尔看看I
- 打卡总天数:12
- 最近打卡:2025-07-08 00:11:07
已绑定手机
注册会员
- 积分
- 121
|
发表于 2025-6-21 10:29:36
|
显示全部楼层
打卡
第八课:systick与task周期调度
结构体
typedef struct
{
u8 Run;
u16 TIMECont;
u16 TRITime;
void (*TaskFunc)(void);
} Task;
用一个结构体管理任务信息
在系统中准备一个tasklist并确定最大长度(因为涉及到内存分配问题这里使用固定任务长度,相当于是预先确定task数组的内存大小)
#define TASK_MAX 10
Task TaskList[TASK_MAX]={0};
初始化tasklist 这个可以在main中调用一次,当然不调用也没什么问题
void TASK_Init(void)
{
u8 i;
for (i = 0; i < TASK_MAX; i++)
{
TaskList[i].Run = 0;
TaskList[i].TIMECont = 0;
TaskList[i].TRITime = 0;
TaskList[i].TaskFunc = NULL;
}
}
暴露三个函数用于添加,执行,运行状态管理
void task_add(u8 index, void (*taskFunc)(void), u16 triTime)
{
if (index < TASK_MAX)
{
TaskList[index].Run = 1;
TaskList[index].TaskFunc = taskFunc;
TaskList[index].TRITime = triTime;
}
}
void task_run(void)
{
u8 i;
for (i = 0; i < TASK_MAX; i++)
{
// if (TaskList[i].TRITime!=0)
// {
// printf("Run:task[%d]: tr:%d tm:%d RUN:%d \r\n",i,TaskList[i].TRITime,TaskList[i].TIMECont,TaskList[i].Run);
// }
if (TaskList[i].Run==1)
{
printf("Run:task[%d]: tr:%d tm:%d RUN:%d \r\n",i,TaskList[i].TRITime,TaskList[i].TIMECont,TaskList[i].Run);
if (TaskList[i].TaskFunc != NULL)
{
TaskList[i].TaskFunc();
TaskList[i].Run=0;
}
}
}
}
void task_timer(void)
{
u8 i;
for (i = 0; i < TASK_MAX; i++)
{
if (TaskList[i].Run == 0 && TaskList[i].TRITime != 0)
{
TaskList[i].TIMECont++;
if (TaskList[i].TIMECont >= TaskList[i].TRITime)
{
TaskList[i].TIMECont=0;
TaskList[i].Run = 1;
}
}
}
}
然后将task_run在main中的while里面循环调用即可,
状态控制程序库丢到while运行 或者放到定时器中断里面精确控制 |
|