时间片轮调的单片机程序结构

时间片轮调的单片机程序结构

作者:佚名 来源:本站原创

我们使用单片机去做一些任务的时候,通常把程序写成顺序结构,基本可以解决大部分的设计要求了。而且这种结构便于理解,而且程序易构成模块化,在各个模块中调用实现更复杂的任务。

然而顺序结构的写法,有时候避免不了沉重冗长的时间等待。例如键盘扫描,你就给我弄了一个delay_20ms()函数,而在这延时的过程,其实 MCU可以做很多事情的,这不白白的浪费掉这段时间吗?其实,delay的这段时间用数码管显示代替,也就是在等待的过程,我们可以做一下显示。但仅此而已?

之前,我在做3寸大数码钟的时候就遇到过一个时间要求苛刻的问题,我采用了17个数码管,分成两组来动态显示。为了不闪烁,那么刷新频率起码大于 50Hz。而单片机还有其他任务,比如说读DS1302实时时钟,串口收发数据,按键扫描,读DS18B20等等,而其中最要命的是读取DS18B20温度传感器的数据,大家都知道其中等待温度转换的时间,基本要达到900ms了,这样一来,数码管就会闪烁得很厉害了。

所以,我网上找了一些资料学习。大家都采用“时间片轮询”算法的程序架构来写,这样既保证了实时,也充分利用了任务等待的时间。

下面简单来看看,关于时间片轮调的程序思想,而按照这种思路,可以衍生出很多程序结构。

假定,单片机要执行的任务有task_1(); task_2(); task_3(); ……task_n();  各个任务对时间要求不同。

下面是我对时间片轮调的相关认识。

系统基准时间片:

我们采用定时器中断来产生系统的基准时间片,也叫系统的基准节拍,例如每4ms中断一次。这可以形象的比喻成脉搏心跳。

任务(事件)的轮调:

每一次心跳,我们就给任务执行的时间标志计数。当标志计数到了,就执行该任务函数!

事件的要求:

1.每一个事件的执行时间不允许超过一个时间片。

2.事件中不使用较长的delay();函数,可以使用定时延时等待,但永远必须遵守第一条要求。

3.执行时间较长的任务,或者较为复杂的任务,可以分割到多个时间片内执行。

实时性任务要求:

对于实时性要求较高的任务。比如串口收发事件,可以考虑放在主循环调用,或者再定时中断中调用。

参数传递要求:

各个任务函数之间参数传递,建议使用全局变量。任务中的内部函数,可以使用局部变量。

程序结构:

分析一下上面的程序结构,使用了一个定时器产生系统时钟滴答,然后时钟滴答到了,就更新时间标志,然后统一用一个事件函数来根据时间标志分时的执行各个任务函数。

但任务执行完后,时间标志被重置,并重新计数。那么这个任务函数就相当于被调度在了任务队列的末尾了!(感觉是不是有点任务调度管理的意思了?)

当然,各个任务函数调用的时间不同,就造成了任务执行频率的不同。这也是时间片的大小商定,以及时间片分布的问题,这需要从实际的任务考虑,并取得一个最佳的时间片,以及合理的安排各个任务函数的关系。

另外一种时间片轮调程序结构

其实,原理大致相同。执行机制不同罢了,各种程序结构有它优缺点,有最适合使用的地方。

下面,简单了解。

程序结构:

对于时间片轮询法的程序结构,无疑有比顺序结构程序更多的优点,但任务函数有时候被拆分成多段,不方便理解程序整体思路。

时间: 2024-08-01 21:07:12

时间片轮调的单片机程序结构的相关文章

时间片轮询-应用程序架构

大致应用程序的架构有三种:1. 简单的前后台顺序执行程序,这类写法是大多数人使用的方法,不需用思考程序的具体架构,直接通过执行顺序编写应用程序即可. 2. 时间片轮询法,此方法是介于顺序执行与操作系统之间的一种方法. 3. 操作系统,此法应该是应用程序编写的最高境界. 下面就分别谈谈这三种方法的利弊和适应范围 1. 前后台顺序执行法 前后台程序一般是指没有“操作系统”的程序.所谓的前台,就是主动去判断处理某个事务,这个是主循环里要做的事,也就是你代码主要要写的.所谓的后台,指的是:中断,也就是不

单片机用定时器分配任务的程序结构总结

