uCOS-II在51单片机上的移植
- 格式:doc
- 大小:39.50 KB
- 文档页数:3
uCOS-II 在C51 单片机上的移植(1)实时系统和前/后台系统;前/后台系统:一个大循环,循环查询各种标志位。
如果标志位置位,就执行相应的服务程序。
标志位就是标志事件的发生,事件响应延时处于不可预测状态。
最坏的情况是循环中所有其他的事件服务程序执行完,才响应当前事件。
中断服务虽然能即时/优先响应,但是它们和主循环的通讯,也是通过置主循环中相应的标志位来完成的。
实时系统(uCOS):整个程序分成一个个看起来好象是并行的任务,每个任务都在等待事件的发生。
因为uCOS不支持时间片轮转,除了最低优先级任务(在uCOS中是IDLE任务)是死循环以外,其他的任务都不能死循环,只能在驱动事件驱动下工作。
任何驱动事件的产生,都使优先级最高的就绪任务运行。
任务和任务/任务和中断的通讯,是通过相应事件驱动来完成的。
驱动事件:不论是什么系统,CPU不可能一直在工作。
CPU的工作是在各种驱动事件的驱动下工作的。
CPU在完成一次驱动事件事件服务程序以后,进入IDLE模式等待新的驱动事件的发生。
包括实时系统和前/后台系统都是在驱动事件的驱动下运行的。
按照uCOS中的观点,驱动事件分为三类:1、事件(Event)。
包括信号量(Semaphores)、事件标志组(Flag)、邮箱(Message Box)、邮箱队列(Message Queue)。
2、时间(Time Tick)。
包括时间延时和事件超时。
3、中断(Interrupt)。
可以发出各种event。
由于第1种事件,通常都是在第2、3种状态下发出的,所以其实事件的驱动只有两种:时间(定时)和中断(各种异步中断)。
时间实际上也是中断的一种,可以说程序的驱动事件只有一种,就是:中断。
前/后台系统中还有一种驱动事件的产生,在主循环中不断的查询。
有别与一般的定时查询,这种查询是为了将事件的响应时间降到最低,也可以将其归纳于定时(时间)事件。
(2)uCOS C51移植的准备工作;2004年8月份,我在书城买了一本《uCOS-Ⅱ第2版》,准备学习RTOS。
UCOSII在51单片机运行成功以下是我的移植过程:1、新建一个文件夹aduc845ucosii来存放整个工程,再在aduc845ucosii下建立两个目录:os和out。
os存放所有源代码,out存放编译链接产生的中间文件和最终的输出文件。
2、建立KEILC工程,芯片选择ADUC845并且加入默认的启动代码START_AD.A513、把所有用到的源文件都复制到OS文件夹内,也就是现在在OS 内所有文件。
4、在KEIL的WORKSPACE下Source Group 1右击,把OS文件夹内以下文件加入源码:uCOS_II.C、OS_CPU_C.C、OS_CPU_A.ASM、test.c、serial.c、serial.h。
然后还得把KEIL安装目录下的XX\KEIL\C51\LIB下的C51BFPC.LIB和C51L.LIB加入源码组。
这里要解释一下:uCOS_II.C是内核文件,OS_CPU_C.C、OS_CPU_A.ASM是移植文件,test.c是main函数文件,serial.c、serial.h是test.c里用到串口才把它们加进源码,而C51BFPC.LIB和C51L.LIB这两个文件据果子说是因为用到了浮点运算,要加入这两个库文件。
加入的文件最好是按顺序加入,特别是两个库文件,如果反了,就可能出现运行不了或者不正确。
5、打开Options for Target "Target 1",切换到Target选项卡,把Memory Model改为Large: variables in XDATA。
再切换到Output选项卡,点击"Select Folder for Objects",选择out文件夹,勾选Create hex File,按OK确定,再切换到Listing选项卡,点击"Select Folder for Listings",选择out文件夹,按OK确定。
μC/OS II在MCS51单片机上的移植2008-05-29 12:07摘要:嵌入式系统融合了微电子、计算机软/硬件、通信和电子工程等多种技术、广泛应用于各种工业和民用领域,是科技集成创新的主要手段。
嵌入式操作系统也由于编程方式比传统方式有着明显的优越性,在越来越多的场合得到广泛的应用。
在中国,单片机具有相当广泛的使用基础,虽然51系列单片机功能相对较低,但是针对某些任务较简单、要求具备较高实时性的场合,研究嵌入式系统的移植还是具有重要的现实意义。
本文从探讨嵌入式系统移植的意义开始,通过阐述嵌入式系统在过去几十年期间的发展过程以及当今的发展现状,总结出嵌入式系统的发展趋势,并简要的描述μC/OS II在MCS51单片机上的移植方法,综合讲述了嵌入式系统移植这一课题的技术和背景。
关键词:μC/OS II 移植意义现状发展1 引言:单片机是电子信息行业最杰出的作品之一,由于它具有出色的面向控制能力,因此在工业控制、智能仪器仪表、家用电器、外设控制、机器人和军事装置等方面都得到了广泛的应用。
但是当面对多任务的应用场合时,如果没有精心复杂的设计以及丰富的后期维护调试经验,采用传统的编程方式设计往往会发生不可预料的错误且难以弥补。
此外,在这种条件下应用程序对硬件具有很强的依赖性,硬件只要稍微发生变化,软件就必须要作大量的变更和调试工作。
这也是限制单片机应用进一步发展的重要原因。
在电子技术迅猛发展的当今,随着实用电子系统的复杂化和系统实时性需求的提高,以及应用软件的系统化发展,嵌入式实时操作系统(Embedded Real-time Operating System)已经广泛地使用在各式各样的以单片机为代表的硬件平台上,从而很大程度的解决了多任务使用环境的需求问题。
在实际的生产生活中,使用着大量以MCS51为代表的8位单片机,虽然性能及存储空间有限,但是从经济方面考虑,对于某些应用场合,在8位MCU上使用操作系统依然是可行的。
μC/OS-II在AT89C51上的移植来源:电子工程师笔记 易金生 徐爱钧 冯金栋 时间:2006-03-03 引 言:μC/OS-II作为一个嵌入式实时操作系统,自1992年以来,因其源代码的完全公开和优越性能,已为众多的爱好者和开发人员所了解并得到了广泛应用。
μC/OS-II是一个占先式内核,执行时间可确定(即函数的调用与服务的时间是可知的,不依赖于应用程序的大小),目前最多支持64个任务(8个为系统保留),总是执行处于就绪态的优先级最高的任务。
目前,51系列及其扩展型单片机仍在单片机应用系统占较大比重,因而详细介绍μC/OS-II在AT89C51上的移植实现过程,解决移植过程中出现的问题,有很大的实用意义。
1 KEIL C51编译器中函数再入栈的处理(1)再入函数与再入栈再入函数可以被递归调用,可同时被两个或多个进程调用。
再入函数经常在实时应用或在中断和非中断必须共用一个函数的情况下被使用。
编译时,在存储器模式的基础上为再入函数在内部或外部存储器中建立一个模拟堆栈区,称为再入栈,又可叫仿真堆栈,其增长方向是从上到下。
(2)具体实现过程μC/OS-II是一个占先式内核,使用了较多的再入函数,用户只有通过C编译器来产生可再入代码。
不同的编译器,对再入函数的仿真堆栈的处理不一样,如TC可以自动处理;而在单片机系统中应用较广的KEIL C51编译器中,要在startup.a51中进行设置。
KEIL C51中,再入函数的返回地址保存在8051的硬件堆栈中,形参和局部变量必须保存在仿真堆栈中。
在SMALL模式下,仿真栈与硬件堆栈分享共同的存储区,堆栈增长方向相反。
而典型的51单片机真正的RAM只有128个字节,还有部分要用于位寻址区和工作寄存器,可用作仿真栈的空间有限。
在这种方式下移植后,在中断嵌套或任务调用时系统会崩溃。
因而,可以使用LARGE模式编译,这样,仿真栈就位于XDATA区,有充分的存储空间。
ucos-II移植到51单片机的解决办法本文主要是关于ucos-II的相关介绍,并着重对ucos-II移植到51单片机进行了详尽的阐述。
ucos-IIμC/OS-II由Micrium公司提供,是一个可移植、可固化的、可裁剪的、占先式多任务实时内核,它适用于多种微处理器,微控制器和数字处理芯片(已经移植到超过100种以上的微处理器应用中)。
同时,该系统源代码开放、整洁、一致,注释详尽,适合系统开发。
μC/OS-II已经通过联邦航空局(FAA)商用航行器认证,符合航空无线电技术委员会(RTCA)DO-178B标准。
μC/OS-II被广泛应用于微处理器、微控制器和数字信号处理器。
μC/OS-II 的前身是μC/OS,最早出自于1992 年美国嵌入式系统专家Jean brosse 在《嵌入式系统编程》杂志的5 月和6 月刊上刊登的文章连载,并把μC/OS 的源码发布在该杂志的B B S 上。
μC/OS 和μC/OS-II 是专门为计算机的嵌入式应用设计的,绝大部分代码是用C语言编写的。
CPU 硬件相关部分是用汇编语言编写的、总量约200行的汇编语言部分被压缩到最低限度,为的是便于移植到任何一种其它的CPU 上。
用户只要有标准的ANSI 的C交叉编译器,有汇编器、连接器等软件工具,就可以将μC/OS-II嵌入到开发的产品中。
μC/OS-II 具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点,最小内核可编译至2KB 。
μC/OS-II 已经移植到了几乎所有知名的CPU 上。
严格地说uC/OS-II只是一个实时操作系统内核,它仅仅包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等基本功能。
没有提供输入输出管理,文件系统,网络等额外的服务。
但由于uC/OS-II良好的可扩展性和源码开放,这些非必须的功能完全可以由用户自己根据需要分别实现。
uC/OS-II目标是实现一个基于优先级调度的抢占式的实时内核,并在这个内核之上提供最基本的系统服务,如信号量,邮箱,消息队列,内存管理,中断管理等。
UCOS-II在51单片机上的移植做操作系统的移植首先明白什么是移植,操作系统是一种鱼硬件(处理器)相关的软件,根据某一种处理器来设计的操作系统通常不能运行在那其他处理器。
所谓的移植是指修改操作系统,然后加载到一个处理器上。
本文只讲解步骤,至于理论知识,需要大家自己学习。
步骤:1,在UCOS-II的官网上下载,操作系统。
2,在网上找到或者自己建三四个文件:OS_CPU_A.ASSMOS_CPU.HOS_CPU_C.COS_CFG.H以上文件需要修改3,移植源码的编写和修改❖OS_CPU.H1)定义与编译器有关的数据类型typedef unsigned char BOOLEAN; /* 不能使用bit定义,结构中无法使用*/typedef unsigned char INT8U; /* 无符号8位数*/typedef unsigned char INT8S; /* 有符号8位数*/typedef unsigned int INT16U; /* 无符号16位数*/typedef signed int INT16S; /* 有符号16位数*/typedef unsigned long INT32U; /* 无符号32位数*/typedef signed long INT32S; /* 有符号32位数*/typedef float FP32; /* 单精度浮点数*/typedef double FP64; /* 双精度浮点数*/typedef unsigned char OS_STK; /* 定义堆栈入口宽度为8位*/typedef unsigned char OS_CPU_SR; /* 定义CPU状态字的宽度为8位*/2)定义堆栈增长方向#define OS_STK_GROWTH 0 /* MCS-51堆栈从下往上增长,1=向下,0=向上*/3)定义任务级的任务切换宏#define OS_TASK_SW() OSCtxSw() /* 任务级的任务切换宏*/4)定义临界段宏:#define OS_ENTER_CRITICAL() EA=0#define OS_EXIT_CRITICAL() EA=1❖OS_CPU_C.C①初始化任务栈void *OSTaskStkInit(void(*task)(void *pd), void *ppdata, void *ptos, INT16U opt) REENTRANT{O S_STK *stk;p pdata=ppdata; //pata data 为52文件关键字o pt =opt; /* opt没被用到,保留此语句防止警告产生 */s tk =(OS_STK *)ptos; /* 任务堆栈最低有效地址*/*stk++=15; /* 任务堆栈长度*/ *stk++=(INT16U)task & 0xFF; /* 任务代码地址低8位*/*stk++=(INT16U)task >> 8; /* 任务代码地址高8位*//* 处理器是按特定的顺序将寄存器存入堆栈的,所以用户在将寄存器存入堆栈的时候也要依照这一顺序 */*stk++=0x00; /* PSW*/*stk++=0x0A; /* ACC*/*stk++=0x0B; /* B */ *stk++=0x00; /* DPL*/*stk++=0x00; /* DPH*/*stk++=0x00; /* R0 */ *stk++=0x01; /* R1 */ *stk++=0x02; /* R2 */ *stk++=0x03; /* R3 */ *stk++=0x04; /* R4 */ *stk++=0x05; /* R5 */ *stk++=0x06; /* R6 */ *stk++=0x07; /* R7 */ /* 不用保存SP,任务切换时根据用户堆栈长度计算得出*/*stk++=(INT16U)(ptos+MAX_STK_SIZE) >> 8; /* ?C_XBP 仿真堆栈指针高8位 */*stk++=(INT16U)(ptos+MAX_STK_SIZE) & 0xFF; /* ?C_XBP 仿真堆栈低8位*/r eturn ((void *)ptos); /* 返回最低地址,这里不用弹出栈顶指针是为了提高计算效率 */}②初始化定时器void InitTimer0(void) REENTRANT{TMOD=TMOD&0xF0; //屏蔽高四位TMOD=TMOD|0x01; /* 模式1(16位定时器),仅受TR0控制 */ TH0=TIMER_20MS_TH0;TL0=TIMER_20MS_TL0;E A=0; /* EA和ET0,51上电缺省值为0,EA将在OSStartHighRdy()中打开*/ET0=0; /* 满足在OSStart()前不产生时钟中断的要求,系统启动后第一时间开定时器T0中断 */TR0=1;}❖OS_CPU_A.ASM编写4个函数OSStartHighRdy()OSCtxSw()OSIntCtxSw()OSTickISR()❖OS_CFG.H主要为参数和使能的宏定义#define MAX_STK_SIZE 1024 /* 最大堆栈大小为1k*/#define OS_MAX_EVENTS 5 /* 应用程序中事件控制块的最大数量(必须大于零)*/#define OS_MAX_FLAGS 2 /* 应用程序中事件标志组的最大数目(必须大于零)*/#define OS_MAX_MEM_PART 5 /* 内存分区的最大数目(必须大于零)*/#define OS_MAX_QS 2 /* 应用程序中队列控制块的最大数目(必须大于零)*/#define OS_MAX_TASKS 11 /* 应用程序中任务的最大数目(必须大于2)*/#define TASK_START_PRIO 2 /* 应用程序开始优先级*/#define OS_LOWEST_PRIO 12 /* 定义可分配的最低优先级(必须大于63)*/#define TASK_STK_SIZE 512 /* 默认任务堆栈大小*/#define OS_TICKS_PER_SEC 50 /* 设置每秒节拍数*/#define TIMER_20MS_TH0 0x70 /* CPU=22.1184MHz, OS_TICKS_PER_SEC=50, TH0=0x70 */#define TIMER_20MS_TL0 0x00 /* CPU=22.1184MHz, OS_TICKS_PER_SEC=50, TL0=0x00 */晶振频率为22.1184MHz时才有OS_TICKS_PER_SEC=50,OS_TICKS_PER_SEC=50。
uC\OS-II在51单片机上的移植戴国强、史培杰(安阳工学院计算机科学与信息工程系)摘要:uC\OS-II以其结果清晰、性能稳定、源码公开等特点,受到广大嵌入式开发人员的青睐,已作为嵌入式实时操作系统被移植到许多微处理器上,在国防、航空航天、交通、能源、工业控制、通信以及人们日常生活等各个领域得到了广泛应用。
关键字:嵌入式实时操作系统、uC\OS-II、移植、MCS-51单片机Abstract: Based on the advantage of clear structure,stable capability and free sound code,the uC\OS-II comes in for lots of people's like who empolder the embedded system.As a embedded real-time operation system,the uC\OS-II has been repoted on lots of MCU,and has widely used an plays a very important role in many fields, such as national defence,spacenavigation,traffic,energy sources,industry control,communications,and civil living.Key words: the embedded real-time operationsystem,uC\OS-II,transplant,Single Chip Computer of MCS-51随着电子技术与软件技术的飞速发展,嵌入式系统技术已经成了最热门的技术之一。
嵌入式实时操作系统是嵌入式应用软件的基础和开发平台,其中涉及到软件和硬件两方面的问题。
原理:
由于51单片机RAM比较小,所以各个任务堆栈的内容放在片外RAM,而只在片内设了一个公有堆栈,一旦一个任务被选中,则在任务切换时把该任务在片外的RAM存储的堆栈内容复制到片内公用堆栈,而公用堆栈中的被终止运行任务的堆栈内容复制到该任务片外堆栈中。
程序实现:
在51单片机的外部RAM中设置任务堆栈,任务堆栈的最低地址空间用来存放用户堆栈的长度,并使该任务的TCB中的OSTCBStkPtr指针变量指向该地址。
任务切换时,应该先把当前任务在公用堆栈(即片内RAM中的)的内容复制保存在本身任务堆栈(片外)中。
即用SP-OSStkStart得出保存字节数,将其写入用户堆栈最低地址内,以用户堆栈最低地址为起址,以OSStkStart为系统堆栈起址,由系统栈向用户栈拷贝数据,循环SP-OSStkStart次,每次拷贝前先将各自栈指针增1。
将就绪优先级最高任务的任务堆栈复制到系统堆栈。
方法是:获得最高优先级任务用户堆栈最低地址,从中取出“长度”,以最高优先级任务用户堆栈最低地址为起址,以OSStkStart为系统堆栈起址,由用户栈向系统栈拷贝数据,循环“长度”数值指示的次数,每次拷贝前先将各自栈指针增1。
程序注释见OS_CPU_A.asm内的中文注释,可用记事本打开该文件。
在51系列单片机上移植uCOS-II引言:随着各种应用电子系统的复杂化和系统实时性需求的提高,并伴随应用软件朝着系统化方向发展的加速,在16位/32位单片机中广泛使用了嵌入式实时操作系统。
然而实际使用中却存在着大量8位单片机,从经济性考虑,对某些应用场合,在8位MCU上使用操作系统是可行的。
从学习操作系统角度,uC/OS-II for 51即简单又全面,学习成本低廉,值得推广。
结语:μC/OS-II具有免费、简单、可靠性高、实时性好等优点,但也有缺乏便利开发环境等缺点,尤其不像商用嵌入式系统那样得到广泛使用和持续的研究更新。
但开放性又使得开发人员可以自行裁减和添加所需的功能,在许多应用领域发挥着独特的作用。
当然,是否在单片机系统中嵌入μC/OS-II应视所开发的项目而定,对于一些简单的、低成本的项目来说,就没必要使用嵌入式操作系统了。
uC/OS-II原理:uCOSII包括任务调度、时间管理、内存管理、资源管理(信号量、邮箱、消息队列)四大部分,没有文件系统、网络接口、输入输出界面。
它的移植只与4个文件相关:汇编文件(OS_CPU_A.ASM)、处理器相关C文件(OS_CPU.H、OS_CPU_C.C)和配置文件(OS_CFG.H)。
有64个优先级,系统占用8个,用户可创建56个任务,不支持时间片轮转。
它的基本思路就是“近似地每时每刻总是让优先级最高的就绪任务处于运行状态” 。
为了保证这一点,它在调用系统API函数、中断结束、定时中断结束时总是执行调度算法。
原作者通过事先计算好数据,简化了运算量,通过精心设计就绪表结构,使得延时可预知。
任务的切换是通过模拟一次中断实现的。
uCOSII工作核心原理是:近似地让最高优先级的就绪任务处于运行状态。
操作系统将在下面情况中进行任务调度:调用API函数(用户主动调用),中断(系统占用的时间片中断OsTimeTick(),用户使用的中断)。
调度算法书上讲得很清楚,我主要讲一下整体思路。
μC/OS-II在基于51微控制器上的移植研究第一章绪论 (1)1.1 背景和选题依据 (1)1.2 国内外的研究现状及发展趋势 (1)1.3 本文的研究内容 (2)第二章μC/OS-II简介 (3)2.1 μC/OS-II的产生背景 (3)2.2 μC/OS-II的特点 (3)2.3 μC/OS-II内核结构 (4)2.3.1 宏OS_ENTER_CRITICAL( )和OS_EXIT_CRITICAL( ) (5)2.3.2 任务 (6)2.3.3 调度器上锁、开锁 (10)2.3.4 μC/OS-II中的中断与时钟节拍 (11)2.3.5 μC/OS-II初始化与启动 (12)第三章Keil Cx51基础知识 (14)3.1 Cx51程序设计基础 (14)3.1.1 标识符与关键字 (14)3.1.2 基本语法及语句 (14)3.2 函数 (16)3.2.1 函数定义与调用 (16)3.2.2 函数的递归调用与再入函数 (18)第四章μC/OS-II移植基础知识 (20)4.1 μC/OS-II源文件移植 (20)4.2 硬件平台构成与编译器的选择 (22)4.3 μC/OS-II移植的一般性问题 (23)第五章μC/OS-II在51单片机上的移植 (25)5.1 头文件处理 (25)5.2 修改OS_CPU.H文件 (25)5.3 修改OS_CPU_C.C文件 (25)5.3OS_CPU_A.ASM文件 (28)5.3.1 汇编文件头部定义 (28)5.3.2修改OSStartHighRdy( )函数 (29)5.3.3修改OSCtxSW( )函数 (30)5.3.4 OSIntCtxSW( )函数 (31)5.3.5OSTickISR( )函数 (31)5.4 定时器初始值设置 (32)第六章实验及其结果分析................................................................................... 错误!未定义书签。
μC/OS-Ⅱ在51单片机上的移植姓名:学号:目录1 绪论 (2)1.1 嵌入式实时操作系统 (2)1.2 μC/OS-Ⅱ嵌入式操作系统 (2)1.3 μC/OS-Ⅱ原理 (2)2 μC/OS-Ⅱ内核结构 (3)2.1 临界区 (3)2.2 任务及任务控制块 (3)2.3 任务状态 (4)2.4 任务调度 (5)2.5 中断处理 (5)2.6 时钟节拍 (5)2.7 μC/OS-Ⅱ初始化与启动 (6)3 μC/OS-Ⅱ在51单片机上的移植 (6)3.1 OS_CPU.H文件的移植 (6)3.2 OS_CPU_A.ASM文件的移植 (8)3.3 OS_CPU_C.C文件的移植 (20)4 移植结果测试 (23)4.1 设计原理 (23)4.2 应用程序设计 (23)4.3 结果分析 (25)1 绪论1.1嵌入式实时操作系统大多数的操作系统只注重平均性能,如对于整个系统来说,所有任务的平均响应时间是关键,而不关心单个任务的响应时间。
而嵌入式实时操作系统最主要的特征是性能上的实时性,从这个角度上看,可以把嵌入式实时操作系统定义为“当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统作出快速响应,并控制所有实时任务协调一致运行的嵌入式操作系统”。
目前大多数嵌入式操作系统提供以下管理功能:1.任务管理所有嵌入式操作系统都是多任务的,目前所说的多任务大都是指多线程方式或多进程方式,两者的运行机制不完全一样。
以多进程为例,调度程序的好坏直接影响到系统的性能。
和一般的操作系统一样,嵌入式操作系统的作用也是决定在特定的某一时刻系统应该运行哪一个进程,对嵌入式系统中的运行软件进行描述和管理,并完成处理机资源的分配与调度。
2.存储管理在嵌入式系统中,一般不采用虚拟内存管理,而采用动态内存管理方式,即当程序的某一部分需要使用内存时,利用操作系统提供的分配函数来处理,一旦使用完,可通过释放函数来释放所占用的内存,这样内存就可以重复使用,这样提高了内存的利用率,方便了用户的使用,并提供了足够的存储空间。
μC/OS-II在51单片机上的移植摘要:针对在51 单片机上移植实时操作系统μC/OS-II 的目的,以μC/OS-II 工作原理为基础,结合51 单片机堆栈空间少的情况,采用改变堆栈指针到不同任务寄存器组的方法,通过改变堆栈指针的实验,得出在堆栈空间较少的情况下,也能够实现μC/OS-II 在51 单片机上的运行的结论。
关键词:μC/OS;单片机;实时操作系统;堆栈μC/OS-II 是一种公开源代码、结构小巧、具有可剥夺实时内核的嵌入式开发系统,代码简短、条理清晰、实时性及安全性能很高,绝大部分代码用C 编写,现已被移植到多种处理器的构架中。
随着51 单片机片内资源的日益丰富,在51 单片机上移植μC/OS-II 已成为可能,植入系统后,由系统来管理软件与硬件资源,简化应用程序的设计,并且使应用系统功能更加完善。
因此在51 单片机上移植μC/OS-II 具有十分重要的意义。
1 μC/OS 实时操作系统概述μC/OS-II 实时操作系统是一种可移植、可固化、可裁剪即可剥夺型的多任务实时内核,适用于各种微处理器和微控制器。
μC/OS-II 主要包括任务调度、时间管理、内存管理、事件管理(信号量、邮箱、消息队列)4 大部分。
它的移植与4 个文件相关:汇编文件(OS_CPU_A.A SM)、处理器相关C 文件(OS_CPU.H、OS_CPU_C.C)和配置文件(OS_CFG.H)。
有64 个优先级,系统占用8 个,用户可创建56 任务,不支持时间片轮转。
它的基本思路就是近似地每时每刻总是让优先级最高的就绪任务处于运行状态。
为了保证这一点,它在调用系统函数、中断结束、定时中断结束时总是执行调度算法。
原作者通过事先计算好数据,简化了运算量,通过精心设计就绪表结构,使得延时可预知。
嵌入式实时操作系统实验报告 51单片机上移植μC/ OS-II系别计算机与电子系专业班级电子0901班学生姓名高傲指导教师黄向宇提交日期 2012 年 4 月 17 日一、实验目的理解移植μC/OS-II的一般原理及基本方法。
掌握在51单片机上移植μC/ OS-II的方法及步骤,掌握在51单片机上基于μC/ OS-II系统构建应用程序的基本原理及方法。
二、实验内容1.建立并熟悉编译及仿真调试环境(keil + proteus)。
2.下载已移植好的软件包,在开发环境下建立工程编译并运行观察运行结果,使用Keil自带的仿真调试工具观察程序运行情况(内存的分配、变量及CPU 寄存器的动态变化、任务的切换运行状态等);比较移植前和移植后的相关文件,分析移植过程中做了哪些改动工作。
3.结合前两次实验内容,在移植软件包的基础上尝试增加用户任务,并利用信号量、消息邮箱等建立任务之间的通信联系;同时尝试采用动态内存分配的方法为任务分配内存,使用Keil仿真工具观察程序运行情况并记录运行结果。
4.输入课本P220的例子程序,编译运行并观察运行结果。
5. 将以上调试好的软件移植到proteus开发环境中去,利用proteus的硬件仿真环境创建几个实际任务(如键盘、显示器、LED点阵、数码管、时钟或温度传感器等)给每个赋以适当的优先级,配置合适的堆栈容量,编译运行并观察运行情况,显示信息可以用液晶显示器或虚拟终端来显示。
三.实验原理1. 移植的概念所谓移植,就是使一个实时内核能在某个微处理器或微控制器上运行。
为了方便移植,大部分的µC/OS-Ⅱ代码是用C语言写的;但仍需要用C和汇编语言写一些与处理器相关的代码,这是因为µC/OS-Ⅱ在读写处理器寄存器时只能通过汇编语言来实现。
由于µC/OS-Ⅱ在设计时就已经充分考虑了可移植性,所以µC/OS-Ⅱ的移植相对来说是比较容易的。
要使µC/OS-Ⅱ正常运行,处理器必须满足以下要求:1. 处理器的C编译器能产生可重入代码。
2004年第6期总第273期 导弹与航天运载技术M ISSIL ES AND SPACE V EHICL ES No.62004Sum No.273文章编号:100427182(2004)0620036207收稿日期:2003207209作者简介:董余红(19792),男,硕士研究生,研究方向为导弹与运载火箭信息系统总体设计μC/OS -Ⅱ在51系列单片机上的移植董余红,阎俊武(北京宇航系统工程设计部,北京,100076)摘要:介绍了嵌入式实时操作系统内核μC/OS -Ⅱ在51系列单片机上的移植的详细步骤。
关键词:单片机;嵌入式实时操作系统;内核;μC/OS -Ⅱ;移植中图分类号:TP316.2 文献标识码:APorting μC/OS -Ⅱto 512Family MicroprocessorDong Yuhong ,Yan J unwu(Beijing Institute of Astronautical Systems Engineering ,Beijing ,100076)Abstract :The steps to porting the embedded real time operating system kernel μC/OS -Ⅱto 512family microprocessor are described detailedly and relevant source code are provided in this paper.K ey Words :microprocessor ;Embedded real time operating system ;K ernel ;μC/OS -Ⅱ;Port1 简 介μC/OS -Ⅱ由美国工程师Jean brosse 设计,是一个优秀的源代码公开的嵌入式实时操作系统内核,可以比较容易地移植到各种不同的微处理器上。
现在,μC/OS -Ⅱ的2.52版已经通过了非常严格的测试,并且得到了美国航空管理局(Federal Aviation Administration )的安全认证,可以用在飞行器上。
uC\OS-II在51单片机上的移植戴国强、史培杰(安阳工学院计算机科学与信息工程系)摘要:uC\OS-II以其结果清晰、性能稳定、源码公开等特点,受到广大嵌入式开发人员的青睐,已作为嵌入式实时操作系统被移植到许多微处理器上,在国防、航空航天、交通、能源、工业控制、通信以及人们日常生活等各个领域得到了广泛应用。
关键字:嵌入式实时操作系统、uC\OS-II、移植、MCS-51单片机Abstract: Based on the advantage of clear structure,stable capability and free sound code,the uC\OS-II comes in for lots of people's like who empolder the embedded system.As a embedded real-time operation system,the uC\OS-II has been repoted on lots of MCU,and has widely used an plays a very important role in many fields, such as national defence,spacenavigation,traffic,energy sources,industry control,communications,and civil living.Key words: the embedded real-time operationsystem,uC\OS-II,transplant,Single Chip Computer of MCS-51随着电子技术与软件技术的飞速发展,嵌入式系统技术已经成了最热门的技术之一。
嵌入式实时操作系统是嵌入式应用软件的基础和开发平台,其中涉及到软件和硬件两方面的问题。
嵌入式实时操作系统研究的核心在于其内核结构和基本功能的研究以及嵌入式实时操作系统在不同芯片上的移植、任务的开发以及功能的扩展,同时这也是嵌入式实时操作系统的难点问题。
1 uC/OS-II简介uC/OS-II并非一个完备的实时操作体系,它只是一个实时内核。
uC/OS-II不像其它实时操作体系一样,提提供用户的是一个尺度的API函数,步伐开发职员使用操作体系提供的API函数举行应用步伐的开发。
要想在uC/OS-II内核上举行应用步伐的开发,就需要步伐开发职员在实时内核的基础上创建自己的实时操作体系。
首先,把uC/OS-II移植到自己的硬件目的板上,写出相应的驱动步伐以及用户图形界面等等;在这些接口函数之上,加上用户自己的应用步伐,就组成了嵌入式软件。
2 uC\os-II在MCS-51上的移植虽然μC/OS-II大部分源代码是用C语言写的,但是完成和处理器一些有关的代码时,照旧必须要用汇编语言来实现的。
要使uC\OS-II正常运行,必须满足一下要求:(1)处理器的C编译器能产生可重入型代码。
(2)用C语言就可以打开和关闭中断。
(3)处理器支持中断,并且能产生定时中断(通常频率在10至100Hz之间)。
(4)处理器能支持容纳一定量的数据存储硬件堆栈(可能是几千字节)。
(5)处理器有将堆栈指针和其他CPU寄存器的内容读出并存储到堆栈或内存中的指令。
MCS-51与KeilCx51编译器可以满足以上条件,可以将uC\OS-II移植到MCS-51系列处理器。
需要说明一点,目前uC\OS-II的版本较多,但基本都一致,兼容性也很好,本例采用的是uC\OS-II V2.52版。
μC/OS-II的移植包括以下几个部分。
(1)设置与编译器有关的代码[OS_CPU.H]在差异的处理器中有差异的字长,所以必须界说一系列数据范例以确保移植的准确性。
另外,在uC/OS-II中,不使用C的short、int和long等数据范例,这些都是和编译器相干的。
下面即是uC/OS-II界说的一部分数据范例。
typedef unsigned char BOOLEAN;typedef unsigned char INT8U; /*无标志8位整数*/typedef signed char INT8S; /*有标志8位整数*/typedef unsigned int INT16U; /*无标志16位整数*/typedef signed int INT16S; /*有标志16位整数*/typedef unsigned long INT32U; /*无标志32位整数*/typedef signed long INT32S; /*有标志32位整数*/typedef float FP32; /*单精度浮点数*/typedef double FP64; /*双精度浮点数*/首先来看对临界段的处理,就是关中断,处理完毕后在开中断。
uC\OS-II提供了3种方法来处理,针对MCS-51单片机,可以使用方法1来处理临界段。
在MCS-51系列单片机中,中断允许寄存器IE的第7位EA为中断允许控制为,EA=0屏蔽所有中断、EA=1允许所有中断。
MCS-51堆栈从低地址往高地址增长(1=向下,0=向上),因此将OS_STK_GROWTH定义为0。
OS_TASK_SW()是一个宏,在uC\OS-II从低优先级任务切换到高优先级任务是被调用。
uC\OS-II假定任务切换时靠中断级代码完成的,或者说uC\OS-II的任务切换时靠模仿中断动作来完成的。
uC\OS-II需要一条处理器指令,使其行为就像是硬件中断。
MCS-51没有软中断指令,在这种情况下,需要将堆栈结构设置成与中断堆栈结构一样,在用函数调用的方式来实现任务切换,也就是说,通过函数来模仿软中断指令。
#define OS_TASK_SW() OSCtxSw()(2)用C语言编写6个与操作体系有关的函数[OS_CPU_C.C]这10个函数是:OSTaskStkInit ()、OSTaskCreatHook()、OSTaskDelHook()、OSTaskSwHook()、OSTaskStatHook()、OSTaskIdleHook()、OSTimeTickHook()、OSInitHookBegin()、OSInitHookEnd()和OSTCBInitHook()。
这10个函数只对OSTaskStkInit()编写代码,后9个函数必须声明,但是内部并没有代码。
在对堆栈设计时需要考虑一下因素:<1>传统的8051处理器在中断来临时只将程序计数器PC的值压入堆栈。
<2>按照uC\OS-II的要求,保存全部寄存器,MCS-51的寄存器有PSW、ACC、B、DPL、DPH、R0-R7和SP。
<3>Cx51编译器允许用CPU寄存器传递3个参数。
<4>堆栈从低地址向高地址增长。
<5>堆栈指针指向上次入栈地址。
<6>MCS-51存在系统栈。
<7>系统栈深度为256字节。
因为需要进行任务栈与系统栈的复制,获得系统栈的起始地址,所以需要对系统进行一些定义。
首先,堆栈起点由Keil决定,只关心大小,然后通过SOStack获得keil分配的SP起点。
下面的代码就是相关的汇编代码,可以放在启动代码中,也可以放在相关的文件中。
?STACK SEGMENT IDATARSEG ?STACKOSStack:DS 40HOSStkStart IDATA OSStack-1系统堆栈存储空间大小=SP-OSStkSart,便可以得到长度。
任务切换时可以计算出得出,所以不必保存SP的内容。
为了函数重入,形参和局部变量必须保存在堆栈里。
MCS-51硬件堆栈太小,Keil将根据内存模式在相应内存空间仿真堆栈,增长方向由上向下,与硬件栈相反。
对于大模式编译,函数返回地址保存在硬件堆栈里,形参和局部变量放在仿真堆栈中,堆栈指针为?C_XBP,对MCS-51要使用大模式编译。
(3)编写4个汇编语言函数[OS_CPU_A.S]uC/OS-II的移植实例要求用户编写4个简略的汇编语言函数:OSStartHighRdy()、OSCtxSw()、OSIntCtxSw()、OSTickISR()。
4 测试、编写驱动和应用步伐做完以上事情以后,就要测试移植的是否准确。
测试一个μC/OS-II实时内核并不庞大,即是让这个实时内核在自己的目的板上跑起来。
开始时,可以运行一些简略的使命和时钟节奏停止使命,如果调试乐成就可以在上面添加应用步伐。
uC/OS-II移植完成以后,就要在这个实时内核之上编写接口驱动步伐。
由于嵌入式操作体系体积更小,功效更强,且快速、稳固,更具有针对性,因此不像其它操作体系那样,对体系的全部接口配置都需要驱动、管理、调治和监视。
由于嵌入式产品是针对特别的用途而计划的,有很强的埋头性,因此,在编写驱动步伐时内容更精简,更具有稳固性,编写出的驱动模块更小。
编写驱动步伐应完成以下基本功效:①对配置初始化和开释;②把数据从内核传送到硬件和从硬件读取数据;③读取应用步伐传送给配置文件的数据和回送应用步伐恳求的数据;④检测和处理配置出现的错误。
实现了以上功效以后,一个嵌入式操作体系就基本组成了。
参考文献[1]JEAN BROSSE著,邵贝贝译。
uC\OS-II--源码公开的实时嵌入式操作系统。
[M].中国电力出版社,2001.[2]陈是知。
uC\OS-II内核分析、移植与驱动程序开发[M].人民邮电出版社,2007。