51单片机实时操作系统的构建
- 格式:pdf
- 大小:330.03 KB
- 文档页数:4
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语言可以打开和关闭中断。
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单片机教程单片机作为嵌入式系统的关键元素之一,具有广泛的应用前景。
本教程将为大家介绍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系列单片机是美国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语言可以打开和关闭中断。
基于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的软件设计近年来,利用嵌入式实时操作系统来开发嵌入式系统的软件已是大势所趋。
这是因为传统的这类设计中,大多采用了中断结合单任务的顺序机制进行,这种设计方法虽然比较直观,但是也带来了诸如稳定性差、不便于调试等问题。
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分配给当前任务。
嵌入式实时操作系统,可以充分的利用单片机的资源,提高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中断一次。
一、概述在现代电子科技领域,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显示系统具有更大的探索空间。