UCOS-Ⅱ在LPC2131中的移植.doc_第1页
UCOS-Ⅱ在LPC2131中的移植.doc_第2页
UCOS-Ⅱ在LPC2131中的移植.doc_第3页
UCOS-Ⅱ在LPC2131中的移植.doc_第4页
UCOS-Ⅱ在LPC2131中的移植.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

精品论文uc/os-在 lpc2131 中的移植邓庆田 1,徐群 21 河海大学电气学院,江苏南京,(210098)2 河海大学电气学院,江苏南京,(210098)e-mail:摘要: uc/os-ii 是一个源代码免费、简洁、易用的基于优先级的嵌入式抢占式多任务实 时内核。其内核提供任务间同步与通信、内存管理和中断等功能,适合小型控制系统, 具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点。正是这些特点近年 来普遍受到人们的关注,本文介绍嵌入式操作系统 uc/os-的主要特点和基本原理,以lpc2131 为例介绍其在嵌入式开发平台中的移植方法和技巧,重要分析其移植技术,并 详细描述了其移植过程,并分析了一些测试实验。关键字:嵌入式操作系统移植 多任务 uc/os- 中图分类号:tp368.21.引言嵌入式系统是现代网络技术之后,又一个新的技术发展方向,由于嵌入式系统具有体积 小、性能强、功耗低、可靠性高以及面向行业应用广泛的突出特征,目前已经广泛地应用于 军事、消费电子、网络通信、工业控制等各个领域。目前市场上的商用嵌入式操作系统产品,如 vxwork、psos、和 windows ce 等已经十分 成熟,提供有力的开发和调试工具,但开发成本昂贵,且源代码不公开,并不适用于一些小 系统的开发。而 uc/os-是一种多任务实时操作系统,内核源码公开,其核心代码短小精 悍,最小只需要几 k 的 rom,移植性强,具备了实时操作系统的全部性能,特别适用初学者 学习嵌入式技术使用。2.uc/os-的特点和原理2.1 uc/os-的主要特点 优先级可剥夺的实时多任务操作系统。 可以处理和调度多大 64 个任务,任务的优先级可在运行中根据需要进行动态调整。 提供很多系统服务,如邮箱机制,队列机制,信号量机制。 具有良好的可裁减性。2.2 uc/os-的核心工作原理uc/os-ii 的工作核心原理是:近似地让最高优先级的任务就绪任务处于运行状态。首 先,初始化 cpu,再进行操作系统初始化,主要完成任务控制块 tcb 初始化,tcb 优先级表 初始化,tcb 链表初始化,事件控制块(ecb)链表初始化,空任务的创建等等;然后就可以 开始创建新任务,并可在新创建的任务中再创建其他的新任务;最后调用 osstart()函数启 动多任务调度。在多任务调度开始后,启动时钟节拍源开始计时,此节拍源给系统提供周期 性的时钟中断信号,实现延时和超时确认1。操作系统在下面的情况下进行任务调度:中断(系统占用的时间片中断 ostimetick()、 用户使用的中断)和调用 api 函数(用户主动调用)。一种是当时钟中断来临时,系统把当前 正在执行的任务挂起,保护现场,中断断处理,判断有无任务延时到期,若有则使该任务进 入就绪态,并把所有进入就绪态的任务的优先级进行比较,通过任务切换去执行最高优先级- 7 -的就绪任务,若没有别的任务进入就绪态,则恢复现场继续执行原任务。另一种调度方式是任务级的调度即调用 api 函数(由用户主动调用),是通过发软中断命令或依靠处理器在任务 中找出目前处于就绪态的优先级最高的任务去执行。当没有任何任务进入就绪态时,就去执 行空任务。移植,就是使一个实时内核能在某个微处理器或微控制器上运行。为了移植方便,大部 分的 uc/os-代码是 c 语言编写的,但仍需要用汇编语言写一些与处理器相关的代码,这 是因为 uc/os-在读写处理器寄存器是只能通过汇编语言实现。由于 uc/os-仅是一个内 核式操作系统,并且在设计时就已经充分考虑了可移植性。所以 uc/os-的移植相对来说 是比较容易的。要使 uc/os-能够运行,处理器要满足以下要求2: 处理器的 c 编译器能产生可重入代码。 用 c 语言就可以打开或关闭中断。 处理器支持中断。并且能产生定时中断。 处理器支持能够容纳一定数量数据的硬件椎栈。 处理器将椎栈指针和其他 cpu 寄存器读出并存储到锥栈或内存中的指令。3. lpc2131 芯片的介绍lpc2131 是飞利浦公司生产的基于一个支持实时 16/32 位 arm7tdmi-stm cpu 芯片,特 别适用于工业控制和 pos 机等小型应用中,主要有以下特点3:16/32 位 arm7tdmi-s 核,超小 lqfp64 封装。8 的片内静态 ram 和 32 的片内 flash 程序存储器。128 位宽度接口/加速器可实高 达 60mhz 工作频率。1 个(lpc2131/2132)或 2 个(lpc2138)8 路 10 位的 a/d 转换器,共提供 16 路模 拟输入,每个通道的转换时间低至 2.44us。2 个 32 位定时器/计数器(带 4 路捕获和 4 路比较通道)、pwm 单元(6 路输出)。实时时钟具有独立的电源和时钟,可在节电模式中极大地降低功耗。多个串行接口,包括 2 个 16c550 工业标准 uart、2 个高速 i2c 接口(400 kbit/s)、spitm 和具有缓冲作用和数据长度可变功能的 ssp。向量中断控制器。可配置优先级和向量地址。4. uc/os-移植过程4.1 移植步骤uc/os-移植工作包括以下几个内容: 用#define 设置一个常量的值(os_cpu.h 文件中)。 声明 10 个数据类型(os_cpu.h 文件中)。 用#define 声明 3 个宏(os_cpu.h 文件中)。 用 c 语言编写 6 个简单的函数(os_cpu_c.c 文件中)。 编写 4 个汇编语言函数(os_cpu_a.asm 文件中)。应 用 程 序 软 件uc/os-(与 cpu 无关)os_core.cucos_.c os_mbox.c os.c os_mem.cos_task.c os_sem.c os_time.cuc/os-(应用相关代码)os_cfg.h includes.huc/os-(与 cpu 相关)os_cpu.hos_cpu_a.asmos_cpu_c.cuc/os-全部源代码量大约是 60007000 行,共 15 个文件。移植到 lpc2131 的处理器上。需要修改三个与之相关体系结构的文件,代码量大约是 500 行。以下是介绍三个文件的 移植工作。4.2 os_cpu.h 文件数据类型的修改与所用的编译器相关,不同的编译器使用不同的字节长度表示同一类 型,比如 int,同样在 x86 平台上,gnu 的 gcc 编译为 4bytes,而在 ms vc+则编译为 2bytes。 本文使用的是 ads1.2 开发软件编译器。/*数据类型(与编译器相关)*/typedefunsignedcharboolean; typedefunsignedcharint8u; typedefsignedcharint8s; typedefunsignedintint16u; typedefsignedintint16s; typedefunsignedlongint32u; typedefsignedlongint32s; typedeffloatfp32; typedefdoublefp64; typedefunsignedintos_stk;#definebyteint8s#defineubyteint8u#definewordint16s#defineuwordint16u#definelongint32s#defineulongnt32u/*与处理器相关的代码*/#defineos_critical_method2/选择开、关中断的方式 swi(0x00) void os_task_sw(void);/任务切换函数 swi(0x01) void _osstarthighrdy(void);/运行优先级最高的任务 swi(0x02) void os_enter_critical(void);/关中断 swi(0x03) void os_exit_critical(void);/开中断 swi(0x40) void *getosfunctionaddr(int index);/获取系统服务函数入口 swi(0x41) void *getusrfunctionaddr(int index); /获取自定义服务函数入口 swi(0x42) void osisrbegin(void);/中断开始处理 swi(0x43) intosisrneedswap(void);/判断中断是否需要切换 swi(0x80) void changetosysmode(void);/任务切换到系统模式 swi(0x81) void changetousrmode(void);/任务切换到用户模式 swi(0x82) void taskisarm(int8u prio);/任务代码是 arm 代码 swi(0x83) void taskisthumb(int8u prio);/任务代码是 thumb4.3 os_cpu_a.asm 文件在 os_cpu_a.asm 文件中,移植过程中要求用户编写以下 4 个简单的汇编语言函数: osstarthighrdy()、osctxsw()、osintctwsw()和 ostickisr()。由于篇幅所限,四个函数 中只给出了 osstarthighrdy()具体汇编程序,其它三个给出过程,很容易写出。(1)osstarthighrdy()此函数是在 osstart()多任务启动后,负责从高优先级任务 tcb 控制块中获得该任务的 椎栈指针 sp,通过 sp 依次将 cpu 现场恢复,这时系统就将控制权交给用户创建的该任务进 程,直到该任务被阻塞或者被其他更高优先级任务抢占 cpu。以下采用 arm7 汇编语言写的 osstarthighrdy()void osstarthighrdy(void)export osstarthighrdyosstarthighrdyldrr4,addr ostcbcur;/得到当前任务的 tcb 的地址ldrr5,addr,ostcbhighrdy;/得到更高优先级任务 tcb 的地址ldrr5,r5;/得到锥栈指针 ldrsp,r5;/切换到新的锥栈 strr5,r4;ldmr sp!,r4 msrspsr,r4ldmfd sp!,r4;msr cpsr,r4;/设置处理器工作模式ldmfd sp!,r0-r12,lr,pc;/将任务起始地址赋给 pc,开始执行新的任务end(2)osctxsw()osctxsw 任务级的上下文切换,当任务因为被阻塞而主动请求 cpu 调度时被执行,由于 此时的任务切换在非异常模式下进行,因此区别于中断级别的任务切换。它的工作是先将当 前任务的 cpu 现场保存到该任务锥栈中,然后获得最高优先级任务的锥栈指针,从该锥栈中 恢复此任务的 cpu 现场,使之继续执行,完成一次任务切换。void osctxsw(void)ostcbcur-ostcbstrkptr=stack pointer; /将当前任务的锥栈指针保存到当前任务的os_tcb 中ostcbcur= ostcbhighrdy;ospriocur=ospriohighrdy;stack pointer= ostcbhighrdy-ostcbstkptr;/恢复新任务的锥栈 (3)osintctxsw()中断级的任务切换,在时钟中断 isr 中发现有高优先级任务等待的时钟信号到来,则在 中断退出后比不返回被中断任务,而是直接调度就绪的高优先级任务执行,从而能够尽快地 让高优先级的任务得到响应,保证系统的实时性。void osintctxsw(void)ostcbcur-ostcbstkpt=锥栈指针; 调用自己定义的 ostaskswhook(); ostcbcur=ostcbhighrdy;/*得到需要恢复的任务的锥栈指针:锥栈指针= ostcbhighrdy-ostcbtkptr;恢复所有寄存器的内容从新任务的锥栈中恢复出来;中断返回;*/ (4)ostickisr()时钟中断处理函数,其主要任务是负责处理时钟中断,调用系统实现的 ostimetick 函 数,如果有等待时钟信号的高优先级任务,则需要在中断级别上调度其执行。程序清单如下, 但这些代码也要写在汇编语言中。void ostickisr(void)osintnesting= osintnesting+1;调用 ostimetick(); 调用 osintexit(); 恢复处理器寄存器; 执行中断返回;4.4 os_cpu_c.c 文件os_cpu_c.c 文 件 的 移 植 中 要 求 编 写 6 个 与 操 作 系 统 相 关 的 函 数 : ostaskstkinit(),ostaskcreatehook(),ostaskdelhook(),ostaskswhook(),ostaskstathoo k(),ostimetickhook()。但是,唯一需要移植的只有任务锥栈初始化函数 ostaskstkinit()。 void *ostaskstkinit(void(*task)(void *pd),void *pdata,void *ptos,int16u opt)unsingned int *stk;opt=opt;/opt 没有用到,防止编译警告stk=(unsingned int *)ptos;/装入锥栈指针*stk=(unsingned int)task;/pc 任务起始地址*stk=(unsingned int)task;/lr 任务起始地址*-stk=0;/r12*-stk=0;/r11精品论文*-stk=0;/r10*-stk=0;/r9*-stk=0;/r8*-stk=0;/r7*-stk=0;/r6*-stk=0;/r5*-stk=0;/r4*-stk=0;/r3*-stk=0;/r2*-stk=0;/r1*-stk=(unsingned int)pdata ;/参数值 r0以上工作完成之后就可以将源程序和操作系统一起编译生成可执行代码下载到 arm 中, 这样 uc/os-就可以运行了。5. uc/os-移植测试移植后,首先要做的工作是能够保证 uc/os-系统能够正常运行,可以加载几个简单 的任务,这样做有利于检测系统的错误,方便修改。如果测试通过,说明系统没有问题,就 可以添加更多的应用任务了。6. 结束语uc/os-作为一个源码开放的实时操作系统已经被移植到多中处理器中,甚至 51 单片 机中,由于 51 单片机资源有限,不具有开发价值,而在 arm 结构中 uc/os-的优越性得到 了充分的体现。随着嵌入式实时系统的复杂化和处理器性能的挺高,实时操作系统 uc/os- 一定会得到更好的发展和应用。参考文献1 labrosse jean j.嵌入式实时操作系统uc /os - iim .邵贝贝译. 2版.北京:北京航空航天大学出社,20032马文华 嵌入式系统设计与开发.第一版,北京:科学出版社,20063周立功.arm嵌入式系统基础教程m,北京:北京航空航天大学出版社,2005theporting of rtos uc/os- to lpc2131deng qingtian1,xu qun21 the college of electrical engineering,hohai university,nanjing, 2100982 the college of electrical engineering,hohai university,nanjing, 210098abstractuc/os-ii is a source code for free, simple, easy-to-use priority-based embedded real-time preemptive multitasking kernel. its core mission

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论