转载请注明本文地址:http://blog.sina.cn/dpool/blog/s/blog_6f2b6ba80101bwka.html?vt=4 http://blog.sina.cn/dpool/blog/s/blog_6f2b6ba80101bwka.html?vt=4本文是2013年写的,后来整理成了系统文章,请访问 http://nicekwell.net/ 查看单片机编程系列文章.以下是2013年原文:经过这几天做的程序,和以前做电子钟时的感悟,现在对单片机的整个程序结构做一下总结

第五篇:本人多年来积累的单片机程序 资料下载(绝对干货,内附下载链接)

首先打个广告:如果需要做毕设以及嵌入式项目合作,欢迎进入我们工作室:创想嵌入式设计工作室 本人搜集的大量单片机源码资料及毕业设计资料,足有1200+套,很多实用的demo源码和毕业设计参考方案,可用于做项目时借鉴,博尾附有下载链接.(内附本人联系方式,可一起交流探讨,交朋友) 为了方便 查找,我已将项目源码的目录整理出来了,方便 采用"ctrl +F"快速查找验证是否有需要的demo.可以一键打包下载,也可只下载需要的demo. 下载链接内附本人联系方式,如果在安装过程中遇到问题,可以

51单片机程序技巧

本系列文章探讨的主题都是在Keil uVision3集成编译环境下完成的,针对的是51系列单片机. 下面就介绍一下在我的单片机程序里必须要包含的一个头文件----"const.h",完整内容如下: #ifndef _CONST_H_ #define _CONST_H_ #include <intrins.h> #define TRUE 1 #define FALSE 0 typedef unsigned char BYTE; typedef unsigned int WOR

STM32 Keil C++编写单片机程序

C++ 属于面向对象的编程语言,OOP的思想不必多说,特别对于复杂的软件工程来说,利用OOP绝对是事半功倍,相对于传统的C来说: 当然用C来写单片机程序无可厚非,已经延续了一个传统,从大学时学的开始到工作岗位,好多人都是一直用C来做,但是既然Keil支持C++编译, 可以用C++来编写你的代码,可以利用高级语言来结构化,清晰化你的程序,为嘛不用呢!哈哈,个人看法!下面进入正题: C++ 兼容C,所以STM32的库都是可以被C++使用的,既然这样,那就简单了!在建立好新的STM32工程时候,那就可

元宵节后第一发(数据决定程序结构)

放假回家好久没写代码了,来一发牛客网的题.(这个题再次说明我一直强调的问题数据的特性决定了程序结构) 题目描述 实现一个算法,确定一个字符串的所有字符是否全都不同.这里我们要求不允许使用额外的存储结构. 给定一个string iniString,请返回一个bool值,True代表所有字符全都不同,False代表存在相同的字符. 保证字符串中的字符为ASCII字符.字符串的长度小于等于3000. /* * 解题思路 * 1:可以用位图来做,由于是accii码,所以字符取值范围为0~255,只需建立

C#学习笔记二:C#程序结构

从最简单的HelloWorld开始入手,这是一个最低限度的C#程序结构. C# Hello World 示例 一个C#程序主要由以下几部分组成: 命名空间声明 一个类 类方法 类属性 一个Main方法 语句和表达式 注释 先看看下面的示例,将打印字的简单的代码 "Hello World": using System; namespace HelloWorldApplication { class HelloWorld { static void Main(string[] args)

第一个单片机程序(C言语编写)

忙活了半天,预备任务做了那么多,终于要编写我们的程序代码了.假如学过 C 言语的话,你应当很轻松的跟着我的编程本人写出来,假如没学过 C 言语也没紧要,你先照着我的抄,我会在适宜的地位写出来对 C 言语语法的说明,如许抄几回后再看看说明,就应当很明确了,抄的时分必定要仔细,特别标点符号弗成以搞错.第一个单片机程序: #include <reg52.h> //包括特别功用存放器界说的头文件 sbit LED = P0^0; //位地址声明,留意:sbit 必需小写.P 大写! void main

黑马程序员---C基础3【变量的易错】【程序结构】【if语句】【Switch语句】

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- [变量的易错] 1.变量为什么要初始化为0 int  sum,a=3: sum = sum+a 如果未初始化则会成为一个不确定的变量,结果也会不确定,容易出错. 2.不同类型的变量之间的转换 切记int  a=1,b=0:b=1-1.5:其中b为一个整型所有结果是保留整数部分的0,而不是-0.5,又因为0没有正负之分,所有保存结果为b=0: 3.关于Xcode的一个快速注释的插件 快捷键://