单片机关于基于时间片的分时多任务的知识

本文介绍了单片机中基于时间片的分时多任务实现原理,包括任务的定义、管理、时间统计以及定时器中断。通过任务结构体、任务管理函数和定时器中断服务,详细阐述了如何在单片机中有效地执行和调度多个任务,提高CPU资源利用率。

单片机软件开发,如果不用实时系统的话,那么“基于时间片的分时多任务”一定是会用到的。“时间片的分时多任务”看似简单,其实还是有几个方面需要注意的,以下我就根据自己的了解和实际应用经验来讲解一下相关代码。

cec3ac12d27194982fc9d9c4bfd47f07.png

一。首先我们简单介绍一下“基于时间片的分时多任务”。顾名思义“时间片”就是把单片机执行的函数或任务,按划定的时间片来执行。比如一个工程有按键,有触摸屏通讯,有LED运行指示。可以把他们三个分别当成3个任务,并且每个任务的运行间隔时间也可以自定义。比如按键扫描一般 10ms执行一次就行了。通讯 20ms执行一次。运行指示可以 250ms执行一次。这样就在一个主循环里有了3个任务,而且每个任务执行的时间间隔都不一样,可以更加充分的利用CPU硬件资源,让CPU的资源尽量少浪费在无用的循环里。

那么这个时间是依据什么来的呢?我们一般是用一个定时器,每1ms中断一次,也就是产生一个任务节拍。每次中断都有一个或多个全局变量加1,根据这个全局变量的值我们就可以知道任务延时情况。

一。介绍任务。

//代码文件 task.h#define TASK_MAX 10u //最大任务数量#define TASK_BEAT_MS 1u //任务节拍时间(ms)#define TASK_BATE_MAX (u32)40050 //最大任务节拍//任务函数类型typedefvoid(*TASK)(void*p_arg);

//任务结构体typedefstruct{

s8id;//任务IDu8RunTime;//任务运行时间统计(1统计0不统计)TASKTaskAddr;//任务函数地址void*p_arg;//任务参数vu32TaskBeat;//任务节拍u32TaskDelay;//延迟节拍}TaskStruct;

externvu16TaskBeat_ms;//系统定时,毫秒(用作任务片延时)externTaskStructtask[TASK_MAX];//任务结构体数组

以上代码块就是把任务相关的一些变量以及函数指针放在一个结构体里,之后对任务的运行以及管理只需要传递结构体指针就可以了。

二。任务管理

我们再来看一下任务管理函数,以及统计任务运行时间函数。

//代码文件 task.c/*任务函数说明:任务管理函数参数: *p_task 任务结构体指针返回值:无*/voidTask(TaskStruct*p_task){

if(p_task==NULL)//指针错误return;

if(p_task->TaskAddr==NULL)//函数指针为空return;

if(p_task->id<0)//此任务暂停return;

if(p_task->TaskBeat>p_task->TaskDelay)//任务节拍大于上次节拍{

p_task->TaskBeat=1u;

if(p_task->RunTime==0)//不统计任务执行时间p_task->TaskAddr(p_task->p_arg);//任务函数else//统计任务执行时间{

TaskRunTime(p_task->id,1);//执行任务前节拍p_task->TaskAddr(p_task->p_arg);//任务函数TaskRun

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值