无锡科技工场
发表于 2025-6-20 09:00:50
{:4_196:}{:4_196:}
白水大虾2016
发表于 2025-6-20 20:22:59
今天还是第九集 数码管
laohu_zhou
发表于 2025-6-21 08:27:56
打卡学习
fs_ajin
发表于 2025-6-21 09:18:01
今日打卡
srkxrolz
发表于 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={0};
初始化tasklist这个可以在main中调用一次,当然不调用也没什么问题
void TASK_Init(void)
{
u8 i;
for (i = 0; i < TASK_MAX; i++)
{
TaskList.Run = 0;
TaskList.TIMECont = 0;
TaskList.TRITime = 0;
TaskList.TaskFunc = NULL;
}
}
暴露三个函数用于添加,执行,运行状态管理
void task_add(u8 index, void (*taskFunc)(void), u16 triTime)
{
if (index < TASK_MAX)
{
TaskList.Run = 1;
TaskList.TaskFunc = taskFunc;
TaskList.TRITime = triTime;
}
}
void task_run(void)
{
u8 i;
for (i = 0; i < TASK_MAX; i++)
{
// if (TaskList.TRITime!=0)
// {
// printf("Run:task[%d]: tr:%d tm:%d RUN:%d \r\n",i,TaskList.TRITime,TaskList.TIMECont,TaskList.Run);
// }
if (TaskList.Run==1)
{
printf("Run:task[%d]: tr:%d tm:%d RUN:%d \r\n",i,TaskList.TRITime,TaskList.TIMECont,TaskList.Run);
if (TaskList.TaskFunc != NULL)
{
TaskList.TaskFunc();
TaskList.Run=0;
}
}
}
}
void task_timer(void)
{
u8 i;
for (i = 0; i < TASK_MAX; i++)
{
if (TaskList.Run == 0 && TaskList.TRITime != 0)
{
TaskList.TIMECont++;
if (TaskList.TIMECont >= TaskList.TRITime)
{
TaskList.TIMECont=0;
TaskList.Run = 1;
}
}
}
}
然后将task_run在main中的while里面循环调用即可,
状态控制程序库丢到while运行 或者放到定时器中断里面精确控制
乐高
发表于 2025-6-21 16:56:20
终于等到更新了
mechray
发表于 2025-6-21 18:43:57
终于更新了。看到第23集,这个PCA感觉和定时器功能一样啊,而且还是不带自动重装载功能的定时器。那用PCA有啥好处呢。
windsoft77
发表于 2025-6-21 19:04:00
{:wunai:}
laohu_zhou
发表于 2025-6-22 08:54:09
打卡学习
白水大虾2016
发表于 2025-6-22 11:19:35
今天继续:第九集 数码管