ucos-II在ARM7上的移植代码(含详细注释)
- 格式:doc
- 大小:41.00 KB
- 文档页数:8
基于ARM7核处理器uC/OS-ii系统的Nos-Wlan移植
1 引言
目前,在无线监控、工业控制、视频传输等行业应用中,嵌入式无线系统主要采用以NORDIC 解决方案为代表的无操作系统环境,该方案由CPU+无线数传模块构成,能够实现短距离低带宽无线通信。
为满足这种需求,北京中电华大电子设计有限责任公司(以下简称华大电子)适时的推出了不依赖于任何操作系统的Nos-Wlan 模块以加速现有产品的无线功能的升级,模块支持国内(WAPI)/国际(802.11i)安全标准。
本文主要介绍了华大电子Nos-Wlan 模块在基于ARM7 核处理器LPC2478 的uC/OS-ii 环境下的移植。
2 Nos-Wlan 模块介绍
Nos-Wlan 系列模块产品是为了满足工业应用、安防监控等领域中,现有产品的无线功能升级的需要而研发的,其最大的特点在于:它提供了一个不基于任何操作系统的驱动软件,可以集成到任何的系统平台中运行,并实现高速的数据传输,使得没有操作系统也能使用Wi-Fi 进行视频传输成为可能。
Nos- Wlan 产品硬件如图1 所示:
图1 TLG09UB09
Nos-Wlan 其驱动软件结构如图2 所示:
图2 Nos-Wlan 驱动结构
Nos-Wlan 模块集成到主机系统中的位置如图3 所示:
图3 Nos-Wlan 在主机系统的位置。
实时操作系统C/OS-II在ARM7上的移植引言目前,嵌入式系统在家电、移动电话、PDA 等各种领域的应用日益广泛,程序设计也越来越复杂,这就需要采用一个通用的嵌入式操作系统来对其进行管理和控制。
移植了操作系统的嵌入式系统开发,可大大减轻程序员的负担,操作系统提供了多任务的管理功能,只需专注于每个任务的管理。
对于不同的应用,可以按照相同的步骤完成系统设计。
如果更换硬件平台,则只需要对操作系统进行少量的移植工作,与硬件无关的应用代码完全无需修改,同时,可增强代码的可读性、可维护性和可扩展性。
μC/OS-II是一种专门为微处理器设计的抢占式实时多任务操作系统,具有源代码公开、可移植性和可靠性高等特点。
由于μC/OS-II是为嵌入式应用编写的通用软件,故在具体应用时需根据不同单片机的特点进行移植,其大部分代码是用标准C 语言所写,只有与处理器相关的一部分代码用汇编语言编写,因而具有很强的移植性,能在从8 位到64 位单片机以及DSP 等超过40 种不同构架的微处理器上实现运行。
本文主要介绍μC/OS-II在Samsung 公司的一款ARM7TDMI 的嵌入式处理器S3C44B0X 上移植应用。
要实现μC/OS-II在S3C44B0X 的构建、裁剪和移植,需要有S3C44B0X 的编译器,本文采用的是英蓓特公司推出的EmbestIDE for ARM 编译器。
2 μC/OS-II在S3C44B0X 上移植的可行性分析所谓移植,就是使一个实时内核能在某个微处理器或微控制器上运行。
要使μC/OS-II能够正常运行,处理器必须满足以下几个条件:(1)处理器的C 编译器能产生可重人代码;(2)在程序中可以打开或者关闭中断;(3)处理器支持中断,并且能产生定时中断(通常在l0~l000Hz 之间);。
ARM原理与应用报告一、设计内容1.用ADS1.2 IDE软件进行程序代码编译设计,生成可执行的输出文件,并显示运行结果,实现uC/OS-II 内核在ARM处理器上移植。
2.uC/OS-II 在ARM 微处理器上的移植及编译。
二、设计目的与要求目的:ARM原理与应用课程设计是学生理论联系实际的重要实践教学环节,是对学生进行的一次专业训练,也是对学生掌握和应用嵌入式系统相关知识能力的有效测试。
通过ARM原理与应用课程设计,使学生初步了解嵌入式系统软件开发的一般过程和基本设计方法,使学生进一步巩固和加深所学的专业理论知识,培养学生文献查阅、报告撰写等基本技能;培养学生独立分析和解决工程实际问题的能力;培养学生的团队协作精神、创新意识、严肃认真的治学态度和严谨求实的工作作风。
要求:1) 了解uC/OS-II 内核的主要结构。
2) 掌握将uC/OS-II 内核移植到ARM 处理器上的基本方法。
3)在给定的设备(UP-TECH PXA270-S嵌入式开发平台、PC 机、WinXP、ADS1.2 集成开发环境、仿真器驱动程序、超级终端通讯程序)上加以实验,学会自己分析、找出解决问题的方法。
4)对设计中遇到的问题和困难,独立思考,查阅资料,分析、观察、判断、试验、再判断以寻找答案。
5)分析结果,写出设计总结报告论述自己的观点,并应将参考资料列在报告后面以备查询。
内容尽量翔实(如上机过程、环境搭建),其中必须有按自己所理解、用自己的语言所描述的内容。
三、设计环境或器材、原理与说明环境:硬件:PC机,博创UP-TECHPXA27-S目标板ARM7TDMI微处理器,串口线,并口JTAG 转换线;软件:MS.Virtual.PC.2004,Windows XP系统,ADS1.2 IDE编译环境,LPC2000 Flash Utility 烧写程序、超级终端通讯程序.原理与说明:1.《ARM原理与应用》课程设计题目涉及ARM应用的诸多方面,须经过思考和认真的学习,有一定难度,在深度方面主要要求学生对具体ARM指令的分析理解,目标板ARM处理器的硬件认识了解,ADS1.2 IDE软件的操作能力,解读uC/OS-II 内核的自学能力以及自我解决问题的能力。
uc/os-II在ARM7上的移植代码(含详细注释)本人现在正在看有关UCoseII的操作系统的内容,这篇文章主要介绍了在S3C44B0上移植的关键代码,含有详细注解,感觉还蛮不错,详细会对大家有所帮助!1 R TOS简介随着电子产品和设备的应用的复杂化和智能化,原来在电子产品中占统治地位的单片机和较简单的程序结构已经难以满足要求。
加之微处理器芯片本身性能的大幅提高,对软件的要求也随之提高,而实时操作系统(Real Time Operation System,以下简称为R TOS)很好满足了这些需求。
RTOS以其较好的实时性、较少的硬件资源以及强大的任务管理、资源管理等功能,在嵌入式产品的应用领域日趋广阔。
RTOS同时体现了一种新的系统设计思想和开放的软件开发框架,开发者在无需过多考虑和更改系统其他任务的情况下可以集中精力设计应用任务模块,缩短了研发周期和对单个开发者的依赖。
因此RTOS的应用是嵌入式软件设计编写中从小规模设计到团队开发的一个必然选择。
µC/OS-II(MicroC/OS-II)是一个可以基于ROM运行的、源码开放的、可裁减的、抢占式实时多任务内核,内核的设计者在编写时尽最大限度采用ANSI C语言,并充分考虑了可移植性,因此,µC/OS-II已经移植到数十种处理器上,且已成功应用于从消费电子产品到航空设备的领域中。
2 ARM7系列处理器简介依靠ARM公司提供的优秀的ARM7 内核,其合作伙伴根据市场需要和技术发展趋势生产出各具特色的芯片。
ARM7 系列处理器可具有16位/32位双RISC指令集、片内高速cache、三级流水线、片上JTAG调试、高速内存管理(MMU)等功能,支持大多数操作系统,在中低端16/32位嵌入式产品解决方案中应用十分广泛。
比较有代表性的S3C44B0x是三星公司开发的基于ARM7 内核的32位微处理器,除了具备ARM7系列处理器的低功耗,高性能,小体积等优点外,且价格低廉。
ARM7系列处理器结构支持7种处理模式,方便用户管理某些需要保护的硬件资源,处理器模式见表1。
除用户模式外,其他模式均可自由的访问系统所有资源并改变处理器工作模式,称为特权模式,而特权模式中除系统模式(sys)外,也被称为异常模式。
在用户模式下,用户任务可以通过软中断指令,进入异常模式,来访问需要的资源。
µC/OS-Ⅱ移植与ARM7 处理器上时,一个难点就在于处理器模式切换时对另一工作模式下现场的保存和恢复,本文分析了任务切换时不使用软中断而直接在svc模式下运行操作系统和用户任务的移植方法,可以较简洁易懂地实现。
表1 ARM7 处理器模式处理器模式说明用户usr 正常用户程序执行模式快速中断fiq 高速数据传送及DMA通道处理模式通用中断irq 通用中断处理模式管理svc 操作系统保护模式中止abt 存储器保护或实现虚拟存储器未定义und 支持硬件协处理器的软件仿真系统sys 供需访问系统资源的任务使用3 µC/OS-Ⅱ在ARM7处理器上的移植3.1 移植的要求要使µC/OS-Ⅱ正常运行于某处理器上,须满足以下要求:1)处理器的C编译器能产生可重入代码;2)可以在C语言代码中打开和关闭中断;3)处理器支持中断,并且能产生定时中断(通常在10至100Hz之间);4)处理器支持能够容纳一定量数据(可能是几千字节)的硬件堆栈;5)处理器有将堆栈指针和其它CPU寄存器读出和存储到堆栈或内存中的指令。
笔者针对目前应用较广泛的基于ARM7内核的S3C44B0x处理器,在ARM公司的IDE开发环境ADS1.2中完成了µC/OS-Ⅱ的移植,并编写了应用任务实现多任务的调度。
3.2 移植过程基于µC/OS-Ⅱ的硬/软件体系结构如下图1。
图1 µC/OS-Ⅱ硬件/软件体系结构µC/OS-Ⅱ的移植集中在OS_CPU.h,OS_CPU_A.s,OS_CPU.c这三个文件上,下面分别详细介绍三个文件中的函数和需要修改或者编写的代码。
3.2.1 OS_CPU.h的移植该文件定义了和处理器及编译器相关的定义及一些全局函数声明。
由于ARM7 处理器字长为32位,半字长为16位,字节为8位,因此在OS_CPU.h文件修改与编译器相关的定义如下:typedef unsigned char BOOLEAN;typedef unsigned char INT8U;typedef signed char INT8S;typedef unsigned short INT16U; /*某些编译器中int是32位的,故统一用short表示*/typedef signed short INT16S;typedef unsigned long INT32U;typedef signed long INT32S;typedef float FP32;typedef double FP64;typedef unsigned long OS_STK; /*堆栈宽度为32位,即ARM7种的字对齐方式*//*下面是与处理器相关的代码*/#define OS_CRITICAL_METHOD 2 /*使用方式2保护临界代码*/#define OS_ENTER_CRITICAL() ARMDisableInt() /*临界段代码保护宏定义*/#define OS_EXIT_CRITICAL() ARMEnableInt()#define OS_STK_GROWTH 1 /*定义堆栈生长方向为向下生长*/#define OS_TASK_SW OSCtxSw /*宏定义,用于非中断级的任务切换*//*下面开始声明全局函数声明,均是OS_CPU_A.S中需要编写的函数*/extern void OSCtxSw(void); /*声明任务级任务切换函数*/extern void OSIntCtxSw(void); /*声明中断级任务切换函数*/extern void ARMDisableInt(void); /*声明中断禁止函数*/extern void ARMEnableInt(void); /*声明中断恢复函数*/extern void OSTickISR(void); /*声明时钟中断服务函数*/3.2.2 OS_CPU_C.C文件移植OS_CPU_C.C文件时,需要编写的是任务堆栈初始化函数OSTaskStkInit和时钟节拍中断服务钩子函数OSTimeTickHook。
在µC/OS-II中,每一个任务都有自己的任务堆栈,当发生任务切换或者中断时,其CPU使用权被剥脱,为了任务能被再次运行,那么这个被打断的任务所用到的处理器的寄存器内容均应得到保存,按照ARM7 处理器的压栈和入栈指令的特点,设计任务堆栈如下图2:CPSRR0R1……R12LR(R14)PC(R15)图2 任务堆栈的结构根据任务堆栈结构示意图,OS_STK函数编写如下:#define SVCMODE 0x13 /*定义svc模式的命令字,用户任务运行在svc模式下*/OS_STK * OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt){OS_STK *stk; /*定义堆栈指针*/opt = opt;stk = (OS_STK) ptos; /*保存任务堆栈栈顶指针*/*--stk = (OS_STK) task; /* 用来保存PC,初始化成任务入口地址在被保护存现场的则是该任务运行时被中断时的地址*/*--stk = (OS_STK) 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 = (INT32U) pdata; /* 在ARM的编译建议中,r0用于参数传递*/*--stk = (SVC32MODE|0x40); /*用来保存CPSR,并禁止FIQ,由于任务和操作系统均运行在svc模式,被中断到其他模式再返回后仍然回到svc模式,故SPSR没有用到*/return ((OS_STK *)stk); /*返回任务堆栈的指针*/}说明:用户创建任务时,OSTaskCreat()会调用OSTaskStkInit函数初始化该任务的堆栈,并把返回的堆栈指针保存到该任务的TCB结构中的最前面的参数OSTCBStkPtr中,当该任务要被恢复时,任务切换函数从其TCB块中取得其任务堆栈指针,依次将堆栈内容弹到处理器对应的CPSR、r0,r1,…,r12,lr,pc 的寄存器中,完成现场的恢复和程序指针PC的返回。
另一个需要编写的函数是OSTimeTickHook,该函数被时钟节拍中断服务函数OSTickISR中的OSTimeTick 函数调用,用来清除时钟节拍中断发生设备的请求。
本移植方案使用S3C44B0X处理器的R TC模块的tick 中断作为时钟节拍中断,该函数编写如下:void OSTimeTickHook(void){rI_ISPC =((INT32U)0x01) << 20;/*清R TC模块的tick中断*/}注意:用户也可不修改此函数,但是必须在OSTickISR中执行清除发生节拍中断的设备的中断请求标志,为便于说明,本文将利用内核提供给用户的OSTimeTickHook函数来完成清中断的任务。
另外几个hook函数不必去改它们。
至此,OS_CPU.C编写完成。
3.2.3 OS_CPU_A.S文件的移植该文件是移植过程中唯一需要用汇编语言来实现的文件,也是移植的重点和难点所在。
在这个文件里,需要编写的函数有OSStartHighRdy,OSCtxSW,OSIntCtxSW,OSTickISR,ARMDisableInt,ARMEnableInt 几个。
下面先结合us/os的任务切换的过程分析一下这几个函数的作用。
1)OSStartHighRdy()函数当程序执行内核的OSStart函数时,表示多任务系统开始启动, OSStart函数将调用OSStartHighRdy函数从最高优先级任务的TCB块中获得该任务的堆栈指针,通过该指针,依次从该任务的任务堆栈中恢复CPU 的现场。