单片机软件开发,实时系统和分时多任务,看完你就懂了
///插播一条:我自己在今年年初录制了一套还比较系统的入门单片机教程,想要的同学找我拿就行了免費的,私信我就可以哦~点我头像黑色字体加我地球呺也能领取哦。最近比较闲,带做毕设,带学生参加省级或以上比赛///
说明:
作者本人虽然岁数不小,但却是初入此行的新人,此篇文章只适合正在学习的准程序员,或初入行业的新人。当然如果有大牛路过,欢迎指点。
单片机软件开发,如果不用实时系统的话,那么“基于时间片的分时多任务”一定是会用到的。“时间片的分时多任务”看似简单,其实还是有几个方面需要注意的,以下我就根据自己的了解和实际应用经验来讲解一下相关代码。虽然我没有把完整的代码贴出来,但以下的代码块都是从实际的应用中摘出来的。意思就是贴出的代码块都是经过实际验证的。
一。首先简单介绍一下“基于时间片的分时多任务”。顾名思义“时间片”就是把单片机执行的函数或任务,按划定的时间片来执行。比如一个工程有按键,有触摸屏通讯,有LED运行指示。可以把他们三个分别当成3个任务,并且每个任务的运行间隔时间也可以自定义。比如按键扫描一般 10ms执行一次就行了。通讯 20ms执行一次。运行指示可以 250ms执行一次。这样就在一个主循环里有了3个任务,而且每个任务执行的时间间隔都不一样,可以充分利用CPU硬件资源,让CPU的资源尽量少浪费在无用的循环里。
那么这个时间是依据什么来的呢?我们一般是用一个定时器,每1ms中断一次,也就是产生一个任务节拍。(下文提到的所有任务节拍都是1ms)每次中断都有一个或多个全局变量加1,根据这个全局变量的值我们就可以知道任务延时情况。
/*==================================更改分割线=======================================之前这篇笔记写得有些杂乱,我自己都看不下去。在这五一小长假的最后一天我就收拾起自己的懒散,重新认真编辑一次,其中的代码部分也是优化过了的。任务除了基本的分时运行功能外,还可以在运行中暂停或恢复某个任务,以及统计某个任务的运行时间,以ms为单位。*/
进入正题!!!
一。介绍任务。
//代码文件 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;