单片机多任务的实现方式

发布者:Huixin8888最新更新时间:2018-03-20 来源: eefocus关键字:单片机  多任务  实现方式 手机看文章 扫描二维码
随时随地手机看文章

    由于单片机具有价格低、运行要求低、易于开发、稳定可靠等优点,广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域。但是,单片机的位数少、频率低、内存小、I/O口少等缺点限制了其加载操作系统的可能。因此,单片机不能像ARM等较高性能的处理器一样,利用加载的操作系统实现管理与配置内存、决定系统资源供需的优先次序、控制输入与输出设备、操作网络与管理文件系统等功能。
    但是,我们可以根据单片机所拥有的内存大小、CPU频率等因素,来为单片机量身定做一个小型的操作系统,以实现单片机的多任务运行。

1 微机实现多任务的方式
    微机实现多任务的方式一般是由加载的操作系统来实现的。通过操作系统提供的函数来创建多进程或者多线程来实现多任务方式。由于多进程耗费的资源多,而多线程的开销相对小的多,因此我们采用单片机模仿多线程的方式来实现。
    操作系统创建多个线程后,将管理各个线程占用CPU的时间。操作系统以轮换方式向线程提供CPU时间片,从而使多个线程看起来是同时运行的,而不是等待一个线程执行结束后再去执行下一个线程。
    PC(Program Counter,程序计数器)是用于存放下一条指令地址的地方。某个线程正在占用CPU时间,其实是PC值指向该线程所占的内存,并正在逐条取到CPU寄存器中进行运算。该时间片结束后,PC值要指向下一个线程所占用的内存中,进行类似的运算。其他线程都轮流一遍后,将又回到原来那个线程暂停的位置继续运算。所以,从一个线程转换到另外一个线程去执行时,要保存此线程的“现场”,包括此线程下一条指令的位置(PC值)、此线程所使用的各个寄存器值等。当此线程又拥有CPU时间时,将保存的PC值赋给PC寄存器,保存的各个寄存器值再赋给各个寄存器。
    除了保存“现场”与恢复“现场”外,另外关键的一点是,操作系统能够改变PC值——强制把使用CPU的权限从一个任务切换到另一个任务,这就用到了中断。微机是用操作系统来管理中断的,用户只能间接使用中断。

2 单片机实现多任务的思路
    由上面的介绍,我们知道微机中多线程轮流占用CPU时间,关键点在于:
    ①保存“现场”与恢复“现场”,即保存和恢复下一条指令的位置和通用寄存器的值。
    ②能够改变PC值,从而可以在多个线程中进行切换,以便同时运行。
    在51系列单片机中,如何实现上面的两个关键点呢?
    (1)保存此“现场”,恢复另一“现场”
    给每个任务开辟一个堆栈,各个任务的堆栈不能交叉。各个任务的对应堆栈用于实现以下功能:
    ①保存“现场”,在PC离开此任务前保存该任务所用到的通用寄存器值(寄存器A、B、Rn和位寄存器C等)。
    ②恢复“现场”,先获得下一个任务的堆栈地址,然后取出堆栈中所保存的通用寄存器值;
    ③在调用子函数时,用以保存下一条指令的地址。
    (2)每隔一段时间片,改变PC值几乎所有的处理器指令中,没有可以直接改变PC值的指令,但是系统发生中断时可以改变PC值,中断流程如图1所示。

a.JPG

    
    由图1可以看出,在倒数第二个步骤中,单片机会把栈顶的两个字节弹出给PC,由此来改变PC值,进而来改变程序的执行流程。所以,我们可以在出栈弹出字节给PC前改变栈顶的两个字节的内容,进而主动改变PC值。
    有了主动改变PC值的能力,我们就可以将这个中断设为定时器中断,每隔一段时间来切换PC值,进而实现多任务运行。

3 具体实现代码及注意事项
3.1 进入主循环前的工作
    根据上面的思路和技巧,进入主循环前的工作流程如图2所示。

b.JPG


    图2为进入主循环前的初始化工作。假定有3个任务,3个任务分别为Task1、Task2、Task3(这3个任务都应是死循环),如果开设每个堆栈大小为16字节,3个任务对应的堆栈范围为40H~4FH、50H~5FH、60H~6FH,则初始各个任务地址到对应堆栈如下:
   c.JPG
    sp1、sp2、sp3为定义的3个全局变量,用以存储各个任务的栈顶地址。


    初始化定时器后,要进入某个任务的死循环当中。假设我们要进入任务1中,则如下所示:
   d.JPG
    TaskIndex为全局变量,用以存储当前执行的任务序号;难点在于ret的妙用。ret一般用于子函数的最后一条,以回到调用函数前下一条指令的地址。ret的实质是取出此时堆栈中栈顶的两个字节赋给PC寄存器,以返回调用函数前的位置。所以,上述代码是先把任务1的地址放进堆栈中,然后调用ret来取出地址给PC,以重新跳到任务1中去执行。
