嵌入式c语言程序设计---实验指导书
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验项目1:嵌入式开发系统———熟悉KEIL C 开发环境使用方法实验目的:
1、熟悉KEIL C软件开发环境
2、搭建基本的开发环境
实验平台:
Windows XP 操作系统、Keil c 开发软件
主要实验内容:
一、上机熟悉KEIL C软件开发环境
二、掌握搭建基本开发环境的过程,掌握比较常用的选项设置
三、学生自己编写一段小的c代码,掌握编译过程。
本实验知识背景:
功能强大的单片机开发工具KEIL C
Keil Software 的8051开发工具提供以下程序你可以用它们来编译你的C源码汇编你的汇编源程序连接和重定位你的目标文件和库文件创建HEX文件调试你的目标程序。
●Windows应用程序uVision2是一个集成开发环境它把项目管理源代码编辑程序调试等集
成到一个功能强大的环境中
●C51美国标准优化C交叉编译器从你的C源代码产生可重定位的目标文件
●A51宏汇编器从你的8051汇编源代码产生可重定位的目标文件
●BL51连接/重定位器组合你的由C51和A51产生的可重定位的目标文件生成绝对目标文件●LIB51库管理器组合你的目标文件生成可以被连接器使用的库文件
●OH51目标文件到HEX格式的转换器从绝对目标文件创建Intel HEX 格式的文件
●RTX-51实时操作系统简化了复杂和对时间要求敏感的软件项目
对由这些工具组成的开发套件进行描述它们是为专业开发人员而设计的,但所有层次的编程人员都可以用它们来获得8051微控制器的绝大部分应用。
实验步骤:
1. 打开KEIL 软件,新建工程
2. 命名KEIL工程文件名,然后保存
3. 弹出器件选择窗口,选择Atmel 并双击
4. 选择AT89C51 或AT89S51 ,然后点击确定
5. 提示问你是否加载标准8051 Startup 文件,点击否
6. 新建一个文本文件
7. 输入源程序或直接从其他的文本中复制源程序粘贴进来。
8. 保存刚才的文本文件
9.注意选择后缀.c
10. 把刚才保存的 *.c添加到工程中
11. 点击完Add 后,这个窗口还在,再点击 Close
12.设置目标文件属性
13. 把 Create HEX File 前面的方框钩起来
14.编译源程序
15. 状态显示编译结果
16.点击链接按钮,生成16进制文件
17.状态显示生成16进制文件
实验项目2:嵌入式C语言程序的设计与调试
实验目的:
1、进一步熟悉KEIL C软件开发环境
2、搭建基本的开发环境
3、编写代码并使用KEIL C进行调试
实验平台:
Windows XP 操作系统、Keil c 开发软件
主要实验内容:
一、上机熟悉KEIL C软件开发环境
二、掌握搭建基本开发环境的过程,掌握比较常用的选项设置
三、学生自己编写一段小的c代码,掌握编译过程,进行调试,学会观察寄存器
和管脚等调试方法。
四、结合实验项目1完成实验报告1份
本实验知识背景:
一、掌握实验项目1的基本技能,能够搭建基本的开发环境。
二、了解KEIL C开发软件的调试环境
三、为方便观察调试现象,应针对单片机的寄存器或管脚编写代码。
实验步骤:
1、按照实验项目1搭建基本实验平台,学生可输入自己的实验代码。
2、输入代码后,处理编译过程中的问题,保证编译链接通过。
3、在编译状态点击按钮可进入调试状态。
4、进入调试状态
5、,熟悉并掌握调试环境中的主要快捷按钮
6、查看P1端口状态
7、点击运行,观察P1端口
8、熟悉view按钮
9、点击按钮观察存储器,在address:处填入P1端口地址0x90可以观察P1端口在不断变化。
10、右击代码中的特殊功能寄存器P1,选择菜单中的最后一项将P1添加到watch windows 1窗口。
11、可以在watch windows 1 观察P1 的变化。
12、学生独立操作,进一步熟悉操作环境,并操作前面介绍的主要功能。
13、结合实验项目1完成实验报告1份。
实验项目3:硬件测试编码设计与调试(没有实验设备)
实验目的:
1、利用KEIL C软件和51单片机实验开发板调试端口的led
2、掌握软件与硬件的平台搭建
3、学习下载hex代码,并在KEIL C环境下进行调试。
4、使用proteus软件对实验结果进行仿真。
实验平台:
Windows XP操作系统、Keil c 开发软件、proteus软件
主要实验内容:
一、搭建KEIL C软件与实验开发板的开发环境,设置好波特率、串口。
二、下载代码至目标板,单步执行代码,注意观察实验现象。
三、对代码进行修改并调试,并进行仿真测试。
四、使用proteus软件对结果进行仿真实验,观察实验结果。
五、编写实验报告分析实验现象。
本实验知识背景:
为了弥补由于暂无实验设备无法进行软、硬件平台搭建的缺陷,加入ledkey.dll 和Dpj.dll两个能够模拟硬件的调试文件。
并将程序进行进行proteus仿真观察实验结果。
实验步骤:
1、调试文件的使用方法
由于暂无51单片机硬件实验平台,无法进行真正的调试开发,为此加入ledkey.dll 和Dpj.dll两个能够模拟硬件的调试文件。
加入的方法是:
1)、将这两个文件拷贝到keil\c51\bin。
2)、以ledkey.dll 为例,点击options for target的debug选项在parameter填入-dledkey。
3)、调出硬件仿真面板就可以使用了。
2、使用Proteus软件仿真方法
1)、打开proteus软件,单击菜单命令“File”->”open design”,打开对应实验的.DSN 文件。
2)、在文件中,左键双击AT89C51单片机,在弹出的对话框的“Program File”项中选择在keil文件中生成的十六进制HEX文件。
3)、单击页面左下角按钮开始进入程
序仿真状态,观察仿真结果与引脚的电平变化,红色代表高电平,蓝色代表低电平。
按钮停止仿真。
完成实验程序:
编写程序,完成下列实验。
1、设计程序,按下按键时,P1.1控制发光二极管点亮,否则,P1.0控制发光二极管点亮。
2、单片机系统控制要求为:(1)正常情况下,8个发光二极管点亮。
(2)按下K1时,第1个和第8个发光二极管闪烁,间隔时间为1S。
(3)按下K2时,8个发光二极管闪烁,间隔为2S。
(4)发光二极管由单片机P0口控制。
3、使用单片机P0口实现8个LED的流水灯控制。
实验项目4:中断系统程序设计
实验目的:
1、掌握嵌入式c语言开发51单片机中断系统的方法和特点。
2、掌握软件开发及调试平台的搭建
3、通过调试分析并学习中断优先级方面的知识
实验平台:
Windows XP 操作系统、Keil c 开发软件、proteus软件
主要实验内容:
一、编写中断及中断优先级代码,搭建KEIL C软件开发环境,并编译链接通过。
二、单步执行代码,注意观察实验现象并进行分析。
三、使用proteus软件对结果进行仿真实验,观察实验结果。
四、编写实验报告分析实验现象。
本实验知识背景:
1、中断的概念:CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生);CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务);待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断。
80C51的中断系统有5个中断源(8052有 6个),2个优先级,可实现二级中断嵌套。
TCON IE硬件查询
2、80C51中断的控制
中断允许控制
CPU对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器IE控制的。
EX0(IE.0),外部中断0允许位;
ET0(IE.1),定时/计数器T0中断允许位;
EX1(IE.2),外部中断0允许位;
ET1(IE.3),定时/计数器T1中断允许位;
ES(IE.4),串行口中断允许位;
EA (IE.7), CPU中断允许(总允许)位
中断请求标志
1)、TCON的中断标志
IT0(TCON.0),外部中断0触发方式控制位。
当IT0=0时,为电平触发方式。
当IT0=1时,为边沿触发方式(下降沿有效)。
IE0(TCON.1),外部中断0中断请求标志位。
IT1(TCON.2),外部中断1触发方式控制位。
IE1(TCON.3),外部中断1中断请求标志位。
TF0(TCON.5),定时/计数器T0溢出中断请求标志位。
TF1(TCON.7),定时/计数器T1溢出中断请求标志位
2)、SCON的中断标志
RI(SCON.0),串行口接收中断标志位。
当允许串行口接收数据时,每接收完一个串行帧,由硬件置位RI。
同样,RI必须由软件清除。
TI(SCON.1),串行口发送中断标志位。
当CPU
送缓冲器时,就启动了发送过程。
每发送完一个串行帧,由硬件置位TI。
响应中断时,不能自动清除TI,TI必须由软件清除。
中断优先级控制
80C51
的中断优先级都是由中断优先级寄存器IP中的相应位的状态来规定的。
PX0(IP.0),外部中断0优先级设定位;
PT0(IP.1),定时/计数器T0优先级设定位;
PX1(IP.2),外部中断0优先级设定位;
PT1(IP.3),定时/计数器T1优先级设定位;
PS (IP.4),串行口优先级设定位;
PT2 (IP.5) ,定时/计数器T2优先级设定位。
而80C52单片机有四个中断优先级,即可实现四级中断服务嵌套。
每个中断源的中断优先级由中断优先级寄存器IP和IPH中的相应位的状态来规定的。
PX0(IPH.0),外部中断0优先级设定位;
PT0(IPH.1),定时/计数器T0优先级设定位;
PX1(IPH.2),外部中断0优先级设定位;
PT1(IPH.3),定时/计数器T1优先级设定位;
PS (IPH.4),串行口优先级设定位;
PT2 (IPH.5) ,定时/计数器T2优先级设定位。
同一优先级中的中断申请不止一个时,则有中断优先权排队问题。
同一优先级的中断优先权排队,由中断系统硬件确定的自然优先级形成,其排列如所示:
80C51单片机的中断优先级有三条原则:
CPU同时接收到几个中断时,首先响应优先级别最高的中断请求。
正在进行的中断过程不能被新的同级或低优先级的中断请求所中断。
正在进行的低优先级中断服务,能被高优先级中断请求所中断。
为了实现上述后两条原则,中断系统内部设有两个用户不能寻址的优先级状态触发器。
其中一个置1,表示正在响应高优先级的中断,它将阻断后来所有的中断请求;另一个置1,表示正在响应低优先级中断,它将阻断后来所有的低优先级中断请求。
可以演示keil下使用c语言按位设置和对整个寄存器的设置在程序中的使用。
C语言的中断函数处理,与汇编语言的区别。
中断应用的C语言编程
C51编译器支持在C源程序中直接开发中断程序。
中断服务程序是通过按规定语法格式定义的一个函数。
中断服务程序的函数定义的语法格式如下:
返回值函数名([参数]) interrupt m [using n]
{
}
MCS-51中断源编号
实验步骤:
1、在KEIL C环境下建立一个工程项目
2、编写代码,设置EA、TCON、IP等寄存器
3、编写中断函数
4、编译并连接,处理出现的错误保证调试通过。
5、利用实验项目1、2学到的知识调试,可以使用单步执行和设置断点等方式。
6、调试时须打开调试端口,使用键盘LED仿真板。
7、利用实验项目3中学到的知识同proteus软件观察实验结果。
完成实验程序:
4、使用定时/计数器作为延时控制,要求两灯在P0.0和P0.1之间按1S互相闪烁。
分析思考:
1)、利用P3管脚,分别使用下降沿和电平触发方式观察中断差别。
2)、观察中断发生前后TCON的变化。
实验项目5:中断、定时器小系统综合设计、调试及测试
实验目的:
1、利用KEIL C 软件,编制应用程序控制发光二极管定时闪烁
2、掌握定时/计数器工作方式的控制
3、分别用中断和查询两种方式实现 实验平台:
Windows XP 操作系统、Keil c 开发软件、proteus 软件 主要实验内容:
一、根据定时器的结构与工作原理,选择定时器工作方式并计算初值。
二、根据要求编写程序。
三、调试代码、编写实验报告。
本实验知识要点:
一、定时 / 计数器的结构
T0、T1均为16位加1计数器。
TH0
TL0
1、工作方式控制寄存器 TMOD
T1 T0
TMOD GATE C//T M1 M0 GATE C//T M1 M0 GATE —— 门控位。
GATE = 0 启动不受 /INT0或 /INT1的控制; GATE = 1 启动受 /INT0 或 /INT1 的控制。
C//T —— 外部计数器 / 定时器方式选择位 C//T = 0 定时方式; C //T = 1 计数方式。
M1M2 —— 工作模式选择位。
M1 M0 模式说明
0 0 0 13位定时/计数器
高八位TH(7 ~ 0)+ 低五位TL(4 ~ 0)
0 1 1 16位定时/计数器
TH(7 ~ 0)+ TL(7 ~ 0)
1 0
2 8位计数初值自动重装
TL(7 ~ 0)TH(7 ~ 0)
1 1 3 T0运行,而T1停止工作,8位定时/计数。
2、定时/ 计数器控制寄存器TCON
TCON TR1 TR0
TR0 ——定时/ 计数器0运行控制位。
软件置位,软件复位。
与GATE有关,分两种情况:
GATE = 0 时,若TR0 = 1,开启T0计数工作;
若TR0 = 0,停止T0计数。
GATE = 1 时,若TR0 = 1 且/INT0 = 1时,开启T0计数;
若TR0 = 1 但/INT0 = 0,则不能开启T0计数。
若TR0 = 0,停止T0计数。
TR1 ——定时/ 计数器1运行控制位。
用法与TR1类似。
二、定时/ 计数器的四种工作模式
1、模式0
T1、T0的等效逻辑结构(显示投影胶片)
计数寄存器TL i低5位+ TH i8位
C//T = 0 ——定时
C//T = 1 ——对外计数。
定时:fosc / 12 = 1 /(12/fosc)= 1 / T
等间隔,次数已定,时间确定
即对机器周期进行计数。
左图定时时间为n×T。
n
计数:脉冲不等间隔。
每个下降沿计数一次
确认一次负跳变需两个机器周期,
所以,计数频率最高为fosc / 24。
GATE = 0 时,A =“1” B = “1”(TRi = 1时),启动计数
B = “0”(TRi = 0时),停止计数。
GATA = 1 时, A =“1”(/ INTXi =“1”) B =“1”(TRi = 1时)启动,
B = “0”(TRi = 0时)停止。
A =“0”(/ INTXi =“0”)停止。
2、模式1
与模式0相似。
与模式0的区别:计数位数不同。
计数寄存器:THi(高8位)+ TLi(低8位)
3、模式2
与模式0、1的区别:1)计数位数不同;
2)初值自动重装。
计数寄存器:
TLi(8位)溢出时TFi
THi(8位初值)
4、模式3
T0定时/计数,而T1停止计数,但可作波特率发生器。
T0分成两独立定时/计数器TL0和TH0。
TL0使用C//T、GATE、TR0、/INT0、TF0定时/计数,
TH0使用TR1、TF1 因此,只能用于定时。
(展示投影胶片。
)
模式3时,T1可定时为模式0、1、2的定时/计数,但不可中断,所以一般只作串口波特率发生器用。
三、定时/计数器的应用
编程前确定参数:
(1)定时/计数器——T0、T1选择其一,
(2)工作方式——C//T及GATA,
(3)计数初值——加1计数、16位。
FFFFH X=M-N;M=213=8192(模式0)
X M=216=65536(模式1)
M=28=256 (模式2、模式3)
0000H
(4)工作模式——M1、M0
实验步骤:
1、在KEIL C环境下建立一个工程项目
2、编写代码,设置EA、TCON、IP等寄存器
3、编写中断函数
4、编译并连接,处理出现的错误保证调试通过。
5、利用实验项目1、2学到的知识调试,可以使用单步执行和设置断点等方式。
6、调试时须打开调试端口,使用键盘LED仿真板。
7、利用实验项目3中学到的知识同proteus软件观察实验结果。
完成实验程序:
5、P0接8个LED,使8个LED闪烁。
当奇数次按下INT0的按钮时,8个LED 每次同时点亮4个,点亮3次,即D0~D3与D4~D7交叉点亮3次。
偶数次按下INT0的按钮时,则D0~D7进行左移和右移2次。
当按下INT1的按钮时,产生报警(INT1优先)。
6、教材P188,使用查询和中断方式实现方波的设置。
观察实验结果,各寄存器的变化。
本次实验可以使用软件仿真硬件插件dpj.dll和ledkey.dll进行仿真,并利用proteus软件观察实验结果。
前面实验项目3中,已经介绍了dpj.dll、ledkey.dll 和proteus软件的使用方法。
实验项目6:基于单片机的行列式键盘操作实验
实验目的:
1、掌握AT89C51与行列式键盘的接口技术。
2、使用proteus软件仿真键盘扫描程序,深刻理解键盘扫描程序的含义。
实验平台:
Windows XP 操作系统、Keil c 开发软件、proteus软件
主要实验内容:
一、根据行列式键盘的设计原理,编写键盘扫描程序。
二、调试代码、编写实验报告。
本实验知识要点:
一、键盘输入过程:
1、CPU判断是否有键按下
2 、确定按下是哪个键
3、此键代表的信息翻译成机器识别的代码
二、扫描程序查询过程:
1 、行输出全为0,无键按下,列输出全为1,扫描码:F0H
2 、有键按下,P14-P17输出非全1,检查按键所在位置
3 、逐行扫描,读出列值
4 、对得到的行号和列号译码,得到键值
5 、消除除键的抖动
实验步骤:
1、在KEIL C环境下建立一个工程项目。
2、编写代码,编译并连接,处理出现的错误保证调试通过。
3、利用实验项目3中学到的知识同proteus软件观察实验结果。
完成实验程序:
7、教材P269键盘扫描程序。
实验项目7:双机串行通信
实验目的:
1、掌握AT89C51双机通信的基本原理。
2、实现实现两片AT89C51之间的通信,甲机将数据发送到乙机并显示出来。
使用proteus软件仿真程序,深刻理解双机通信的作用。
实验平台:
Windows XP 操作系统、Keil c 开发软件、proteus软件
主要实验内容:
一、根据双机通信原理,编写双机通信程序。
二、调试代码、编写实验报告。
本实验知识要点:
在串行通信中,数据是在两个站之间传送的。
按照数据传送方向,串行通信可分为三种制式:单工制式(Simplex)、半双工制式(Half duplex)、全双工制式(Full duplex)。
其中,单工制式是指甲乙双方通信只能单向传送数据。
半双工制式是指通信双方都具有发送器和接收器,双方既可发送也可接收,但接收和发送不能同时进行,即发送时就不能接收,接收时就不能发送。
全双工制式是指通信双方均设有发送器和接收器,并且将信道划分为发送信道和接收信道,两端数据允许同时收发,因此通信效率比前两种高。
AT89C51内部有一个可编程全双工串行通信接口。
该部件不仅能同时进行数据的发送和接收,也可作为一个同步移位寄存器使用。
下面将对其内部结构、工作方式以及波特率进行介绍。
(1)数据缓冲器(SBUF)
SBUF是串行口缓冲寄存器,包括发送寄存器和接收寄存器,以便能以全双工方式进行通信。
此外,在接收寄存器之前还有移位寄存器,从而构成了串行接收的双缓冲结构,这样可以避免在数据接收过程中出现帧重叠错误。
发送数据时,由于CPU是主动的,不会发生帧重叠错误,因此发送电路不需要双重缓冲结构。
在逻辑上,SBUF只有一个,它既表示发送寄存器,又表示接收寄存器,具有同一个单元地址99H。
但在物理结构上,则有两个完全独立的SBUF,一个是发送缓冲寄存器SBUF,另一个是接收缓冲寄存器SBUF。
如果CPU写SBUF,数据就会被送入发送寄存器准备发送;如果CPU读SBUF,则读入的数据一定来自接收缓冲器。
即CPU对SBUF的读写,实际上是分别访问上述两个不同的寄存器。
(2)串行控制寄存器(PCON)
串行控制寄存器SCON用于设置串行口的工作方式、监视串行口的工作状态、控制发送与接收的状态等。
它是一个既可以字节寻址又可以位寻址的8位特
殊功能寄存器。
SCON用于串行通信方式的选择,收发控制及状态指示,各位含义如下:
SM0 SM1:串行口工作方式选择位。
这两位组合成00、01、10、11对应于工作方式0、1、2、3。
串行接口工作方式特点见下表。
SM2:多机通信控制位。
REN:接收允许控制位。
软件置1允许接收;软件置0禁止接收。
TB8:方式2或3时,TB8为要发送的第9位数据,根据需要由软件置1或清0。
RB9:在方式2或3时,RB8位接收到的第9位数据,实际为主机发送的第9位数据TB8,使从机根据这一位来判断主机发送的时呼叫地址还是要传送的数据。
TI:发送中断标志。
发送完一帧数据后由硬件自动置位,并申请中断。
必须要软件清零后才能继续发送。
注意:TI在任何工作方式下都必须由软件清0。
RI:接收中断标志。
接收完一帧数据后由硬件自动置位,并申请中断。
必须要软件清零后才能继续接收。
(3)输入移位寄存器
接收的数据先串行进入输入移位寄存器,8位数据全移入后,再并行送入接收SBUF中。
(4)波特率发生器
波特率发生器用来控制串行通信的数据传输速率的,51系列单片机用定时器T1作为波特率发生器,T1设置在定时方式。
波特率时用来表示串行通信数据传输快慢程度的物理量,定义为每秒钟传送的数据位数。
(5)电源控制寄存器PCON(其最高位为SMOD)
(6)波特率计算
波特率(band rate)是异步通信中每秒钟传送的二进制数码的位数(比特数),单位是位/秒。
波特率有以下两种作用:1)反映串行通信的速率;2)反映对传输通道的要求:波特率越高,要求的传输通道的频带宽度就越宽异步通信:波特率为每秒传送的字符数和每个字符位数的乘积。
AT89C51串行通信共有4种工作方式,它们分别是方式0、方式1、方式2
和方式3,由串行控制寄存器SCON中的SM0 SM1决定。
本设计用串行口方式1收发程序,实现两片AT89C51之间的通信。
(1)方式1发送
方式1输出时,数据由TXD输出,一帧信息为10位,1位起始位0,8位数据位(先低位)和1位停止位1。
当执行一条数据写发送缓冲器SBUF的指令,就启动发送。
发送开始时,内部发送控制信号变为有效。
将起始位向TXD输出,此后,每经过一个TX时钟周期,便产生一个移位脉冲,并由TXD输出一个数据位。
8位数据位全部发送完毕后,置“1”TI。
(2)方式1接收
数据从RXD(P3.0)脚输入。
当检测到起始位的负跳变时,开始接收数据。
定时控制信号有两种):接收移位时钟(RX时钟,频率和波特率相同)和位检测器采样脉冲(频率是RX时钟的16倍,1位数据期间,有16个采样脉冲),当采样到RXD端从1到0的跳变时就启动检测器,接收的值是3次连续采样(第7、8、9个脉冲时采样)进行表决以确认是否是真正的起始位(负跳变)的开始。
当一帧数据接收完,须同时满足两个条件,接收才真正有效。
1)RI=0,即上一帧数据接收完成时,RI=1发出的中断请求已被响应,SBUF 中的数据已被取走,说明“接收SBUF”已空。
2)SM2=0或收到的停止位=1(方式1时,停止位已进入RB8),则收到的数据装入SBUF和RB8(RB8装入停止位),且置“1”中断标志RI。
若这两个条件不同时满足,收到的数据将丢失。
实验步骤:
1、在KEIL C环境下建立一个工程项目。
2、编写代码,编译并连接,处理出现的错误保证调试通过。
3、利用实验项目3中学到的知识同proteus软件观察实验结果。
完成实验程序:
8、用两块AT89C51模拟甲机和乙机,在甲机的P1口和指拨开关相连,通过调节指拨开关来输入数据,、然后把这个数据发出到乙机去。
在乙机里,先通过RXD 口读取指拨数据,然后P1口通过总线传导各LED灯,P1一共有8个引脚,每个引脚对应一个灯(可以考虑中断和查询两种方法)。
实验项目8:系统软件包、第三方应用程序包应用
----------- RTX51-Tiny实时操作系统实验目的:
1、掌握RTX51-Tiny实时操作系统调度机制
2、掌握软件开发及调试平台的搭建方法
3、通过os_wait函数的学习,能基本使用RTX51-Tiny完成简单的程序设计。
实验平台:
Windows XP 操作系统、Keil c 开发软件
主要实验内容:
一、了解并掌握RTX51-Tiny的基本使用方法,特别是掌握os_wait函数的使用。
二、能够搭建RTX51-Tiny的开发平台。
三、编写实验报告分析实验现象。
本实验知识背景:
RTX51是一个用于8051系列处理器多任务实时操作系统,RTX51可以简化那些复杂而且时间要求严格的工程的软件设计工作。
有二个不同的RTX51版本可以利用:
RTX51 Full使用四个任务优先权完成同时存在时间片轮转调度和抢先的任务切换, RTX51工作在与中断功能相似的状态下,信号和信息可以通过邮箱系统在任务之间互相传递,你可以从一存储池中分配和释放内存,你可以强迫一个任务等待中断超时或者是从另一个任务或中断发出的信号或信息。
RTX51 Tiny 是一个 RTX51的子集它可以很容易地在没有任何外部存储器的单片8051系统上运转,除了下列例外RTX51 Tiny支持许多在RTX51中的特征,RTX51 Tiny仅支持时间片轮转任务切换和使用信号进行任务切换不支持抢先式
的任务切换,不包括消息历程,没有存储器池分配程序。
许多微处理器应用程序要求同时执行两个工作或任务. 对于这样的应用程序一个实时操作系统RTOS 允许灵活的分配系统资源中央处理器存储器等等.)给各个任务 RTX51是一个很好使用的强大的实时操作系统 RTX51可以运行于所有的8051派生机型。
可以使用标准 C语言编写和编译一个程序或使用 C51构造编译他们仅在指定任务标识符和优先权上有一点差别. RTX51程序也要求你载运程序中用include命令引入实施管理的头文件并使用 BL51 linker/locator进行连接和选择适当的 RTX51库文件。
单任务程序
一个标准的 C语言程序从主函数开始执行,在一嵌入式应用中,主函数通常是一段无限循环的代码可以认为是一个连续执行的单独任务。
例如
int counter;
void main (void) {
counter = 0;
while (1) { /* 始终重复 */
counter++; /* 计数器加1 */
}
}
时间片轮转程序
更高级的 C语言程序可以在不使用实时操作系统的情况下实现时间片轮转
拟多任务系统,在这种系统中任务或功能被一段无限循环程序重复调用。
例如
int counter;
void main (void) {
counter = 0;
while (1) { /* 始终重复 */
check_serial_io ();
process_serial_cmds (); /* 处理串行输入 */
check_kbd_io ();
process_kbd_cmds (); /* process keyboard input */
adjust_ctrlr_parms (); /* adjust the controller */
counter++; /* increment counter */
}
}
用 R T X 5 1 进行时间片轮转调度
rtx51也能完成时间片轮转多重任务而且允许准并行执行多个无限循环或任务,任务并不是并行执行的而是按时间片执行的。
可利用的中央处理器时间被分成时间片由 RTX51分配一个时间片给每个任务,每个任务允许执行一个预先确定的时间,然后rtx51切换到另一准备运行的任务并且允许这个任务执行片刻,时间片非常段通常为几个毫秒,因此它表现得如同各个任务是同时地执行的。
RTX51使用一个8051硬件计时器中断作为定时程序。
产生的周期性中断用于驱动RTX51时钟,RTX51不需要在你的程序中拥有一个主函数,它将自动开始执行任务0 如果你确实有一个主函数你必须利用 RTX51 Tiny中的 os_create_task函数或RTX51中的 os_start_system函数手工启动 RTX51。
下列例子显示一个只使用时间片轮转任务调度的简单的 RTX51应用程序在本程序里的二个任务是简单计数器回路 rtx51开始执行函数名为 job0的任务 0 这些功能添加了另一个叫做 job1任务在 job0运行一会儿以后RTX51切换到
job1 在 job0运行一会儿以后RTX51转回到job0 这个过程将不确定地重复下去。
#include <rtx51tny.h>
int counter0;
int counter1;
void job0 (void) _task_ 0 {
os_create (1); /* mark task 1 as ready */
while (1) { /* loop forever */
counter0++; /* update the counter */
}。