51单片机操作系统的实现+源代码
- 格式:docx
- 大小:87.12 KB
- 文档页数:10
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语言可以打开和关闭中断。
3·1 汇编指令第3 章MCS 一51 系列单片机的指令系统和汇编语言程序3·1·1 请说明机器语言、汇编语言、高级语言三者的主要区分,进一步说明为什么这三种语言缺一不行。
3·1·2 请总结:(1)汇编语言程序的优缺点和适用场合。
(2)学习微机原理课程时,为什么肯定要学汇编语言程序?3·1·3MCS 一51 系列单片机的寻址方式有哪儿种?请列表分析各种寻址方式的访问对象与寻址范围。
3·1·4 要访问片内RAM,可有哪几种寻址方式?3·1·5 要访问片外RAM,有哪几种寻址方式?3·1·6 要访问ROM,又有哪几种寻址方式?3·1·7 试按寻址方式对MCS 一51 系列单片机的各指令重进展归类(一般依据源操作数寻址方式归类,程序转移类指令例外)。
3·1·8 试分别针对51 子系列与52 子系列,说明MOV A,direct 指令与MOV A,@Rj 指令的访问范围。
3·1·9 传送类指令中哪几个小类是访问RAM 的?哪几个小类是访问ROM 的?为什么访问ROM 的指令那么少?CPU 访问ROM 多不多?什么时候需要访问ROM?3·1·10 试绘图示明MCS 一51 系列单片机数据传送类指令可满足的各种传送关系。
3·1·11 请选用指令,分别到达以下操作: (1)将累加器内容送工作存放器R6.(2)将累加器内容送片内RAM 的7BH 单元。
(3)将累加器内容送片外RAM 的7BH 单元。
(4)将累加器内容送片外RAM 的007BH 单元。
(5)将ROM007BH 单元内容送累加器。
3·1·12 区分以下指令的不同功能:(l)MOV A,#24H 与MOV A.24H(2)MOV A,R0 与MOV A,@R0(3)MOV A,@R0 与MOVX A,@R03·1·13 设片内RAM 30H 单元的内容为40H;片内RAM 40H 单元的内容为l0H;片内RAM l0H 单元的内容为00H;(Pl)=0CAH。
51单片机汇编语言教程汇编语言是一种低级程序设计语言,直接操作计算机硬件,能够充分发挥硬件的性能,是学习嵌入式系统开发的基础。
而51单片机是广泛应用于嵌入式系统中的一种微控制器,具有功能强大、易于掌握等特点。
本篇文章将为大家介绍51单片机汇编语言的基本概念、编程指令以及应用实例,帮助读者快速入门。
一、51单片机汇编语言概述1.1 51单片机简介51单片机是一种由英特尔公司设计的8位微控制器,其核心是一个CPU,具有RAM、ROM、I/O端口等外围设备。
它采用的是汇编语言编程,具有指令集简单、易于学习等特点,因此深受嵌入式系统开发者的喜爱。
1.2 汇编语言的基本概念汇编语言是一种低级语言,与高级语言相比,更接近计算机底层的硬件操作。
在汇编语言中,程序员通过编写指令来告诉计算机具体的操作,如数据存储、运算等。
二、51单片机汇编语言基础知识2.1 寄存器寄存器是51单片机中的一种重要的存储设备,用于存储数据、地址等信息。
51单片机共有32个寄存器,其中一部分用于存储通用数据,一部分用于存储特定功能的数据。
在汇编语言编程中,我们可以使用这些寄存器来存储数据和进行运算。
2.2 程序存储器程序存储器是51单片机中存储程序的地方,它可以分为ROM和RAM两种类型。
其中,ROM存储的是不可修改的程序代码,而RAM 存储的是可以读写的数据。
2.3 I/O端口I/O端口是51单片机与外部设备进行数据交互的接口,通过输入/输出指令,可以实现数据的输入与输出。
在汇编语言中,我们需要了解如何使用I/O端口来与外部设备进行通信。
三、51单片机汇编语言编程指令3.1 数据传输指令数据传输指令用于将数据从一个地方传输到另一个地方。
常用的数据传输指令有MOV、MOVC、MOVX等,通过这些指令可以实现数据的读取、存储和传输等操作。
3.2 算术运算指令算术运算指令用于对数据进行加、减、乘、除等运算操作。
51单片机中的算术运算指令包括ADD、SUB、MUL、DIV等,通过这些指令可以对数据进行各种运算操作。
51单片机编码单片机编码技术是现代电子信息技术中的重要组成部分。
作为微控制器的核心,单片机编码通过将输入的数据信息转换为特定的编码方式,实现各种功能和应用。
本文将从基本概念、编码原理和应用实例等方面,详细介绍51单片机编码相关内容。
1. 51单片机编码的基本概念51单片机编码是指使用8051系列单片机进行程序设计和编码的过程。
它采用汇编语言或高级语言编写程序代码,并将其转化为机器码,通过单片机的指令集执行相应的操作。
由于其成熟的硬件平台和丰富的软件资源,51单片机编码广泛应用于各种嵌入式系统、控制系统等领域。
2. 51单片机编码的原理51单片机编码的原理主要包括指令集、寄存器、数据存储器、输入输出端口等组成部分。
指令集是单片机内部存储的一组机器指令,通过不同的指令实现对数据的处理和控制。
寄存器用于存储临时数据和程序状态等信息,提供给CPU进行运算和控制。
数据存储器则用于存储程序代码和数据,包括内部RAM和外部ROM等。
输入输出端口是单片机与外部设备进行交互的接口,通过读取输入端口的状态和向输出端口写入数据,实现与外部环境的通信。
3. 51单片机编码的应用实例3.1 系统控制应用51单片机编码广泛应用于各种系统控制应用中,如智能家居、工业自动化、交通信号控制等。
通过编写相应的控制程序代码,将输入的传感器信号处理后,控制相关的执行机构进行动作。
例如,通过读取温度传感器的数据,控制空调的开关和温度调节,实现智能环境控制。
3.2 嵌入式系统应用嵌入式系统是指将计算能力嵌入到各种设备和系统中,实现特定功能的计算系统。
51单片机编码在嵌入式系统中有广泛的应用,如智能手机、电视、汽车电子等。
通过编写嵌入式软件程序,控制和管理功耗、资源调度、外设驱动等,实现嵌入式系统的各项功能。
3.3 通信系统应用51单片机编码在通信系统中也有着重要的应用。
例如,通过编写相应的通信协议和驱动程序,实现与外部设备的数据交换和通信。
sdcc编译51代码-回复问题。
以下是一篇关于SDCC编译51代码的文章:SDCC(Small Device C Compiler)是一个开源的C语言编译器,专为嵌入式系统设计而开发。
它被广泛用于编译51系列单片机的代码。
本文将以SDCC编译51代码为主题,详细介绍如何进行编译和调试。
首先,我们需要安装SDCC编译器。
SDCC支持多个操作系统,包括Windows、Linux和Mac OS。
在Windows系统上安装SDCC非常简单,我们只需访问官方网站(安装完成后,我们可以开始编写51单片机的C代码。
以LED闪烁为例,我们可以编写一个简单的程序来实现LED灯的闪烁功能。
c#include <reg51.h>void main() {P1 = 0xFE; 11111110,使LED灯亮while (1) {P1 = ~P1; 取反操作,使LED灯熄灭for (int i = 0; i < 20000; i++); 延时}}在编写完成代码后,我们将其保存为一个以`.c`为后缀的文件,比如`led_blink.c`。
接下来,我们需要通过SDCC编译器将C代码转换为可执行代码。
在命令行中输入以下命令:sdcc led_blink.cSDCC编译器将会读取`led_blink.c`文件,并自动进行编译过程。
编译完成后,会生成多个文件,其中一个是`.hex`格式的文件,该文件就是最终生成的可执行文件。
我们可以将该文件烧录到51单片机上运行。
要烧录可执行文件到51单片机上,我们需要使用一个烧录器。
常见的烧录器有STC-ISP和TL866等。
这里我们以STC-ISP烧录器为例进行说明。
首先,我们需要将STC-ISP烧录器与计算机连接,然后打开烧录器软件。
在软件上选择对应的单片机型号,在打开的文件对话框中选择之前编译生成的`.hex`文件,然后点击烧录按钮。
烧录完成后,我们可以将51单片机连接到电源,并观察LED灯的闪烁情况。
第一章单片机系统板说明一、概述单片机实验开发系统是一种多功能、高配置、高品质的MCS-51单片机教学与开发设备。
适用于大学本科单片机教学、课程设计和毕业设计以及电子设计比赛。
该系统采用模块化设计思想,减小了系统面积,同时增加了可靠性,使得单片机实验开发系统能满足从简单的数字电路实验到复杂的数字系统设计实验,并能一直延伸到综合电子设计等创新性实验项目。
该系统采用集成稳压电源供电,使电源系统的稳定性大大提高,同时又具备完备的保护措施。
为适应市场上多种单片机器件的应用,该系统采用“单片机板+外围扩展板”结构,通过更换不同外围扩展板,可实验不同的单片机功能,适应了各院校不同的教学需求。
二、单片机板简介本实验系统因为自带了MCS-51单片机系统,因此没有配置其他单片机板,但可以根据教学需要随时配置。
以单片机板为母板,并且有I/O接口引出,可以很方便的完成所有实验。
因此构成单片机实验系统。
1、主要技术参数(1)MSC-51单片机板板上配有ATMEL公司的STC89C51芯片。
STC89C51资源:32个I/O口;封装DIP40。
STC89C51开发软件:KEIL C51。
2、MSC-51单片机结构(1)单片机板中央放置一块可插拔的DIP封装的STC89C51芯片。
(2)单片机板左上侧有一个串口,用于下载程序。
(3)单片机板的四周是所有I/O引脚的插孔,旁边标有I/0引脚的脚引。
(4)单片机板与各个模块配合使用时,可形成—个完整的实验系统。
三、母板简介主要技术参数(1)实验系统电源实验系统内置了集成稳压电源,使整个电源具有短路保护、过流保护功能,提高了实验的稳定性。
主板的右上角为电源总开关,当把220V交流电源线插入主板后,打开电源开关,主板得电工作。
为适用多种需要,配置了+5V,+12V,—5V电压供主板和外设需要,通过右上角的插针排和插孔输出到外设。
此外,还设有螺旋保险插孔保护实验箱。
(2)RS232接口RS232接口通过MAX232芯片实现与计算机的串行通讯,通过接口引出信号。
下面是一个51单片机计数器的简单程序,使用C语言编写。
c
#include <reg51.h>
// 定义计数器的值
volatile unsigned int counter = 0;
// 定义外部中断0的服务函数
void INT0_Handler() interrupt 0 {
// 清除外部中断0标志位
EX0 = 0;
// 计数器值加1
counter++;
}
void main() {
// 设置外部中断0触发方式为下降沿触发
IT0 = 1;
// 使能外部中断0
EX0 = 1;
// 全局中断使能
EA = 1;
while(1) {
// 在此处添加处理计数器值的代码,例如:
// if (counter >= 100) {
// // 计数器值达到100,执行某些操作
// counter = 0; // 计数器清零
// }
}
}
此代码实现了51单片机的外部中断0的计数器功能。
当INT0引脚检测到下降沿时,会触发外部中断0,并执行INT0_Handler()函数,使counter值加1。
在main()函数中,可以添加处理counter值的代码。
例如,当counter值达到某个阈值时,可以执行特定的操作。
注意,这只是一个基础的示例,具体的代码可能会因具体硬件和应用需求而略有不同。
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 开发51单片机操作系统应注意的问题
(1)操作系统软件的代码不能太长
因为51系列单片机的系统硬件资源相对匮乏,如果操作系统的代码比应用程序的代码还大,甚至使得用户的应用程序要考虑给操作系统让出资源,这样的操作系统即使功能再完善,也不实用。
现在流行的嵌入式操作系统就不能应用于51系列单片机,原因是代码太大。
开发一个5000行的基于裸机的应用程序也就是占用7~8KB ROM空间,一个操作系统用掉了几十KB,占空间不算,实时性的优势恐怕也没了(执行这么多的指令要时间)。
所以,μCOS 的作者也不支持将他的代码移植到51系列单片机上,这也就不奇怪了。
(2)操作系统不能占用太多的片内RAM空间
51系列单片机只有128个或者256个字节的片内RAM空间,稍微不注意就用完了。
如果操作系统把片内的RAM使用得所剩无几,那用户的应用程序用什么? 如果说用户的程序可以把变量定义在片外RAM中的话,那么系统的硬件堆栈放在哪? 众所周知,51系列单片机的硬件堆栈不能放在片外,所以要在51系列单片机上开发操作系统的话就要少用它的片内RAM。
但是不用片内RAM是办不到的,因为操作系统也要传递参数,也要使用堆栈。
C51单片机的C函数传递参数是通过寄存器和存储器的,不能通过堆栈。
但是可以通过一些措施使得操作系统代码少用片内RAM。
(3)解决好函数的重入问题
开发实时占先式的操作系统,可重入函数是非用不可的。
可重入函数可以被一个以上的任务调用,而不必担心数据被破坏。
可重入函数任何时候都可以被中断,一段时间后又可以运行,而应用数据不会丢失。
使得函数具有可重入性必须使得函数能够满足下列三个条件之一:
①不使用共享资源;
②在使用共享资源时关中断,使用完毕后再开中断;
③在使用共享资源时申请信号量,使用完后释放信号量。
这些条件在标准C中编程很容易实现,但是在Keil C51中就比较麻烦。
因为标准C是把局部变量分配到用户堆栈中(动态分配),而Keil C51将局部变量分配到寄存器或内存固定地址(静态分配),并通过变量覆盖分析的方法,使多个函数的局部变量使用相同的内存地址以减少内存占用。
在Keil C51中,如果局部变量分配在寄存器中还好些,如果局部变量分配在内存中就比较麻烦。
(4)堆栈的分配问题
占先式操作系统的主要任务就是进行任务的调度,通过对任务的实时调度来完成系统的功能。
任务调度过程中,不可避免的发生任务对系统资源的抢占问题,因为系统中CPU只有一个,而每个任务都认为自己是CPU的绝对占用者,每一个任务都是一个死循环。
任务
间进行切换的依据就是各自的优先级,一个高优先级的任务可以通过任务调度函数或者中断退出函数等来中止正在运行的任务。
被中断的任务只有自己的优先级在当前就绪任务表中最高时,才能从被中断处继续运行。
这就需要为每个任务分配任务堆栈,来保存任务的环境变量。
由于每个任务在不同时刻被中断时需要保存的环境变量数目不同,所以任务堆栈空间的分配问题也是一门学问。
3 一些解决问题的技巧
(1)片内RAM占用问题的解决
任务堆栈最好不要放在片内,如果把任务堆栈放在片内的话,用户应用程序可使用的资源就非常有限,应用程序的功能也会受到限制。
这就是为什么某些把任务堆栈放在片内的基于51系列单片机的实时操作系统只能用来做些演示实验,但并不实用。
一个有实用价值的基于51系列单片机的实时操作系统必须在512字节以上的RAM环境中运行。
随着集成技术的发展,现在已经出现了很多带有辅助RAM的51系列单片机,这类单片机把片外的RAM 集成到芯片内,使用MOVX指令来访问这些RAM。
如果用户不想通过三总线来扩展片外RAM的话,可以选用这种带有辅助RAM的单片机。
此外,因为操作系统要用到一些全局变量,鉴于处理的速度问题又不想把它们全部的放在片外,那就可以根据这些全局变量应用的频繁程度来决定把哪些移到片外,哪些留在片内。
别小看这几个字节的节约,在51系列单片机上效果会很明显。
笔者认为在这种资源相对匮乏的单片机上,开发操作系统的最高境界应该是开发一个绿色的操作系统,用户在应用操作系统时可以用的系统资源应该和基于裸机编程差不多。
(2)重入问题的解决
应该尽量使有重入性要求的函数的参数传递通过寄存器来完成,这样可以用一般的方法来编写函数,使得函数具有重入性。
如果实在是寄存器不够用的话,可以动用硬件堆栈来保存这些局部变量。
(3)堆栈分配问题的解决
鉴于各个任务对于任务堆栈大小的要求不同,即使同一个任务在不同的时刻被中断,它对堆栈大小的要求也不相同的情况,可以将任务堆栈多分配出一个字节,用来统计任务堆栈中有效数据的个数。
单片机的片内RAM中,堆栈的栈底也做一个标志,当任务切换时,把当前任务放在堆栈中的环境变量从栈底到栈顶全部拷贝到任务的堆栈中,然后把将要运行任务的任务堆栈中的所有数据恢复到栈底标志开始的地方。
任务堆栈和硬件堆栈之间的数据拷贝如图1所示。
其中,Stack(i)和Stack(j)都是指针数组Stack[max_tasks]中的元素,NUM=SP-StkStart,图1中所要进行的操作步骤是:①将系统硬件堆栈中的内容放到当前任务的堆栈中;②把将
要运行的任务的堆栈内容移到系统的硬件堆栈中,并将硬件堆栈中的内容弹出到各个寄存器。
这个过程就完成了任务的切换。