3.2 多任务切换的主循环
    进入某个任务进行死循环后,程序的主循环流程如图3所示。当程序进入到某个任务进行死循环时,如上面的任务i,定时器中断周期发生,发生时意味着该任务的时间片结束,准备执行下一个任务。这些准备工作是在中断里做的,如图3所示。首先,应保存此时用到的各个寄存器值,以便下次轮到该任务时取出继续执行,还要保存栈顶的位置,以便下次能取出所保存的值;然后通过全局变量TaskIndex取得下一个任务的序号,通过任务序号,得到下一个任务的堆栈栈顶的地址,赋给栈顶寄存器SP;然后通过SP取出保存的各个通用寄存器值;最后,重设定时器值,使中断能够再次进行任务切换。

e.JPG

    
    这里重要的是整个思路,没有比较难的代码,故没有贴出代码。值得提醒的是,保存通用寄存器值时,并不需要保存所有的通用寄存器值,只需要保存任务中用到的就可以。这里解释前面程序中提及的45H、55H、65H:各个任务堆栈的开始处存储各个任务的地址,然后再把要保护的寄存器值入栈,栈顶抬高;而要恢复下一个任务时,需将上次保护寄存器后的栈顶值赋给SP寄存器,然后逐个出栈赋值给各个寄存器值,直到栈底处存储的上次任务暂停处的地址。因为本文的验证程序只保护了A、B、R0、R2 4个寄存器值,堆栈刚好到达45H、55H、65H。

总结
    单片机实现多任务的另一种常用方式是把任务切成小片,然后放在主循环里。这样,每个循环执行一次各个任务的一小片,从而看起来所有的任务都同时进行。切片的思想是把一个任务细分成多个步骤,而每次只执行其中一小步。如多段数码管的显示可以每次只显示一段,这是更常用的方式,但并不是每个任务都可以切片的。
    本文所讲的这种实现单片机多任务的方式要求程序员要有比较好的汇编基础,要求对中断的实现过程比较熟悉,对ret指令的实质要理解,能够根据任务来分配堆栈,对操作系统管理CPU时间片有大致理解,因此要求比较高。另一方面,时间片定多少需要程序员根据任务的不同来选择,需要测试多次来达到性能的最优化。


关键字:单片机  多任务  实现方式 引用地址:单片机多任务的实现方式

上一篇:单片机MSP430精准配置高速串口波特率的方法
下一篇:基于MSP430F149电机保护算法研究

推荐阅读最新更新时间:2024-03-16 15:58

AVR单片机的调频立体声收音机设计解析
引言 早期的数字FM处理芯片TEA5767由Philips公司开发并被广泛地使用,但该芯片需要外加音频放大电路才能驱动耳机。鉴于此,国内锐迪科微电子公司独立开发了一颗具备高接收灵敏度的FM立体声数字芯片RDA5807P,具有自动搜台、重低音、静音、休眠、直接驱动耳机等优异的性能。本文介绍用RDA5807P芯片设计和制作了一款带遥控功能的收音机。 1 收音机总体设计方案 收音机的总体设计框图如图1所示。本收音机采用单节3.7 V、容量1500 mAh的锂电池作力电源,在使用寿命期内可以用手机充电器反复对它进行充电,使用非常方便。采用低功耗的AVR单片机ATmega8L作为微控制器,负责处理和协调各模块电路的工作,AT
[单片机]
AVR<font color='red'>单片机</font>的调频立体声收音机设计解析
单片机数字秒表计时器编写
这次做了51单片机的实验数字秒表显示,用到了定时器,中断服务函数,还有就是数码管的动态显示,还有就是程序的逻辑考虑 初次在这里写,经验不足,排版不够美观 代码如下: #include reg52.h #define uchar unsigned char sbit s0=P1^0; sbit s1=P1^1; sbit s2=P1^2; sbit s3=P1^3; //数码管的位选 uchar table ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0~9的数码管段码 uchar count=0; uchar second=0; uchar minite=0;
[单片机]
单片机电子密码锁门禁系统设计 AT24C02保存密码
该设计基于STC单片机设计,电路主要由51单片机最小系统和按键部分、蜂鸣器报警部分、LCD液晶显示部分等组成。该电路设计简单,单层板加上几根跳线即可完成,适合电子初学者DIY制作。 电子密码锁具体功能介绍: 1、该电子密码锁默认密码为1234567890,密码通过键盘输入,若密码正确,则将锁打开。 2、密码可以由用户自己修改设定(只支持6位密码),锁打开后才能修改密码。修改密码之前必须再次输入密码,在输入新密码时候需要二次确认,以防止误操作。 3、报警、锁定键盘功能。密码输入错误显示器会出现错误提示,若密码输入错误次数超过3次,蜂鸣器报警并且锁定键盘。 4、AT24C02保存密码,支持复位保存,掉电保存功能。 附件内容包括:
[单片机]
<font color='red'>单片机</font>电子密码锁门禁系统设计 AT24C02保存密码
血拼的MCU市场,实现250%增长的关键是什么?
  围绕微控制器的残酷竞争已经把价格拉得如此之低,以至于如果你需要额外购买MCU一些主要组成模块的话,你就无利可图!这并非危言耸听。WSTS(世界半导体贸易统计组织)公布的报告显示:截止2008年8月,8位MCU月平均销售额比2007年下降了2.8%,而这样的业绩是在其出货量增加了6%的情况下。   但就在此时,恩智浦高调宣布其全球战略——到2012年,MCU销售额增长250%,看似是mission impossible。   其实不然,WSTS的报告对高性能32位芯片市场予以肯定:月平均销售额比2007年增长了16.3%,同时出货量增长了25%,虽然也受价格之苦,但其增长态势不容小觑。而恩智浦的250%就是基于32位市场的未来,
