欢迎来到天天文库
浏览记录
ID:38365849
大小:1.14 MB
页数:9页
时间:2019-06-11
《基于Cortex-M3核处理器的μCOSII移植》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、基于Cortex-M3核处理器的μCOSII移植D_K_BLUE/2009-07-09 众所周知,嵌入式系统的开发已经成为IT行业的新热点,在ARM系列处理器推动着硬件芯片飞速发展的同时,以uC/OS-Ⅱ为代表的实时操作系统也大大提高了嵌入式软件的开发效率和稳定性。嵌入式实时操作系统uC/OSII作为一个公开源代码的抢占式多任务的RTOS内核,其性能和安全性可以与商业产品竞争。自1992年的第一版(uC/OS)以来已经有好几百个应用,是一个经实践证明好用且稳定的内核。本文将基于ARM处理器来向大家阐述uC/OSII系统的移植过程。 一、 软硬件开发环境及处理器介绍 1、软件硬开发环境
2、 本移植过程使用的软件环境是RealViewMDK开发套件,此产品是ARM公司最新推出的针对各种嵌入式处理器的软件开发工具,该开发套件功能强大,包括了μVision3集成开发环境和RealView编译器。使用的硬件平台是深圳英蓓特公司推出的全功能评估板STMl03V100,其上所采用的处理器是ST意法半导体公司生产的32位哈佛结构ARM处理器STM32F103VBT6,该处理器内置ARM公司最新的Cortex-M3核,并且具有非常丰富的片上资源。 2、关于基于Cortex-M3的ARM处理器的介绍 基于Cortex-M3核的ARM处理器支持两种模式,分别称为线程模式和处理模式。程序可
3、以在系统复位时或中断返回时两种情况下进入线程模式,而处理模式只能通过中断或异常的方式来进入。处于线程模式中代码可以分别运行在特权方式下和非特权方式下。处于处理模式中的代码总是运行在特权方式下。运行在特权方式下的代码对系统资源具有完全访问权,而运行在非特权方式下的代码对系统资源的访问权受到一定限制。处理器可以运行在Thumb状态或Debug状态。在指令流正常执行期间,处理器处于Thumb状态。当进行程序调试时,指令流可以暂停执行,这时处理器处于Debug状态。处理器有两个独立的堆栈指针,分别称为MSP和PSP。系统复位时总是处于线程模式的特权方式下,并且默认使用的堆栈指针是MSP。本移植过程
4、中假设任务总是运行在线程模式的特权方式下且总是使用堆栈指针PSP。 二、 移植过程详解 1、μCOS-II内核介绍 μCOS-II是一个实时可剥夺型操作系统内核,该操作系统支持最多64个任务,但每个任务的优先级必须互不相同,优先级号小的任务比优先级号大的任务具有更高的优先级,并且该操作系统总是调度优先级最高的就绪态任务运行。此内核的代码是美国人JeanJ.Labrosse用C语言编写的,具有很好的可移植性,其2.52版本通过了美国航天航空管理局的安全认证,可靠性非常高。文中所述的移植过程使用的就是该版本的源代码。 2、开始移植 μCOS-IIv2.52的源代码按照移植要求分为需要
5、修改部分和不需要修改部分。其中需要修改源代码的文件包括头文件OS_CPU.H、C语言文件OS_CPU.C以及汇编格式文件OS_CPU_A.ASM。 (1)修改头文件OS_CPU.H 头文件OS_CPU.H中需要修改的内容有与编译器相关的数据类型重定义部分和与处理器相关的少量代码。由于本移植过程中使用的是RealView编译器,因此通过查阅此编译器的相关说明文档可以得到其所支持的基本数据类型,据此修改OS_CPU.H中与编译器相关的数据类型重定义部分。修改后代码如下所示: 其中定义的数据类型OS_STK指出了处理器堆栈中的数据是32位的,OS_CPU_SR指出了处理器状
6、态寄存器字长也为32位。 头文件中与处理器相关部分代码包括临界区访问处理、处理器堆栈增长方向及任务切换宏定义。临界区代码访问涉及到全局中断开关指令,由文献可以得知关中断和开中断可以分别由指令CPSIDi和CPSIEi实现,文中临界段访问处理如下: 其中INT_DIS()和INT_EN()分别对应关中断和开中断处理过程。 根据文献可知文中所使用的处理器支持的堆栈为满递减方式,即堆栈的增长方向是从内存高地址向低地址方向递减并且堆栈指针总是指向栈顶的数据。在头文件OS_CPU.H中相应代码只须修改一条,如下所示 #defineOS_STK_GROWTH1 此定义中的1代表
7、堆栈方向是向下递减的。 头文件OS_CPU.H中最后一个要修改的地方是任务切换宏定义,μCOS-II内核就是通过这个宏调用来触发任务级的任务切换。任务切换一般是通过陷阱或软件中断来实现的,在基于Cortex-M3核的处理器中支持一条称为超级用户调用的指令SVC,此指令是ARM软件中断指令SWI的升级版。此处的宏定义代码修改为如下形式 #defineOS_TASK_SW()OS_SVC() 其中OS_SVC()之中包
此文档下载收益归作者所有