uCOS_Ⅱ在AT89S51单片机上的移植
uCOS51移植心得
uCOS51移植心得
移植uCOS-III到8051平台需要做以下几个步骤:
1.选择适合的uCOS版本:由于8051平台资源有限,需要选择适合的uCOS版本。
一般来说,uCOS-II更适合8051平台,因为它的代码量较小,资源要求较低。
2.编写硬件抽象层(HAL):8051平台的硬件资源和处理能力较弱,需要在uCOS上面进行硬件抽象,提供与8051硬件相关的接口函数。
这些接口函数包括时钟、中断、任务切换等操作。
3.适配任务堆栈:uCOS需要为每个任务分配一块堆栈空间,因此需要针对8051的内存结构进行适配,保证每个任务的堆栈空间不会超出8051的寄存器能力。
4.适配时钟节拍:uCOS需要一个定时器来提供时钟节拍,因此需要适配8051的定时器,并编写中断处理函数来触发uCOS的任务调度。
5.适配中断处理:8051的中断机制与其他平台有所不同,需要编写中断处理函数来处理8051的中断事件,并将其与uCOS的任务调度结合起来。
6.测试和调试:移植完成后,需要进行测试和调试,验证移植的正确性和稳定性。
在移植过程中,需要具备8051平台的硬件知识和uCOS的软件知识,同时需要具备较强的调试能力,以确保移植的成功和稳定性。
uCOS在C51单片机上的移植
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单片机运行成功
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-Ⅱ在MCS-51上的移植
境的支持下 , 编写 了移植代码和测试程序 , 成功地 将 I / S 1移 植 到 了 MC -1上 ,  ̄ O 一1 C S5 使得 MC -1的 S5
程序 开发 建 立 在 操 作 系 统 的支 持 下 . 用 程 序 开 应 发基 于任 务进 行 , 易于 实 现模 块 化 设 计 ; 务 之 间 任
在传统的电子技术领域有 着广泛的应用. 一般来 讲 , C - 的应用 软件是一个无 限循环 , 的特 MS1 5 它 点是底层性 的 、 与对象系统 的紧耦合. 由于缺少计 算机工程设计方法和软件工程设计方法的指导 ,
软件 编制 随意性 较 大. 随着 应 用 需求 的 1益 复杂 , 3 这种 软件设 计 方 法 显 得 力 不从 心 , 切 需 要 实 时 迫
要: 在分析 实时多任 务 内核 I / S Ⅱ原理 和移植 方 法的基 础上 , t / S Ⅱ移植 到 了 MC ・1 片机  ̄ O・ C 将 x O・ C S5 单
上, 并在 K iC开发环境 下 编制 了测 试软 件 。结 果表 明: 移植 的操 作 系统 能很 好 地 工作 在 MC -1上 , e l 所 S5 为
创建、 除 、 删 优先权 改变 、 起/ 醒等 )并 有 存储 挂 唤 ,
写一些与处理器相关的代码. 比如 ,C O . 在读 I / S1  ̄ I 写 处理 器寄存 器 时 , 只能 通 过 汇编 语 言 实 现. 由于
I / S 1在设 计之 初 就 已充 分 考 虑 了可 移 植 性 ,  ̄ O -I C 所 以 I / S 1 移 植 还 是 比 较 容 易 的 . 使  ̄ O .I的 C 要 I / S 1正常工 作 ,  ̄ O- C I 处理 器必 须满 足如 下要 求 : ( ) 理器 的 C编译 器 能产 生可重 人 代码 1处
在51系列单片机上移植uCOS
μ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上使用操作系统依然是可行的。
μCOS-II在AT89C51上的移植
μ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移植到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单片机上的移植
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。
uCOS-II在51单片机上的移植
功能
处理临界段方式选择 堆栈增长方向 进入临界区 退出临界区 就绪态最高优先级任务运行 任务级任务切换 中断级任务切换 时钟节拍 任务堆栈初始化
表7-1 需要修改的关键函数和宏定义
6
7.1.6 INCLUDES.H
* * * * * * 文件名 : INCLUDES.H * 作者 : Jean J. Labrosse ****************************************************************************/
9
7.1.8 OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()
临界代码的概念。 uC/OS-II定义的两个宏。
{ OS_ENTER_CRITICAL(); /* µC/OS-II 临界代码段 */ OS_EXIT_CRITICAL(); }
#define OS_ENTER_CRITICAL() EA=0 #define OS_EXIT_CRITICAL() EA=1 #define OS_ENTER_CRITICAL() \
例如,任务A和任务B都要调用函数Swap(), 而该函数又使用了全局变量temp。于是当任 务A调用Swap()函数期间,系统发生了任务 切换而使任务B也调用了Swap(),那么任务B 将要改变全局变量temp的值,使任务A传递 给全局变量temp的值丢失而出现错误。
一般来说,一个可重入函数应该在函数中只 使用局部变量,因为函数的局部变量存储在 任务的堆栈中,所以可保证不同的任务在调 用同一个函数时不会发生冲突。
/ ******************* 与处理器相关的代码 ********************/ #define OS_CRITICAL_METHOD ?? #if OS_CRITICAL_METHOD = = 1 #define OS_ENTER_CRITICAL() ?? #define OS_EXIT_CRITICAL() ?? #endif
_C_OS_在51系列单片机上的移植
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 )的安全认证,可以用在飞行器上。
uCOS-II在51单片机上的移植
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随着电子技术与软件技术的飞速发展,嵌入式系统技术已经成了最热门的技术之一。
嵌入式实时操作系统是嵌入式应用软件的基础和开发平台,其中涉及到软件和硬件两方面的问题。
μC/OS—Ⅱ内核在80C51系列单片机上的移植
Ke r s 8 5 c o r c s o ; r at p r t gs s m ; p r; c o s c mp l r t s y wo d : 0 mir p o e s r e l meo e a i y t 1 i n e o t r s-o i ; et e
P ri gu OS I e n l o 8 C 5 -a l c o r c s o o t C/ —I r e 0 f mi mir p o e s r n k t 1 y
ZHAO i n h a W AN G o ue c n e n n ier g Sh o o mp t Si c dE gne n ,UE To hn , C eg u 04C i ) C r e a i S f i C a h n d 1 5 hn 6 0 a
Ab t a t Th e e tu t r n h o t g t c n l g f C/ ・I si t d c d wh c s i d o mb d e e l m eo e a ig sr c : e k r l r cu e a d t e p r n e h o o y o OS I i r u e , n s i u n o ih i k n fe e d d r at p r t a i n s se y t m. T ek y t c o o dt e r c s f o i g u OS I e e 0 f mi c o r c s o s r ic se , t et sig e - h e h l g a o e so p r n C/ -I r l o 8 C51 a l mir p o e s r e d s u s d h t x en y n h p t kn t y a e n p rme t fe o ig i a a y e . F n l ed fe e c b u ep ri gt ec mp lro el 5 s o n e u , a d t eg n r l ei n tr r n lz d a pt sn i al t i r n e a o t h o n t o i f i Cx i it d o t n e e a yh t t oh e k 1 p h
μC/OS-II在51单片机上的移植
μ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单片机上移植ucos-II
嵌入式实时操作系统实验报告 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编译器能产生可重入代码。
ucos ii移植过程详解
uCOS-II移值过程实例讲解我将uCOS-II 移植到了EPONS 的C33209的平台上,接下来我就基于我移植好的代码讲解如何将uCOS-II从一种MCU移植到另一种MCU。
首先介绍uCOS-II的文件,如下表:ucos_ii.hos_cfg.hos_cpu.hos_core.cos_dbg_r.cos_flag.cos_mbox.cos_mem.cos_mutex.cos_q.cos_sem.cos_task.cos_time.cucos_ii.cos_cpu_c.cos_cpu_a.asm其中我们和硬件平台相关的文件的文件名被加粗了,也就是说若要将uCOS-II移植到新的平台上只要关心被以上四个文件就行了。
当然你也可以根据需要再添加你自己的和平台相关的文件,事实上我也是这么做的。
在我移植的例子中就添加了四个和平台相关的文件,文件如下表:crt0.cdrv_rtc.cvector.cext.scrt0.c是用来初始化系统的比如说MCU的一些特殊寄存器、设置外围的总线接口,等。
drv_rtc.c是用来初始化系统中的一个RTC的,这个RTC可以为内核提供必要的基于时间片调度的时基。
同时提供了对RTC开始和停止的操作函数。
在我的例子中RTC会每秒产生32次中断。
vector.c顾名思义,它是系统上电后为系统提供矢量入口表的文件,当然也包括中断向量表。
ext.s是为uc/OS-II 提供OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()函数的具体实现以及在用户程序的中断函数出入时要调用的状态保护和状态恢复函数OS_SA VEALL ()和OS_RESTOREALL ()。
前面两个函数的功能是:OS_ENTER_CRITICAL()屏蔽中断;OS_EXIT_CRITICAL()恢复原来的中断使能状态。
1. os_cpu_a.asm的说明要想顺利的移植首先要了解uCOS-II的一些基本概念。
ucos2操作系统在51单片机上的移植
μ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-Ⅱ在AT89S51单片机上的应用
务都有 自己的硬件栈和仿真栈 , 硬件栈用于保存 任务运行时系统栈 内的数据. 用户栈中保存 的仿 真栈 与硬件 栈相 向生长 , 中间为 空闲 间隔. 件栈 硬
的保存 恢复 是通 过 拷 贝 实 现 的. 对 于 仿 真堆 栈 而
的保存 , C O - 只提供堆栈空间和只操作堆栈 t / SI L 1
T eA piaino h p l t f ̄: os l o S5 C c o / -I nMC -1S M
LI Ho g l ,ZHAO n U n —i Pi g
( colfC m u r n frai ni en , h nh i nvrt Sho o pt dI o t nE gn r g S a g a U i sy o ea n m o ei ei o l tc o e, h n hi 20 9 ,C ia fEe r w r S g a 00 0 h ) ci P a n
i r vd d e o d y, t e e i n e h i u o h e c r l s s ie .Fia l t e i lct s p o i e .S c n l h d sg t c n q e f t r e o e f e i gv n i n ly, h smp i i y,
一
1  ̄ / -I c os l系统 原 理
w / S I的代 码 9 % 都 是 用 A S C O ・I 0 N IC写 的 , 可 移植性 好 , 安全性 高 , 码 的容 量 至少 为 8k . 代 B
由于 A 8 ¥ 1 片机 的 R M 只有 4 k 所 以要 T95 单 O B,
文章 编 号 :10 4 2 (0 2 0 0 6 06— 7 9 2 1 )4— 35—0 4
uCOSⅡ内核在80C51系列单片机上的移植
;以下代码完成第①步操作
万方数据
·——2097·——
PUSHALL:用户定义的宏,将全部CPU寄存器保存到 3.2实验的过程和结果
系统堆栈
实验过程主要镪括以下3个步骤:@创建两个任务Taskl
MOV A,SP;淤下3匍蜜现获褥堆筏戆长度
秘Task2,验涯OSTaskStldnit袭OSStartHighRdyoi蕊数;◇刳建
save_stack: ;以下实现从系统堆棱到用户堆栈豹拷贝 INC DFFR:撵自惩产臻筏
巍输出的不同结聚,验证OSIntCtxSw鞠OSTicklSR函数。 主要测试健弱黧下:
0引言
近年来,嵌入式系统已成为后PC时代一个广阔的研发领 域,其应用范围越来越广。实际应用中,由于移植所花费代价 最小,原有操作系统无法支持新增应用功能时,常会采用系统 移植来解决问题。uC/OS.II作为一个高可靠,开源的嵌入式实 时操作系统,具有广泛的应用;而利用廉价的80C51实现众多 传感器、控制器等电子设备的网络互联,更是具有先天优势。 因此在80C51上移植uC/OS.II具有重要的意义。本文以uC/ OS.II为移植对象,以80C51为移植目标来详细讨论移植的过 程,其中自己设计了一个堆栈结构;最后给出移植测试实验, 分析了移植中要注意的一些问题,总结了移植的一般方法。
1移植前的准备工作
移植前首先要对移植对象,移植目标及其结构,以及移植 的编译环境进行了解。这样才会起到事半功倍的效果。以下 便是从这几个方面进行简单分析。 1.1 移植对象——uc,os.Ⅱ
.
uC/OS.II具有很强的可移植性,可以广泛应用于各类8 位,16位,32位微控制器或DSP中。它具有完全可剥夺型的 实时内核,其核心工作原理是让最高优先级的就绪任务处于 运行状态;它具有多任务的特点,可以管理64个任务,其中56
μC/OS-Ⅱ在51单片机上的移植
分 重 要 的意 义 。
函数 调 用 时 , 栈 的 一 个 重 要 功 能 就 是 保 存 被 调 函 数 的 断 点 堆 地 址 。若 有 4 函 数 ,u 1 用 F n 。u2调 用 Fn , u3 个 Fn 调 u2Fn u 3 F n
1 I /  ̄ OS实 时操 作 系统 概 述 C
P ri g RTOS IC OS H 0M CS 5 ot n / - t  ̄ .1
LV a - a,XU — i g Xi o n Lip n
(colfI o ainadE gneig Z egh uU i r , hnz u40 0 , hn ) Sho n r t n n i r , hn zo n es Z egh 5 0 1 C i o fm o e n v o a
间 少 的情 况 , 用 改 变 堆栈 指 针 到 不 同任 务 寄 存 器组 的 方 法 , 过 改 变堆 栈 指 针 的 实验 。 出在 堆 栈 空 间较 少 的 情 况 采 通 得 下 , 能 够 实现 t /S I在 5 单 片 机 上 的 运 行 的 结论 也 r O —I C l 关键 词 : CO ; 片机 ;实 时操 作 系统 ; 栈  ̄ /S 单 堆 中 图分 类 号 : P 1 T 3 文献标识码 : A 文章 编 号 :17 — 2 6 2 1 )6 O 5 — 3 64 6 3 (0 2 0 一 0 2 0
吕 小 纳 .徐 力 平
( 州 大 学 信 息 工 程 学 院 , 南 郑 州 4 00 ) 郑 河 5 0 1
摘 要 :针 对在 5 单 片 机 上 移植 实时操 作 系统 t / S I 的 目的 ,  ̄ / S I 工 作 原 理 为 基础 。 合 5 1 r O —I C 以 CO —I 结 l单 片机 堆 栈 空
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2008年第4期计算机与现代化JISUANJIYUXIANDMHUA总第152期文章编号:1006-2475(2008)04-0017-03uC/OS—II在AT89S51单片机上的移植周文(湖南师范大学数学与计算机学院,湖南长沙410081)摘要:详细介绍了uC/OS_II在栅9s5l单片机的移植过程。
讨论了移植过程中应该注意的几个问题,并给出完整的测试过程以验证移植的正确性。
关键词:嵌入式实时操作系统:uC/OS_II中图分类号:TP316文献标识码:ATransplantationofuC/OS_IItoAT89S51ZHOUWen(SchoolofMathematicsandComputerScience,HunanNormalUniversity,C螂lla410081,China)Abstract:Thispaperresesa'uhe8themethodoftransplantingopenflourcellc/0s.-ⅡtOA1暑9s5l。
disemesflomeproblemaboutthet瑚msplanting。
andsivaoutthewholetestingwaytoprovetheeorreetnetm0f’thetransplanting.Keywords:embeddedreal—timeoperatingsystem;uCdOS_110引言目前嵌入式设备已遍布各个应用领域,而大部分的嵌入式设备不需要也没有条件运行操作系统。
如,以前许多MCS5I系列单片机组成的小系统就只是利用软件实现简单的控制环路。
随着科技的进步和技术的更新,各种微处理器的功能越来越强,各种存储设备的价格变得越来越便宜,为移植操作系统到嵌入式设备上提供了可能。
随着所谓后PC时代的来临,嵌入式系统设计日趋复杂,嵌入式操作系统就必不可少了。
本文以在AT89S51单片机上移植uC/OS一Ⅱ为例,阐述了在一般单片机上移植uC/OS—II的过程‘61。
1uC/OS_II实时操作系统简介uC/OS_II是一款源码开放的实时多任务操作系统内核。
它具有内核小巧可裁剪、实时性强、支持多任务、可方便移植到多种嵌入式平台等特点,适用于安全性要求苛刻的系统,目前已得到美国联邦航空管理局(federalaviationadministration)对用于商用飞机的、符合RTCADO一178B标准的认证p’。
uC/OS一Ⅱ是一个可剥夺式内核,不支持轮转法调度,每个任务都有独立优先级并且使用本地堆栈;在中断退出后并不返回被中断任务,而是直接调度已就绪的高优先级任务执行,从而能够尽快让高优先级的任务得到响应,保证系统的实时性能;同时对临界资源管理借鉴了Unix中信号量等成熟技术。
因此它是一种执行效率高、占用空间小、实时性能优良、可扩展性强的嵌入式实时操作系统p’。
2AT89S51单片机AT89S51单片机是美国ATMEL公司生产的低功耗、高性能COMS8位单片机,片内含4kbyte的系统可编程Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准8051指令系统及引脚。
它集Flash程序存储器及通用8位微处理器于单片芯片中,既可在线编程(ISP)也可用传统方法进行编程。
AT89S51相对于AT89C51增加了许多新功能,包括:ISP在线编程功能、最高工作频率为33MHz、具有双工UART串行通道、内部集成看收稿日期:2007-04.16作者简介:周(1979.),男,湖南长沙人,湖南师范大学数学与计算机学院硕士研究生,研究方向:嵌入式操作系统。
万方数据18计算机与现代化2008年第4期门狗计时器、双数据指示器、电源关闭标识、全新的加密算法、向下完全兼容C51系列产品‘引。
ATMEL公司的功能强大、低价位的AT89¥51单片机已广泛用于各种控制领域中。
3移植过程移植就是使一个实时内核能在其他微处理器或微控制器上运行。
基本上就是编写与处理器相关的代码。
满足uC/OS_II移植的处理器的要求如下…:①处理器的C编译器能产生可重入型代码;②处理器支持中断,并能产生定时中断;③用C语言就可以开/关中断;④处理器能支持一定数量的数据存储硬件堆栈(可能是几kB);⑤处理器有将堆栈指针以及其他CPU寄存器的内容读出。
并存储到堆栈或内存中去的指令。
首先是芯片的中断处理机制,如何开启、屏蔽中断,可否保存前一次中断状态等。
其次,芯片是否有软中断或是陷阱指令,又是如何触发的。
此外,还需关注系统对于存储器的使用机制,诸如内存的地址空间,堆栈的增长方向,有无批量压栈的指令等[7】。
AT89S5l单片机满足以上要求,可以完成移植工作。
图l所示为uC/OS—II的结构以及与硬件的关系。
从图中可以看出完成移植工作主要是将OS—CPU.H、OS_CPU_A.ASM、OS_CPU_C.C进行修改。
uc/os_iI配置(与应用相关)os—CFG.HINCLUDES.HuC/O¥一II移植(与处理器相关代码)OS—CPU.HOS—CPU—A.ASMOS—CPU—C.C软件硬件[二二互正]_[二玉亟[]图1uC/OSI]硬件/软件体系结构3.1堆栈的初始化uC/OS_H为每个任务建立了任务堆栈,相当于函数调用时保存返回地址和参数一样,用来保存当前任务的状态,保证任务切换能和函数调用一样正确。
只不过函数调用时函数堆栈的操作过程是编译器自动完成的,而任务切换时需要模拟一个和编译器类似的任务堆栈的操作过程。
堆栈的增长方式有两种,一种是向上增长,一种是向下增长,在89¥51单片机中的堆栈初始指针是指向栈底的,所以应该在OS_STK—GROWTH中设置为0。
89S51单片机堆栈的结构如图2。
R7R6R5R4R3R2R1R0DPHDPLBACCPSW图289¥51堆栈结构3.2与处理器相关的文件的修改(1)OS_CPU.H。
Os-CPU.H包括了用#define语句定义的、与处理器相关的常数、宏以及类型和两个重要的开关中断函数:OS—ENTER—CRITICAL()和OS—EXIT—CRITI-CAL()。
在A髓9S5l单片机中用EA=0关中断、EA=l开中断来实现。
这样定义既减少了程序行数,又避免了退出临界区后关中断造成的死机;uC/OS—II中进行任务切换时通过执行osjIASK._SW()来产生中断,要求处理器提供软中断或是陷阱指令来完成这个功能,因为C51没有软中断指令,所以用程序调用代替:#defineOSTASK-Sw()OSCtxSw()。
两者的堆栈格式相同,而用RETI指令复位中断系统。
(2)OS_CPU_C.C。
在OS_CPU_C.C中定义了lO个函数,其中9个必须声明,但不一定要包含任何代码,它们是由系统函数调用的接口函数,让用户能在操作系统中加入自己需要的一些功能,如果不需要使用也可以不定义,但要将OS—CFG.H中的OS—CPU—HOOKS—EN设为0.OSTaskCreat()和OSTaskCmatExt()通过调用OS-TaskStkInit(),初始化任务的栈结构;因此,堆栈看起来就像中断刚发生过一样,所有寄存器都保存在堆栈中。
OSTaskStklnit()的示意性代码如下:码丘_娘彻№叭∽觚HI螂一一一一一一一偈8I一雪I距一m腿 万方数据2008年第4期周文:uC./OS1I在A1羽s5l单片机上的移植19O¥_STK枣OSTaskStklnit(void(·诅sk)(void·pd).void·pOata,OS_STK·ptos。
INTl6Uopt);{模拟带参数(plata)的函数调用;模拟ISR向量;按照预先设计的寄存器值初始化堆栈结构;返回栈顶指针给调用该函数的函数;l(3)OS_CPU..,A.ASM。
在OS—CPU—A.ASM中要修改4个汇编语言函数:OSStartHighRdy():OSStart()函数调用它来使就绪态任务中优先级最高的任务开始运行。
先将OSTCBCUR的指针(指针占3个字节)存到DPTR中,再将OSTCBCur一>OSTCBStkPtr的指针存人到DPTR中,接着用R5保存堆栈长度,恢复现场堆栈内容,最后恢复堆栈。
OSCtxSw():它是一个任务级的任务切换函数,是在任务需要进行切换时被OS—TASK—sw()调用。
首先获得堆栈的长度和起始地址,然后获得当前TCB指针,这样就可以获得用户堆栈指针,保存堆栈长度,接着保存仿真堆栈,因为任务切换必须保存当前堆栈内容以免堆栈内容丢失,导致任务恢复失败。
最后调用用户程序LCALL一?OSTaskSwHook,它实现两个功能:OSTCBCur=OSTC,BHighRdy。
OSPrioCur=OSPrio-Hig}lRdy。
OSTickISR():这是时钟节拍中断服务子程序,必须在开始多任务后,即调用OSStart()后,才可以启动时钟节拍中断,在此它定义了Tick=50彬秒(即0.02秒/次)。
OSIntCtr,Sw():它是中断级的任务切换函数,被OSIntExit()调用,在ISR中执行中断任务切换。
它调整SP指针去掉在调用OSIntExit(),OSIntCtxSw()过程中压人堆栈的多余内容。
4与KeilC51编译器有关的问题编译器采用KeilC5l。
KeilC5l是Keil公司的一款针对5l系列单片机的编译器,其uVision2集成开发环境将项目管理、源代码编辑和程序调试等组合在一起,功能强大,使用方便"】。
在KeilC51环境下移植uC/OS—II可以直接进行软件仿真,不必下载到硬件上运行。
在KeilC51编译环境中,需要注意几个地方:在KeilC51中默认编译是不支持可重入代码的,而多任务操作系统需要并发操作有必要使用可重入函数,因此可以在每个C函数及其声明后面加上reentrant关键字,将其声明为可重入。
pdata、data在uC/OS_II中用做一些函数的形参,但它同时又是KeilC51的关键字,会导致编译错误,可以把pdata改成ppdata,把data改成ddata解决此问题。
OSTCB-Cur,OSTCBHighRdy,OSRunning,OSPfioCur,OSPrio-Hi曲Rdy这几个变量在汇编程序中用到了,为了使用磁访问而不用DPTR,应该用KeilC51扩展关键字IDATA将它们定义在内部RAM中。
另外,在KeilC5l中尽量使用指定存储类型的指针(memoryspecif-icpointer)而不使用一般指针(geneticpointer),外部变量都申明为xdata类型,指向外部变量的指针改为xdata数据类型的指针,指向函数的指针改为code数据类型的指针以提高执行效率。