51单片机实时操作系统的构建
MCS-51单片机应用系统设计
![MCS-51单片机应用系统设计](https://img.taocdn.com/s3/m/a6864fbd336c1eb91b375df0.png)
6 通信电路的设计 单片机应用系统一般需要其具有数据通信的能力,通常采用RS-
232C、RS-485、I2C、CAN、工业以太网、红外收发等通信标准。
7 印刷电路板的设计与制作 电路原理图和印制电路板常采用专业设计软件进行设计, 如
Protel、Proteus、OrCAD等。设计印制电路板需要有很多的技巧和经 验。设计好印制电路板图后,应送到专业厂家制作生产,在生产出来 的印制电路板上安装好元件,则完成硬件设计和制作。
3. 程序设计 1 建立数学模型:描述出各输入变量和各输出变量之间 的数 学关系。
2 绘制程序流程图:以简明直观的方式对任务进行描述。 3 程序的编制:选择语言、数据结构、控制算法、存储 空间 分配,系统硬件资源的合理分配与使用,子程序的入/出口 参 数的设置与传递。
4. 软件装配 各程序模块编辑之后,需进行汇编或编译、调试,当满足设
单 片 机 应 用 系 统 设 计 的 一 般 过 程
7.1 MCS-51单片机应用系统设计过程
1. 总体设计 2. 硬件设计 3. 软件设计 4. 可靠性设计 5. 单片机应用系统的调试、测试
7.1.1 总体设计
1.明确设计任务 单片机应用系统的设计是从确定目标任务开始的。 认真进行目标分析,根据应用场合、工作环境、具体用途,
2. 程序设计技术
软件结构实现结构化,各功能程序实行模块化、子程序化。 一般有以下两种设计方法:
1 模块程序设计:优点是单个功能明确的程序模块的设 计和 调试比较方便,容易完成,一个模块可以为多个程序所共 享 。其缺点是各个模块的连接有时有一定难度。
2 自顶向下的程序设计:优点是比较符合于人们的日常 思维 ,设计、调试和连接同时按一个线索进行,程序错误可以 较早的发现。缺点是上一级的程序错误将对整个程序产生影响, 一处修改可能引起对整个程序的全面修改。
51单片机操作系统的实现+源代码
![51单片机操作系统的实现+源代码](https://img.taocdn.com/s3/m/76d6de50312b3169a451a415.png)
51单片机操作系统开发中的问题与技巧附代码引言51系列单片机是美国Intel公司在1980年推出的高性能8位单片机,在我国的应用非常广泛。
目前,在软件设计中需要软件工程师从底层做起,在系统软件设计方面需要做大量的重复性劳动。
如果开发一套基于51系列单片机的操作系统,那么用户只需要编写各个任务的程序,不必同时将所有任务运行的各种情况记在心中,不但大大减少了程序编写的工作量,而且减少了出错的可能性。
1 开发平台的选择和论证开发平台的选择至关重要,因为有时它不光影响进度、产品质量、可维护性等一般问题,还涉及到方案的可实现性。
在本系统中,选择51系列单片机作为操作系统的运行平台有以下原因。
首先,51系列单片机应用非常广泛,一大批性能优越的51兼容单片机相继推出。
这里包括:低功耗、高速度和增强型的Philips公司的系列产品;完美地将Flash(非易失闪存技术)EEPROM与80C51内核结合起来的Atmel公司的系列产品;在抗干扰性能,电磁兼容和通信控制总线功能上独树一帜,其产品常用于工作环境恶劣场合的Siemens公司的系列产品以及一些其它公司的产品。
既然产品如此丰富,性能如此优越,那么在处理多任务并且对实时性要求严格的系统设计中,为了充分挖掘单片机的潜能(尤其是在实时性方面),也是为了简化开发的过程,基于51系列单片机的实时操作系统的需求就十分强烈了。
Keil公司的RTX51 Full就是一个基于51系列单片机的有实用价值的实时操作系统,但该操作系统是一个源码不公开的收费软件。
其次,借助于Keil C51的集成开发环境,完全可以开发出适用于51系列单片机的操作系统代码。
Keil C51软件提供丰富的库函数和功能强大的Windows界面集成开发调试工具。
另外重要的一点,Keil C51生成的目标代码效率非常高,多数语句生成的汇编代码很紧凑,容易理解。
在开发大型软件时,更能体现高级语言的优势。
C编译器能产生可重入代码,而且用C语言可以打开和关闭中断。
实时多任务操作系统在MCS-51单片机中的应用
![实时多任务操作系统在MCS-51单片机中的应用](https://img.taocdn.com/s3/m/c962ea0803d8ce2f006623f0.png)
) 22 R X 5 . T 一 1任 务状态
R X 5 Leabharlann y的 用 户 任 务 有 5种 状 态 , 表 1 示 。 T 一 1Tn 如 所 某 一 时 刻 用 户 任 务 处 在 某 个 状 态 , 一 定 条 件 下 , 务 状 在 任
1 引 言
文献标 识码 : A
文章编 号 :6 4 58 (0 0 0 — 10 0 17 — 7 7 2 1 )5 0 6 — 3
义:
传统 的单 片机程 序多 为单任 务 系统 .其业 务逻 辑顺 序安排 在主 函数 中 , 函数是 整个程 序 的人 1 一般 为死 主 : 3. 循 环 , 环过 程 中通 过调用 函数 未完 成相 应 的操作 . 循 而对
于 一 些 较 短 的 实 时 任 务 则 通 过 中 断 方 式 进 行 处 理 此 种 程 序 结 构 简 单 、 观 , 于 实 现 . 对 于 较 复 杂 的 应 用 此 直 易 但
vi tsn m (od t k B m o ak a evi)_a u d s n n 是任务 号 , ul 取值 为 O 1 。t k a 一 5 a nme是任 务的名称 。 s 下
运 行 状 态
2 RX 5 T 一 1简 介
R X一 1是 德 国 K i公 司 开 发 的 适 用 于 MC 一 1 T 5 el S5 单 片 机 的 实 时 多 任 务 操 作 系 统 . T 一 1 R X 5 ul R X 5 有 T 一 1F l 和 R X 1Tn 个 版 本 本 文 以 R X 5 iy为 例 介 绍 . T 5 iy两 T 一 1Tn 它
MCS-51单片机系统结构
![MCS-51单片机系统结构](https://img.taocdn.com/s3/m/23307620dd36a32d73758194.png)
*提供驱动外设的电压或电流; *DMA(直接存储器存取)控制和中断控制。
16
1.1 单片微型计算机
一、单片机的发展历史
第一阶段(1976-1978):单片机的探索阶段。探索
计算机的单芯片集成,单片机(Single Chip Microcomputer) 的定名即缘于此。产品以Intel公司的MCS-48为代表。
9
➢数据总线 DB:CPU与存储器、I/O接口之间 (双向)传送数据的公共通路。 * 数据总线的条数决定CPU一次最多可以传送的
数据宽度(位数)。 如:8位机的DB有8条,CPU一次可读写8位数据
16位机的DB有16条,CPU一次可读写16位
➢控制总线 CB:用来传送各种控制或状态信号 * CPU送出和接受的对存储器、I/O接口读写
运算器 控制器 寄存器组
内存储器
输入输出 接口电路
总线
外部设备
软件
7
二、微型计算机的结构
AB: Address Bus DB: Data Bus CB: Control Bus
微
处
内
存
理
储
器
器
CPU
地址总线 AB
I/O
输
I/O
接
入
接
口
设口备源自输 出 设 备I/O 接 口
数据总线 DB
控制总线 CB
特点: • 以微处理器(CPU)为核心 • CPU与其他部件间通过三总线连接
BUS
I/O接口
C/T
4
系统级——微型计算机系统
• 以微型计算机为中心,配以相应的外围设 备以及控制微型计算机工作的软件,就构 成了完整的微型计算机系统。
8051单片机实时操作系统RTX51 Tiny总结
![8051单片机实时操作系统RTX51 Tiny总结](https://img.taocdn.com/s3/m/7bb3ce4a2b160b4e767fcff1.png)
RTX51 Tiny介绍μVision是德国K eil公司开发的单片机IDE软件,最初主要用于8051系列单片机,RTX51是其自带的运行于8051系列单片机上的小型多任务实时操作系统,可用来设计具有实时性要求的多任务软件。
RTx51有2个版本:RTX51 Tiny和RTX51 Full。
RTX51 Tiny是RTX51 Full的子集。
RTX51 Tiny 自身仅占用900字节左右的程序存储空间,可以很容易地运行在没有外部扩展存储器的8051单片机系统上。
它完全集成在Keil C5l编译器中,具有运行速度快、对硬件要求不高、使用方便灵活等优点,因此越来越广泛地应用到单片机的软件开发中。
它可以在单个CPU上管理几个作业(任务),同时可以在没有扩展外部存储器的单片机系统上运行。
目前在8051系列单片机上使用多任务实时操作系统,RTX51 Tiny也就成为了首选。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////// \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ RTX51 TINY允许同时“准并行”地执行多个任务:各个任务并非持续运行,而是在预先设定的时间片(time slice)内执行。
CPU执行时间被划分为若干时间片,RTX51 TINY为每个任务分配一个时间片,在一个时间片内允许执行某个任务,然后RTX51 TINY切换到另一个就绪的任务并允许它在其规定的时间片内执行。
由于各个时间片非常短,通常只有几ms,因此各个任务看起来似乎就是被同时执行了。
51单片机项目教程项目 1 构建单片机开发环境
![51单片机项目教程项目 1 构建单片机开发环境](https://img.taocdn.com/s3/m/df7b4d761eb91a37f1115c56.png)
图1- 3安装驱动程序软件步骤二
图1- 4安装驱动程序软件步骤三
图1- 5安装驱动程序软件步骤四
1.2 技术准备
1.2.3程序烧录方法和相关工具
STC单片机的烧写及实验,具体方法如下: 第一步:硬件连接 将配套的USB电源线,及串口线连上,在锁紧坐上放入STC的单片机,其他的硬件 连接保存默认,打开电源,硬件连接完毕; 第二步:软件操作 1.打开软件,出现如下画面
在单片机应用系统开发中,单片机是整个设计的核心。如图11所示,单片机应用系统由硬件和软件组成。硬件是应用系统的基 础,软件是在硬件的基础上对其资源进行合理调配和使用,从而完 成应用系统所要求的任务,二者相互依赖,缺一不可。
1.2 技术准备
1.2.2安装USB驱动程序
1.确保电脑联网。 B口插入开发板后电脑会自动识别设备,自动联网安装驱动设 备成功。 3.若电脑未自动安装驱动,打开设备管理器,找到插入开发板后弹 出的新设备(未安装好驱动的情况下在“其他设备”中,带有黄色 感叹号或问号),右键点击设备,选择“更新驱动程序软件“—— —“自动搜索更新的驱动程序软件”即可安装驱动。
任务1:用Keil C51编写程序 编程语言都是需要开发环境的,这样才能完成程序的编写、调试和编译。 C51程序开发是在Keil µVision开发环境下进行,首先介绍该开发环境Keil µVision4。 软件启动 软件启动画面如图1-11所示。
图1- 11Keil µVision4
1.点击“project --- New uVision Project”新建一个工程,如图112所示。
1.1 项目分析
学习单片机之前,必须要掌握构建单片机开发环境 的方法。本项目详细讲解USB驱动程序的安装方法,如 何安装使用开发软件keil4,如何烧录程序和使用相关工 具。
51单片机教程
![51单片机教程](https://img.taocdn.com/s3/m/283d8f2ea31614791711cc7931b765ce05087a6e.png)
51单片机教程单片机作为嵌入式系统的关键元素之一,具有广泛的应用前景。
本教程将为大家介绍51单片机的基本知识、应用案例以及编程技巧。
通过学习本教程,读者将能够掌握51单片机的原理和基本操作,为进一步深入学习和应用打下坚实的基础。
一、简介51单片机指的是Intel公司推出的一种经典的8位单片机,广泛应用于电子产品中。
它使用的是哈弗小端字节序,运行稳定可靠,并具备强大的扩展性,便于工程师进行开发和应用。
二、基本原理1. 51单片机的结构51单片机包括中央处理器、存储器和各种外设。
中央处理器由ALU、寄存器组、程序计数器、指令译码器等组成。
存储器包括片内RAM和片内ROM,外设包括I/O口、定时器等。
2. 时序控制51单片机的时序控制通过晶振、分频器和定时器来实现。
晶振提供时钟信号,分频器控制时钟信号的频率,定时器用于定时和计数。
三、编程环境搭建1. 安装编程软件在学习51单片机之前,我们需要安装相应的编程软件。
常用的有Keil C51、WinAVR等。
根据自己的需求选择一个适合的软件进行安装。
2. 设置开发板将开发板与计算机连接,并进行相应的设置。
确认开发板的连接方式和COM口设置正确。
四、基本操作1. 点亮LED灯首先,我们从最简单的实验开始,通过51单片机控制LED灯的点亮和熄灭。
连接好电路后,编写相应的程序,即可实现LED灯的亮灭控制。
2. 按键输入与输出通过接入按键开关,我们可以实现通过按键输入不同的命令,控制LED灯的亮灭。
通过读取按键输入的状态,编写相应的程序进行判断和控制。
五、应用案例1. 温度检测系统通过连接温度传感器,我们可以使用51单片机对周围环境的温度进行检测,并通过LED灯或LCD显示屏来显示当前的温度数值。
2. 蜂鸣器控制将蜂鸣器与51单片机连接,通过编写程序控制蜂鸣器的频率和节奏,可以实现不同的音乐或警报声音。
六、编程技巧1. 中断编程中断编程是51单片机常用的一种编程方式。
开发51单片机操作系统时应注意哪些问题
![开发51单片机操作系统时应注意哪些问题](https://img.taocdn.com/s3/m/136d638dc1c708a1284a4460.png)
开发51单片机操作系统时应注意哪些问题51系列单片机是美国Intel公司在1980年推出的高性能8位单片机,在我国的应用非常广泛。
目前,在软件设计中需要软件工程师从底层做起,在系统软件设计方面需要做大量的重复性劳动。
如果开发一套基于51系列单片机的操作系统,那么用户只需要编写各个任务的程序,不必同时将所有任务运行的各种情况记在心中,不但大大减少了程序编写的工作量,而且减少了出错的可能性。
1 开发平台的选择和论证开发平台的选择至关重要,因为有时它不光影响进度、产品质量、可维护性等一般问题,还涉及到方案的可实现性。
在本系统中,选择51系列单片机作为操作系统的运行平台有以下原因。
首先,51系列单片机应用非常广泛,一大批性能优越的51兼容单片机相继推出。
这里包括:低功耗、高速度和增强型的Philips公司的系列产品;完美地将Flash(非易失闪存技术)EEPROM与80C51内核结合起来的Atmel公司的系列产品;在抗干扰性能,电磁兼容和通信控制总线功能上独树一帜,其产品常用于工作环境恶劣场合的Siemens公司的系列产品以及一些其它公司的产品。
既然产品如此丰富,性能如此优越,那么在处理多任务并且对实时性要求严格的系统设计中,为了充分挖掘单片机的潜能(尤其是在实时性方面),也是为了简化开发的过程,基于51系列单片机的实时操作系统的需求就十分强烈了。
Keil公司的RTX51 Full就是一个基于51系列单片机的有实用价值的实时操作系统,但该操作系统是一个源码不公开的收费软件。
其次,借助于Keil C51的集成开发环境,完全可以开发出适用于51系列单片机的操作系统代码。
Keil C51软件提供丰富的库函数和功能强大的Windows界面集成开发调试工具。
另外重要的一点,Keil C51生成的目标代码效率非常高,多数语句生成的汇编代码很紧凑,容易理解。
在开发大型软件时,更能体现高级语言的优势。
C编译器能产生可重入代码,而且用C语言可以打开和关闭中断。
第2章 MCS-51单片机系统结构
![第2章 MCS-51单片机系统结构](https://img.taocdn.com/s3/m/aeea8de5102de2bd960588ec.png)
对外部时钟的占空比要求不高,但要有一定的幅度.
2.3.2
时钟电路
C1
XTAL1
NC
XTAL1
MCS-51单片机
MCS-51单片机 外部振荡信号
XTAL2
C2
XTAL2
内部振荡方式Biblioteka 外部振荡方式2.3.3
复位电路
所有单片机在启动运行时都需要复位,以使CPU和系统中的其 它部件处于一个确定的初始状态,并从这个状态开始工作。
2.4.1
程序存储器
ISP技术(下载):在单片机上固化一些用户看不到的程序,单片 机上电后自动运行这些程序,并检查单片机的工作模式。当单片机处 于下载模式时,这些程序就控制单片机经由串口从PC机接收用户应用 程序,并将之写入程序存储器,这个过程称为下载;若单片机处于正 常工作模式,就按普通方式从程序存储器中取出指令来运行。
2.3.3
复位电路
典型的复位电路:
(1)上电自动复位电路 (2)人工复位电路
(3)看门狗复位电路
2.3.3
复位电路
+5V Vcc
+5V Vcc
C
MCS-51单片机 RST
R2 MCS-51单片机 RST
R1
GND
GND
RC上电自动复位电路
人工复位电路
基于RTX51实时操作系统的交通灯控制系统的设计
![基于RTX51实时操作系统的交通灯控制系统的设计](https://img.taocdn.com/s3/m/c42c55d276eeaeaad1f330d7.png)
基于RTX51实时操作系统的交通灯控制系统的设计O 引言一个高效的单片机智能控制系统,不仅要求系统能够同时执行多个任务,对每个任务作出实时响应,而且要求系统能够及时响应随机发生的外部事件,并对其作出快速处理。
对于这样的系统应用,采用实时操作系统RTOS(Real-time-Operating System)作为系统软件设计平台是一个良好的选择,它可以灵活地安排系统资源,简化复杂的软件设计,加快软件的开发效率,大大缩短了项目的开发周期。
道路交通灯是最常见的一种多任务控制系统,本文以此为倒,详细阐述了51嵌入式实时操作系统RTX51开发软件的方法和步骤。
1 系统硬件电路设计交通信号灯控制系统主要实现以下三个功能:(1)信号灯指示,即完成十字路口红、黄、绿交通信号灯的控制。
(2)时间显示,各个信号灯持续的时间显示。
(3)紧急情况响应,当系统出现故障或者有紧急情况是能够及时响应。
根据以上功能要求,完整的交通灯控制系统硬件电路如图l所示,主要由三部分模块组成:单片机最小系统模块、红绿色显示模块、倒计时显示模块、紧急中断模块。
(1)单片机最小系统:包括时钟电路和开关复位电路。
单片机选用具有成本低廉且具有串口ISP下载功能的STC89C52单片机,晶振选用12 MHz。
(2)信号灯指示电路:东西南北四个方向分别有红、绿、黄三个状态指示的灯,其中南北方向的红绿黄发光二极管分别连接到P1.O~P1.2,东西方向的红绿黄发光二极管分别连接到P1.3~P1.5。
(3)倒计时显示:每个交通灯状态倒计时时间由两位共阳数码管显示,八位段码分别连接到P0.0~P2.7,两位位选通过反向器分别连接到P3.4、P3.5。
(4)紧急中断:开关K1为紧急中断开关,当有特殊情况时按下K1,K1连接到单片机P3.2外部中断O输入端。
2 基于RTX51的软件设计近年来,利用嵌入式实时操作系统来开发嵌入式系统的软件已是大势所趋。
这是因为传统的这类设计中,大多采用了中断结合单任务的顺序机制进行,这种设计方法虽然比较直观,但是也带来了诸如稳定性差、不便于调试等问题。
RTX51实时操作系统PPT
![RTX51实时操作系统PPT](https://img.taocdn.com/s3/m/a1c65fa7a5e9856a5712607c.png)
15.2 RTX51的特点
➢ RTX51是一款小巧的针对基于8051核心的嵌入式系统的多 任务RTOS。使用它可以简化比较复杂、有严格时间限制 的程序的设计过程。RTX51主要有两个不同的可用版本: 标准版(RTX51-Full)和精简版(RTX51-Tiny)。
➢ 在RTX51-Full中:既可以以轮循(Round-Robin)方式执 行任务,也可以按4级任务优先级的方式切换不同优先级 的任务。以并行方式工作,支持中断管理,信号和消息 可以通过邮箱系统在不同任务之间传递。
21
用于任务管理的常见系统函数
5、os_wait 返回值:当有一个指定的事件发生时,任务被置为就绪态。
当任务继续执行时,os_wait返回重新启动任务的特 定事件。有以下可能的返回值:
事件
描述
RDY_EVENT 任务就绪标志被os_set_ready或isr_set_ready函数置位
➢ 时间片一般是比较短促的,一个时间片大约只有毫 秒级时间。正是由于这个原因,在用户看来,多个 任务似乎是在同时执行的。
11
15.3 RTX51的程序设计 —运行机制
➢ RTX51利用了一个由定时器0的中断信号驱动的定 时程序来实现上述时间片的控制。定时器产生的 周期性中断信号用来驱动RTX51的定时节拍。
4
多任务系统的执行特点
➢ 多任务系统的设计思路: 各功能模块(如显示、键盘扫描等等)处于 等同地位。 各功能模块执行顺序可在程序运行过程中动 态地改变。 各子任务在自已的时间片内运行,通过合理 设计时间片大小和各任务的优先级,可以自 然地满足系统内各种复杂的时序要求。
➢ 类似这样的任务管理和调度,就是多任务OS的 核心。
➢ 实时操作系统(Real-Time Operating System, RTOS),是指当外界事件或数据产生时,能够 接受并以足够快的速度予以处理,其处理的结 果又能在规定的时间之内来控制生产过程或对 处理系统作出快速响应,并控制所有实时任务 协调一致运行的操作系统。
Small RTOS51系统及实时系统的相关概念
![Small RTOS51系统及实时系统的相关概念](https://img.taocdn.com/s3/m/daf6f48fa0116c175f0e482b.png)
Small RTOS51系统笔记及实时系统的相关概念Veiko2011-4 Small RTO51简介Small RTOS51的特点1、公开的源代码:只要遵循许可协议,任何人可以免费获得源代码。
2、可移植性:作者尽量把与CPU相关部分压缩到最小,与CPU无关的代码部分用ASIC C编写。
3、可固化:Small RTOS51为嵌入式系统设计,如有固化手段,可以嵌入到产品中成为产品的一部分。
4、占先式:Small RTOS51可以管理16个用户任务,每个任务优先级不同。
Small RTOS51总是运行就绪条件下优先级最高的任务。
5、中断管理:中断可以使正在执行的任务挂起。
如果优先级更高的任务被中断唤醒,则高优先级的任务在中断嵌套全部退出后立即执行。
中断嵌套层数可达255层。
如果需要,可以禁止中断嵌套管理。
6、RAM要求小:Small RTOS51为小RAM系统设计,因而RAM需求小,相应的系统服务也少。
Small RTOS51的动行条件首先,必须有一个基于51系列单片机的C语言编译器。
如果需要直接使用这些代码,则就需要Keil C51编译器了。
当不使用消息队列时,需要Keil C51V6.14以上版本;当使用消息队列时,需要Keil C51V6.23以上版本。
特别注意:当程序复杂时不能用9级优化。
其次,必须有一个完全兼容51的单片机;当然,也可以使用软件仿真运行。
Small RTOS51的存储器需求Small RTOS51可以在没有任何外部数据存储器的单片8051系统上运行,但应用程序仍然可以访问外部存储器。
Small RTOS51可以使用C51支持的全部存储器模块,选择记忆模型仅影响应用目标的位置。
一般来说,Small RTOS51应用程序工作于小模式下。
Small RTOS51没有按照bank switching程序来设计,不能使用code banking程序。
Small RTO51的任务堆栈的计算为了节省RAM,Small RTOS51把所有自由内部RAM分配给当前任务。
51单片机操作系统
![51单片机操作系统](https://img.taocdn.com/s3/m/09fc5540e45c3b3567ec8b9b.png)
嵌入式实时操作系统,可以充分的利用单片机的资源,提高CPU使用效率。
操作系统最主要就是实现任务的调度、管理。
同时对于实时操作系统来说响应时间很重要。
操作系统编写最主要就是用到了堆栈SP于RET指令。
这两个东西怎么用呢?其实在我们每次调用函数的时候都会自动将函数的断点地址(执行函数调用时的PC)压入到SP中,而从函数中返回时其实是利用RET指令将断点弹回到PC(程序指针)中。
所以利用堆栈和RET指令就可以实现简单的任务的切换。
这么说肯定挺模糊的,接下来一步一步解释。
首先,要知道任务是一个死循环。
如下面所示,可以看出两个任务都是死循环,按照以往的情况,程序是跳不出来的,只能在while(1)中无限执行。
那怎么才可以实现从task0到task1的切换呢?其实如果我们能够改变PC的值是不是就可以改变程序执行顺序了。
任务的调度切换就是利用改变PC的值来改变程序执行顺序的。
其次,就是要解决如何实现PC值的正确变换问题,如何让PC指向我们需要执行的地方。
这就是通过堆栈来实现的。
我们可以为每个任务建立一个堆栈用于保存任务PC的值,以及任务寄存器的值。
这样每次进行任务切换时只要从相应的堆栈中取出PC和寄存器的值就可以实现任务的调度了。
在程序中于寄存器相关的程序使用在C语言中嵌入汇编来实现的。
因为直接使用C语言不能直接控制寄存器。
在本程序中,入栈和出栈是通过汇编实现的。
一个简单的操作系统如下所示,只能实现简单的任务调度,延时。
必须注意,空闲任务(Idle)必须建立,否则会出错。
#include<reg52.h>#define OSEnterCritical() EA=0#define OSExitCritical() EA=1#define EnterInt() EA=0;#define uint unsigned short int#define uchar unsigned char#define MAX_Tasks 3#define False 0#define Ture 1#define MaxPrio 2#define IdlePrio MaxPrio#define OS_Task_Create_Error 1#define OS_Delet_Task_Error 2#define OS_Delet_Task_Not_Exit 3#define OS_Resume_Idle_Error 4#define OS_Resume_Task_Error 5typedef struct{uchar OSStackTop; //SPuchar OSSuspend;uchar OSTCBDly; //delay time}OSTCB;uchar code OSMapTbl[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};OSTCB OSTCBTbl[MAX_Tasks];volatile uchar OSRdyTbl;volatile uchar OSIntNesting; //用于中断锁死volatile uchar OSSchNesting; //任务切换上锁volatile uchar OSRuning=False;volatile uchar OSStartStack[MAX_Tasks][20];volatile uchar OSPoint[MAX_Tasks][2];volatile uchar OSPrioCur;//volatile uchar OSTaskPend;OSInit(){// uchar i;EA=0;ET0=1;TMOD=0x01;TH0=0xB1;TL0=0xE0;OSRdyTbl=0;OSIntNesting=0;OSSchNesting=0;}//PCL,PCH,ACC ,B,DPL,DPH,PSW,R0-R7uchar *OSStackInit(uint task,uchar *ptr,uchar OSPrio){uchar* stk;stk=ptr;OSPoint[OSPrio][0]=task;OSPoint[OSPrio][1]=task>>8;*(stk++)= OSPoint[OSPrio][0];*(stk++)= OSPoint[OSPrio][1];*(stk++)= 0x00; //ACC*(stk++)= 0x00;*(stk++)= 0x00;*(stk++)= 0x00;*(stk++)= 0x00;*(stk++)= 0x00;*(stk++)= 0x00;*(stk++)= 0x00;*(stk++)= 0x00;*(stk++)= 0x00;*(stk++)= 0x00;*(stk++)= 0x00;*(stk) = 0x00;return stk;}uchar OSTaskCreate(uint task,uchar *ptr,uchar OSPrio){uchar* psp;OSEnterCritical();if(OSPrio<=MaxPrio) //创建的任务优先级有效{psp=OSStackInit(task,ptr,OSPrio); //初始化堆栈OSRdyTbl|=OSMapTbl[OSPrio];OSTCBTbl[OSPrio].OSStackTop=psp;OSTCBTbl[OSPrio].OSSuspend=0;OSTCBTbl[OSPrio].OSTCBDly=0;}else{OSExitCritical();return OS_Task_Create_Error;}OSExitCritical();}/*===================================================== 任务调度函数入口参数:无函数说明:进入函数后,先进行堆栈保护,然后查找最高优先级任务运行======================================================*/void OSSchedule(){uchar i;OSEnterCritical();#pragma asmPUSH ACCPUSH BPUSH DPHPUSH DPLPUSH PSWPUSH 0PUSH 7PUSH 1PUSH 2PUSH 3PUSH 4PUSH 5PUSH 6#pragma endasmOSTCBTbl[OSPrioCur].OSStackTop=SP;if(OSRdyTbl) //如果就续表中有任务{for(i=0; i<MAX_Tasks;i++){if((OSRdyTbl & OSMapTbl[i])&&(!OSTCBTbl[i].OSSuspend)) //任务优先级最高且未被挂起{OSPrioCur=i;break;}}}SP=OSTCBTbl[OSPrioCur].OSStackTop;#pragma asmPOP 6;POP 5;POP 4;POP 3;POP 2;POP 1;POP 7;POP 0;POP PSW;POP DPL;POP DPH;POP B;POP ACC;#pragma endasmOSExitCritical();}void OSStart(){TR0=1;EA=1;while(1);}/*=========================================================延时若干个系统时钟入口参数:延时系统时间个数===========================================================*/ void OSDelay(uchar time){if(time==0)//延时为0,返回return;OSEnterCritical();OSTCBTbl[OSPrioCur].OSTCBDly=time;OSTCBTbl[OSPrioCur].OSSuspend=1;OSExitCritical();OSSchedule();}/*=========================================================任务删除函数入口参数:为被删除任务优先级函数说明:将任务从就绪表中删除===========================================================*/ uchar OSTaskDelet(uchar priority){OSEnterCritical();if(priority>=IdlePrio){OSExitCritical();return OS_Delet_Task_Error;}if(!(OSRdyTbl & OSMapTbl[priority])){OSExitCritical();return OS_Delet_Task_Not_Exit;}OSRdyTbl &= ~(OSMapTbl[priority]);OSExitCritical();if(priority<OSPrioCur){OSSchedule();}}/*=========================================================任务恢复函数入口参数:恢的任务优先级函数说明:恢复被OSTaskDelet()删除的任务===========================================================*/ uchar OSTaskResume(uchar priority){OSEnterCritical();if(priority==IdlePrio)//恢复的任务不能为空闲任务,为空闲任务返回错误标志{OSExitCritical();return OS_Resume_Idle_Error;}if((!(OSRdyTbl & OSMapTbl[priority])) && (priority>=0)){OSRdyTbl |= (OSMapTbl[priority]);}else //返回的任务不存在,返回错误标志{OSExitCritical();return OS_Resume_Task_Error;}OSExitCritical();if(priority<OSPrioCur){OSSchedule();}}/*=============================================================== 定时器0用于产生系统时钟,这里每过20ms中断一次。
单片机操作系统
![单片机操作系统](https://img.taocdn.com/s3/m/e3cc493887c24028915fc349.png)
(3)解决好函数的重入问题
开发实时占先式的操作系统,可重入函数是非用不可的。可重入函数可以被一个以上的任务调用,而不必担心数据被破坏。可重入函数任何时候都可以被中断,一段时间后又可以运行,而应用数据不会丢失。使得函数具有可重入性必须使得函数能够满足下列三个条件之一:
① 不使用共享资源;
(2)重入问题的解决
应该尽量使有重入性要求的函数的参数传递通过寄存器来完成,这样可以用一般的方法来编写函数,使得函数具有重入性。如果实在是寄存器不够用的话,可以动用硬件堆栈来保存这些局部变量。
(3)堆栈分配问题的解决 ቤተ መጻሕፍቲ ባይዱ
鉴于各个任务对于任务堆栈大小的要求不同,即使同一个任务在不同的时刻被中断,它对堆栈大小的要求也不相同的情况,可以将任务堆栈多分配出一个字节,用来统计任务堆栈中有效数据的个数。单片机的片内RAM中,堆栈的栈底也做一个标志,当任务切换时,把当前任务放在堆栈中的环境变量从栈底到栈顶全部拷贝到任务的堆栈中,然后把将要运行任务的任务堆栈中的所有数据恢复到栈底标志开始的地方。任务堆栈和硬件堆栈之间的数据拷贝如图1所示。
(2)操作系统不能占用太多的片内RAM空间
51系列单片机只有128个或者256个字节的片内RAM空间,稍微不注意就用完了。如果操作系统把片内的RAM使用得所剩无几,那用户的应用程序用什么? 如果说用户的程序可以把变量定义在片外RAM中的话,那么系统的硬件堆栈放在哪? 众所周知,51系列单片机的硬件堆栈不能放在片外,所以要在51系列单片机上开发操作系统的话就要少用它的片内RAM。但是不用片内RAM是办不到的,因为操作系统也要传递参数,也要使用堆栈。C51单片机的C函数传递参数是通过寄存器和存储器的,不能通过堆栈。但是可以通过一些措施使得操作系统代码少用片内RAM。
51单片机课设rtc显示设计
![51单片机课设rtc显示设计](https://img.taocdn.com/s3/m/60c5ffe9dc3383c4bb4cf7ec4afe04a1b071b0be.png)
一、概述在现代电子科技领域,51单片机作为一种常见的微控制器,广泛应用于各种电子设备中。
其中,实时时钟(Real-Time Clock,RTC)显示设计是51单片机课设中的重要内容之一。
本文将围绕这一主题展开讨论,并向读者介绍如何利用51单片机设计实时时钟显示系统。
二、51单片机课设rtc显示设计的基础知识1. 51单片机简介51单片机是一种常用的8位单片机,具有低功耗、高性能等优点。
其内置的定时器/计数器等功能模块,使其成为设计RTC显示系统的理想选择。
2. 实时时钟(RTC)概述RTC是一种能够提供精确时间信息的系统。
它通常由晶振、电池、时钟芯片等组成,能够长期稳定地提供当前的时间和日期,并可以实现闹钟、定时器等功能。
三、51单片机课设rtc显示设计的实际操作1. 硬件设计我们需要准备51单片机开发板、LCD液晶显示屏、RTC模块等硬件设备,并将它们进行合理地连接。
这样可以为后续的程序设计和调试奠定基础。
2. 软件编程我们需要编写相应的程序代码,以实现51单片机与RTC模块的通信和数据显示。
在程序设计中,需要考虑到时钟显示的格式、字体大小、背光亮度等因素,以提高用户体验。
3. 调试测试我们需要对整个系统进行综合调试测试,确保时钟显示系统能够正常运行,并且准确地显示时间和日期信息。
在此过程中,可能会出现一些技术难题,需要耐心地研究和解决。
四、51单片机课设rtc显示设计的应用和意义1. 实用性通过51单片机课设rtc显示设计,可以实现一个简单而实用的时钟显示系统。
该系统不仅可以作为日常生活中的电子钟表使用,还可以为其他电子设备提供准确的时间信号。
2. 教学意义RTC显示设计作为51单片机课设的重要内容,能够帮助学生掌握单片机系统的软硬件设计和调试技术。
通过自己动手设计和实现RTC显示系统,学生能够提高实际操作能力和创新意识。
3. 探索空间与传统的时钟设计相比,基于51单片机的RTC显示系统具有更大的探索空间。
单片机实时多任务操作系统分析
![单片机实时多任务操作系统分析](https://img.taocdn.com/s3/m/ef1dda8eb9d528ea81c77965.png)
乡堪 V A L 鑫毅
单片机 实时多任 务操作 系统分析
王甲深 冯立杰
(西安武替工程学院 陕西 西安 710086)
〔 要]简要介绍美国 e l 公司开发的 摘 K i 应用于 1 系列单片机的实时多 就55 任务操作系统R 1 的墓本情况和使用方法: 分析这个内核的任务管理和内 Tx5 存管理的 运
行机制及其对硬件的要求,给出其在软件设计中应注意的问题。
[关键词] 单片机
C l RX s T 51
文章编号: 1671一7597 ( 20 8) 0 10 13一 0 4 0 01
中图分类号: TGS 文献标识码: A 一、橄述
一般说来,单片机的应用系统中都需要同时执行很多任务,我们可以
利用实时操作系统来灵活地安排系统资源。R l 是美国K l 公司开发的一 Txs ei 种小型的面向袱55 系列单片机的实时多任务操作系统,它可以工作于 1 805 单片机以及派生家族中,简化了复杂的软件设计,缩短了项目 1 周期. 二、RTXS, 介绍 T 5 R X 有2个模式: RTX 完全模式和最小模式. R 5 最小模式版是 1 1 5 TX 1 R 5 完全版的一个子集,可以很容易地运行在805 系统上,而不需要外部 TX 1 1 R M(D TA) . R 5 完全模式有4个任务优先级,可以和中断函数并行处 A A x TX 1 理,各个任务之间通过使用 “ 邮箱”系统来进行信号和消息的传递,可以 动态地申 请和释放内存: 同时,可以强制一个任务停止执行,等待一个中 断,或者是其它中断传来的信号量或者消息。
( 一) RTX51任务
R 5 包括2类任务: 快速任务和标准任务。快速任务有很快的响应速 TX 1 度,每个快速任务使用805 一个单独的寄存器组,井且有自己的堆栈区 1 域。R 5 支持最大同时有3个快速任务。标准任务需要多一点的时间来进 TX 1 行任务切换,因此使用的内部R M A 相对快速任务要少,所有的标准任务共用 1个寄存器组和堆栈。当任务切换的时候. 当前任务的寄存器状态和堆栈内 容转移到外部存储器中。R 5 支持最大1 个标准任务. TX 1 6 ( 二) R 51任务状态 TX
OS-II实时操作系统是一种可移植
![OS-II实时操作系统是一种可移植](https://img.taocdn.com/s3/m/36e34116f78a6529647d5330.png)
4.1 任务堆栈初始化函数OSTaskStkInit()
此函数是在任务创建函数OSTaskCreat()或OSTaskCreatExt()中调用的。因为系统为每个任务申请了一个数组作为栈,当一个任务运行时,就把堆栈指针指向本任务的栈,任务堆栈初始化函数就是在任务创建时将要创建任务的堆栈进行初始化。但C51的堆栈指针SP是8位的,只能在片内RAM的256个字节内寻址。因其寻址空间有限且SP唯一,不能像DSP或ARM那样为每一段程序或每一种模式定义堆栈,需小心管理堆栈空间。为了适应上述情况,需要换一种思路,不是让SP去指向各任务堆栈空间,而是把各任务堆栈空间的内容复制到系统栈中。至于堆栈数组空间要有多大以及堆栈数组空间里放些什么内容,可以借鉴keil中中断函数的压栈情况,当中断函数不指定寄存器组时,编译器一般将PC、ACC、B、DPTR、PSW、R0~R7寄存器入栈,其中PC和DPTR是双字节的,其它都是单字节的,一共15个字节,所以把堆栈数组设计成至少15个字节的,以保证任务所用的寄存器都在堆栈数组中包含着。因为每个数组里放的是寄存器的值,在此就把这每个任务的堆栈数组叫做寄存器数组,暂且把寄存器数组设计成15个字节,依次存放PC、ACC、B、DPTR、PSW、R0~R7。
任务调度是μC/OS-II的重要部分,和具体的微处理器关系紧密。必须移植的5个函数有4个都和任务有关。任务调度就是保存当前任务的寄存器和PC指针(即当前任务的断点),然后把将要执行的任务的寄存器值返回给寄存器并把PC指向将要执行任务的断点。这些的实现要借助于堆栈和中断,为了简便起见,先看函数调用时堆栈的使用情况。在函数调用时,堆栈的一个重要功能就是保存被调函数的断点地址。若有4个函数,Fun1调用Fun2,Fun2调用Fun3,Fun3调用Fun4,Fun4为叶子程序(无子程序调用)。
51单片机的体系结构
![51单片机的体系结构](https://img.taocdn.com/s3/m/f3b3d063d0d233d4b04e6917.png)
整理ppt
30
堆栈特点:后进先出
堆栈有3个具体功能: (1) 保护断点 (2) 现场保护 (3) 临时暂存数据
整理ppt
31
4.4 特殊功能寄存器 单片机是通过特殊功能寄存器(SFR)对各种功 能部件进行集中控制。如下表:
整理ppt
32
4.5 外部数据存储器 单片机一般的内部RAM只有128 B或256B。 现在有大RAM容量单片机或集成了Data Flash的
执行程序时,在计算机控制器的控制下,取指令装置会 按PC的指向从存储器中读出第一条指令并译码,执行指 令所要求的操作。
整理ppt
16
3.3 程序执行过程 执行程序线路实际上按PC的指取指令运行,PC
就象引路人,称为程序指针。执行流程如下图:
整理ppt
17
程序指令取指执行过程
1、复位PC=0000 2、从PC取指,PC+1 3、取数据 4、执行指令 5、取下一条指令 ……
整理ppt
18
4 8051单片机的存储结构
8051单片机存储器采用哈佛结构: 1、有一根地址和数据总线。 2、程序存储器空间和数据存储器空间采用独
立编址。 3、拥有各自的寻址方式和寻址空间。
整理ppt
19
4.1 8051单片机的存储器结构
8051单片机存储器从物理结构上分四种: 1、片内程序存储器(只读存储器ROM) (类型:ROM、PROM、EPROM、E2PROM、Flash) 2、片外程序存储器 (类型同上) 3、片内数据存储器(读写存储器RAM) (类型:SRAM、DRAM、E2PROM、Flash) 4、片外数据存储器 (类型同上)