[单片机]
个人对单片机中断程序的理解
开题首先贴上一段练习中遇到的代码: /*1:利用定时/计数器T0从P1.0输出周期为1s的方波,让发光二极管以1HZ闪烁,设晶振频率为12MHz。*/ #include reg52.h #include intrins.h #define uint unsigned int #define uchar unsigned char sbit P1_1=P1^0; uchar time; void main() { time=0; TMOD=0x01;////设置定时器0为工作方式1 TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1;//开总中断 ET0=1;//开定时器0中断 T
[单片机]
基于AVR单片机与FPGA的低频数字式相位测量仪
在工业领域中经常要用到低频数字式相位仪来精确测量两信号之问的相位差,比如在电力系统、频率特性的研究、激光测距等领域均有广泛的应用,相位检测的精度直接决定系统的整体性能。这就要求测量仪逐渐向智能化和测试自动化方向发展,本设计采用MCU和FPGA相结合的系统方案,以AVR单片机ATmega128和Altera公司的Cyclone系列EP1C3T100为核心,充分发挥各自的优势,如AVR单片机先进的RISC结构和强劲的运算、控制功能,Altera公司的FPGA运算速度快、资源丰富以及易编程的特点,合理设计,此方案的相位仪具备速度快、稳定可靠、精度高等优点,而且容易实现“智能化”和“自动化”。 1 系统方案设计 1.1 测量方法的比较与
[单片机]
基于AVR<font color='red'>单片机</font>与FPGA的低频数字式相位测量仪
基于单片机的交通信号灯控制系统设计
本系统采用STC89C51单片机以及单片机最小系统和74HC245驱动电路以及外围的按键和数码管显示等部件,设计一个基于单片机的交通灯设计。设计通过两位一体共阴极数码管显示,并能通过按键对定时进行设置。 本设计能模拟基本的交通控制系统,用红绿黄灯表示禁行,通行和等待的信号发生,还能进行倒计时显示。按键可以控制禁行、深夜模式、复位、东西通行、南北通行、时间加、时间减、切换等功能。 共四个二位阴极数码管,东南西北各一个显示时间,四个数码管的阴极都接到STC89C51的P1口,阳极接到74HC245芯片上,通过P0口控制74HC245芯片,起到驱动放大作用。共12个发光二极管,四个路口每个路口各有一个红(禁行)、黄(警告)发光二
[单片机]
基于<font color='red'>单片机</font>的交通信号灯控制系统设计
AT89C2051单片机与MT8880接口设计
加拿大MITEL公司生产的MT8880是一种带有CPU接口的DTMF(双音多频)发送/接收芯片,其可与6800系列微处理器或单片机直接接口。然而,对于想使用MT8880芯片的51系列单片机用户而言,关注的是51系列单片机如何与MT8880接口的问题。本文将以具有51内核的 AT89C2051(简称2051)单片机为例,介绍2051单片机与MT8880接口电路的设计,供有关用户参考。 1 接口时钟信号 笔者在使用MT8880过程中,经实验研究发现,MT8880对接口控制信号时序的要求并不十分严格,关键在如何为MT8880提供接口时钟信号CP(第12脚)。从MITEL公司原文器件手册提供的参数可知,CP时钟周期tCYC典型值
[单片机]
AT89C2051<font color='red'>单片机</font>与MT8880接口设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved