欢迎来到天天文库
浏览记录
ID:11651469
大小:76.06 KB
页数:20页
时间:2018-07-13
《单片机多任务编程方法介绍》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、单片机多任务编程方法介绍--EdanLee(Email:edan_lee@sina.comQQ:284622554)前言从事单片机学习和工作已有多年,多年下来对单片机开发有一点自己的认识。想将自己的积累和大家分享。应该对初学者有一点帮助。还有很多不足的地方,欢迎来函探讨。因为文学功底不行所以直接进入主题。主体内容本文的主要目的是介绍在没有操作系统的多任务编程方法。所有例子都以51单片机为基础。内容编排1、多任务简介2、任务分拆3、软件定时器4、系统架构5、例子多任务简介对于单片机的多任务就是CPU处理多个任务。但是在同一个时间CPU只能处理
2、一个任务。在处理多任务的时候其实就是将CPU分时复用。具体是在一个时间内处理一个任务,在接下来的时间里处理另一个任务。这个时间一般很短,在操作系统里就是指时间片。单片机因为资源少的原因很少会带操作系统来工作。但是可以从多任务的基本原本出发模拟操作系统的多任务。为了一个任务不会独占CPU,就将任务分成N个小任务。划分原则是在任务需要等待的地方划分。每次运行到这个任务的时候,CPU只执行其中的一个或者多个小任务。任务分拆在一个LED闪烁的小程序中原理是点亮LED,延时,关闭LED,延时,循环。#defineLEDOn()LED_Port=0;#
3、defineLEDOff()LED_Port=1;sbitLED_Port=P1^0;/*不精确延时*/voidDelay(unsignedintt){while(--t);}/*LED闪烁处理*/voidLEDFlash(void){LEDOn();Delay(1000);LEDOff();Delay(1000);}/*主函数*/voidmain(void){LEDFlash();}上例中的LED闪烁处理函数可以用一个进程控制器(变量)将其分成四个部分。voidLEDFlash(void){staticunsignedcharstep=0
4、;/*进程控制器*/switch(step){case0:LEDOn();step++;break;case1:Delay(1000);step++;break;case2:LEDOff();step++;break;case3:Delay(1000);step=0;break;}}上例对于这个小程序来说变得复杂了点。step就是将LEDFlash函数拆分成了4个小部分。每次进入LEDFlash这个函数只执行了一个小部分。这是多任务编程的基础。软件定时器在上例中的程序中加入另一个灯闪烁不同的频率的时候就会出现问题。因为当执行Delay时CP
5、U不可以做其它的事情。为了解决这个问题就要引入定时器来处理延时。原理是程序判断定时是否到而决定是否往下执行。那么上面的程序就变成:voidLEDFlash(void){staticunsignedcharstep=0;/*进程控制器*/switch(step){case0:LEDOn();step++;定时器初始化;break;case1:if(定时未到){break;}step++;break;case2:LEDOff();step++;定时器初始化;break;case3:if(定时未到){break;}step=0;break;}}硬
6、件的定时器是有限的,为了可以使用更多的定时器就需要用软件定时器。具体就是用变量做累加或者递减,和定时器计脉冲的原理是一样的。为了使软件定时器更精准,就可以对硬件定时器的溢出次数计数。那软件定时器的定时时间就是硬件定时器溢出时间的整数倍。unsignedcharTim[2];/*两个软件定时器*/voidTime0Irq(void)interupt1{...Tim[0]++;Tim[1]++;...}例子就可以变成:voidLEDFlash(void){staticunsignedcharstep=0;/*进程控制器*/switch(step
7、){case0:LEDOn();step++;Tim[0]=0;break;case1:if(Tim[0]8、LUE(65536-1000000/200)/*5ms*/#defineLED0On()LED0=0;#defineLED0Off()LED0=1;#defineLED1On()
8、LUE(65536-1000000/200)/*5ms*/#defineLED0On()LED0=0;#defineLED0Off()LED0=1;#defineLED1On()
此文档下载收益归作者所有