浅谈μCOSII在Cortex-M3核的ARM处理器上的移植

发布者:数字冲浪最新更新时间:2012-01-16 关键字:μCOSII  Cortex-M3核  ARM处理器 手机看文章 扫描二维码
随时随地手机看文章

随着科学技术的发展,嵌入式技术已被广泛应用到汽车电子、无线通信、数码产品等各个领域。嵌入式操作系统及嵌入式处理器技术发展迅猛,嵌入式操作系统典型代表有μCOS—II、μClinux、Winclow CE、VxWorks等;嵌入式处理器包括ARM、MIPS、PowerPC等。

1 软硬件开发环境及处理器介绍

1.1 软件硬开发环境

本移植过程使用的软件环境是RealView MDK开发套件,此产品是ARM公司最新推出的针对各种嵌入式处理器的软件开发工具,该开发套件功能强大,包括了μVisiON3集成开发环境和RealView编译器。使用的硬件平台是深圳英蓓特公司推出的全功能评估板STMl03V100,其上所采用的处理器是ST意法半导体公司生产的32位哈佛结构ARM处理器STM32F103VBT6,该处理器内置ARM公司最新的Cortex—M3核,并且具有非常丰富的片上资源。

1.2 关于基于Cortex-M3的ARM处理器的介绍

基于Cortex—M3核的ARM处理器支持两种模式,分别称为线程模式和处理模式。程序可以在系统复位时或中断返回时两种情况下进入线程模式,而处理模式只能通过中断或异常的方式来进入。处于线程模式中代码可以分别运行在特权方式下和非特权方式下。处于处理模式中的代码总是运行在特权方式下。运行在特权方式下的代码对系统资源具有完全访问权,而运行在非特权方式下的代码对系统资源的访问权受到一定限制。处理器可以运行在Thumb状态或Debug状态。在指令流正常执行期间,处理器处于Thumb状态。当进行程序调试时,指令流可以暂停执行,这时处理器处于Debug状态。处理器有两个独立的堆栈指针,分别称为MSP和PSP。系统复位时总是处于线程模式的特权方式下,并且默认使用的堆栈指针是MSP。本移植过程中假设任务总是运行在线程模式的特权方式下且总是使用堆栈指针PSP。

2 移植过程详解

2.1 μCOS-II内核介绍

μCOS—II是一个实时可剥夺型操作系统内核,该操作系统支持最多64个任务,但每个任务的优先级必须互不相同,优先级号小的任务比优先级号大的任务具有更高的优先级,并且该操作系统总是调度优先级最高的就绪态任务运行。此内核的代码是美国人Jean J.Labrosse用C语言编写的,具有很好的可移植性,其2.52版本通过了美国航天航空管理局的安全认证,可靠性非常高。文中所述的移植过程使用的就是该版本的源代码。

2.2 开始移植

μCOS—II v2.52的源代码按照移植要求分为需要修改部分和不需要修改部分。其中需要修改源代码的文件包括头文件OS_CPU.H、C语言文件OS_CPU.C以及汇编格式文件OS_CPU_A.ASM。

2.2.1 修改头文件OS_CPU.H

头文件OS_CPU.H中需要修改的内容有与编译器相关的数据类型重定义部分和与处理器相关的少量代码。由于本移植过程中使用的是RealView编译器,因此通过查阅此编译器的相关说明文档可以得到其所支持的基本数据类型,据此修改OS_CPU.H中与编译器相关的数据类型重定义部分。修改后代码如下所示:

其中定义的数据类型OS_STK指出了处理器堆栈中的数据是32位的,OS_CPU_SR指出了处理器状态寄存器字长也为32位。

头文件中与处理器相关部分代码包括临界区访问处理、处理器堆栈增长方向及任务切换宏定义。临界区代码访问涉及到全局中断开关指令,由文献可以得知关中断和开中断可以分别由指令CPSID i和CPSIE i实现,文中临界段访问处理如下:

其中INT_DIS()和INT_EN()分别对应关中断和开中断处理过程。

根据文献可知文中所使用的处理器支持的堆栈为满递减方式,即堆栈的增长方向是从内存高地址向低地址方向递减并且堆栈指针总是指向栈顶的数据。在头文件OS_CPU.H中相应代码只须修改一条,如下所示

#define OS_STK_GROWTH1

此定义中的1代表堆栈方向是向下递减的。

头文件OS_CPU.H中最后一个要修改的地方是任务切换宏定义,μCOS—II内核就是通过这个宏调用来触发任务级的任务切换。任务切换一般是通过陷阱或软件中断来实现的,在基于Cortex—M3核的处理器中支持一条称为超级用户调用的指令SVC,此指令是ARM软件中断指令SWI的升级版。此处的宏定义代码修改为如下形式

#define OS_TASK_SW()OS_SVC()

其中OS_SVC()之中包含了SVC指令,它可以由嵌入汇编的方式在C语言代码中进行定义,如下所示

_asm void OS_SVC(void){SVCOx00}

以上代码以嵌入汇编的方式定义了一个输入参数和返回值都为空的C语言函数,嵌入汇编的格式在RealView编译器的说明文档中有详细的说明。

2.2.2 修改C语言文件OS_CPU.C

根据文献可知文件OS_CPU.C中有10个C语言函数需要编写,这些函数中唯一必要的函数是OSTaskStkInit,其他9个函数必须声明,但不一定要包含任何代码。为了简洁起见,本移植过程只编写了OSTaskStkInit,此函数的作用是把任务堆栈初始化成好像刚发生过中断一样。要初始化堆栈首先必须了解微处理器在中断发生前后的堆栈结构,根据文献易知微处理器在中断发生前后的堆栈结构,并且可知寄存器xPSR、PC、LR、R12、R3、R2、R1、RO是中断时由硬件自动保存的。初始化时需要注意的地方是xPSR、PC和LR的初值,对于其他寄存器的初值没有特别的要求。xPSR比特位是Thumb状态位,初始化时须置1,否则执行代码时会引起一个称为Invstate的异常,这是因为内置Cortex—M3核的微处理器只支持Thumb和Thumb2指令集。堆栈中PC和LR须初始化为任务的入口地址值,这样才能在任务切换时跳转到正确的地方开始执行。此函数可以用以下代码来实现: [page]

2.2.3 修改汇编语言文件OS_CPU_A.ASM

汇编文件OS_CPU_A.ASM中需要编写的函数分别为OSStartHighRdy、OSCtxSw、OSIntCtxSw和OSTickISR。第一个函数的作用是启动多任务调度,此函数只在操作系统开始调度任务前执行一次,以后不再调用。按照文献中所述须将堆栈中的寄存器依次弹出,然后执行一条中断返回指令来开始第一个用户任务的调度。但基于Cortex—M3核的ARM处理器在执行中断返回指令时必须处于处理模式下,否则将会引起内存访问异常。当系统上电启动时或程序重置后,处理器会进入线程模式,而要在函数OSStartHighRdy中执行中断返回指令就首先需要进行模式转换,进入处理模式,而进行同步可控制模式转换的途径是超级用户调用,即通过SVC指令产生软件中断可转换到处理模式。实际上考虑到此函数只在启动多任务调度开始前被调用一次,并且第一次调度任务运行时任务堆栈中除了xPSR、PC和LR的初值以外,其他寄存器的初值无关紧要。因此可以简化该函数的编写,只须从第一个任务的堆栈中取出该任务的首地址,然后修改堆栈指针使其指向任务堆栈中内存地址最高处,即相当于抛弃任务堆栈中所有数据,最后根据取出的地址直接跳转到任务入口地址处开始执行。这样可以免去软件中断和模式切换,从而简化了对此函数的编写。需要说明的是在抛弃任务堆栈中所用数据的同时也将xPSR的初值抛弃了,但这并不影响第一个任务投人运行,因为在跳转到第一个任务运行之前,指令流是在Thumb状态下正常执行的,xPSR已经有了确定的值。此函数代码如下所示:

BX r0;直接跳转到第一个任务的入口地址

第二个汇编语言函数OSCtxSw是任务级的任务切换函数。若在任务执行过程中有一个比当前任务优先级更高的任务进入就绪态,μCOS—II内核就会启动OSCtxSw进行任务切换。该函数会保存当前任务状态,然后恢复那个优先级更高的任务状态,使之投入运行。前述的宏定义#defineOS_TASK_SW()OS_SVC()中的OS_SVC()包含了SVC软件中断指令,此中断的中断向量应该设为函数OSCtxSw的入口地址,即OSCtxSw是SVC指令产生中断的中断服务程序,其源代码如下:

由于微处理器在进入中断时按堆栈增长方向自动顺序保存了如下8个寄存器:xPSR、PC、LR、R12、R3、R2、R1、R0,因此在程序中只须保存另外8个寄存器,保存顺序可以随意,但注意弹栈时要按照先进后出的方式进行。按照本文开头的假定,任务总是运行在线程模式的特权方式下且总是使用堆栈指针PSP。而中断产生后,中断服务程序将处于处理模式下,并且默认使用的堆栈指针是MSP。因此在保存堆栈指针的时候需要保存的是当前任务的PSP。中断返回前新任务的堆栈指针需要恢复到PSP中。中断返回使用如下指令

MOVrO,#Oxfffffffd

BXr0

其中立即数#0xfffffffd包含了返回信息,用这两条指令可以使中断返回时使用任务堆栈指针PSP,返回后任务处于线程模式且使用任务堆栈指针PSP。

第三个汇编语言函数OSIntCtxSw与OSCtxSw类似。若任务执行过程中产生了中断,且中断服务程序使得一个比当前被中断的任务具有更高优先级的任务就绪时,μCOS—II内核就会在中断返回之前调用函数OSIntCtxSw。在此函数中不需要像任务级任务切换函数那样保存当前任务状态,因为当前任务已经被中断,在进入中断服务程序的时候任务状态已被保存。其源代码与函数OSctxSw中保存当前任务堆栈PSP指令以后部分相同,此处不再列出。

第4个汇编语言函数OSTickISR是系统时钟节拍的中断服务函数。处理器STM32F103VBT6中有一个专用系统时钟节拍定时器SysTick,本移植过程使用此定时器产生每100 ms一次的时钟节拍中断。此函数源代码如下:

3 程序开发模式讨论

传统应用程序开发模式称为超循环模式,即通常主程序是由C语言中的for语句或while语句构成的一个无限循环,程序在此循环中检测事件的发生,从而转向不同的任务。这种程序开发模式有两个主要的不足之处。首先从程序维护和可靠性的角度来看,所有任务都需要程序开发人员来进行全局性的维护,当系统变得庞大和复杂时,任务的维护会变得非常麻烦,同时程序的可靠性也受到影响。其次,从任务级响应时间来看,这个时间是不确定的,因为程序在循环体中检测事件发生的位置是固定的,但事件的发生是随机的,因此从事件发生到程序检测到事件发生这段时间也是不确定的。

 

 

关键字:μCOSII  Cortex-M3核  ARM处理器 引用地址:浅谈μCOSII在Cortex-M3核的ARM处理器上的移植

上一篇:基于凌阳SPCE061A的嵌入式应用系统设计
下一篇:用CPLD创建具有弹性指令集的微控制器

推荐阅读最新更新时间:2024-03-16 12:51

嵌入式Linux下ARM处理器与DSP的数据通信
摘要:本文通过一个开发实例详细说明如何通过DSP的HPI接口与运行Linux操作系统的ARM架构处理器进行数据通信。给出接口部分的实际电路和ARM-Linux下驱动程序的开发过程。 关键词:设备驱动程序 嵌入式Linux HPI ARM DSP 1 引言 基于ARM核心处理器的嵌入式系统以其自身资源丰富、功耗低、价格低廉、支持厂商众多的缘故,越来越多地应用在各种需要复杂控制和通信功能的嵌入式系统中。 内核源码开放的Linux与ARM体系处理器相结合,可以发挥Linux系统支持各种协议及存在多进程调度机制的优点,从而使开发周期缩短,扩展性增强。作为数字处理专用电路,DSP的数字信号处理能力十分强大,但对诸如任务管理、通信、
[工业控制]
移植嵌入式Linux到ARM处理器S3C2410:设备驱动
设备驱动程序是操作系统内核和机器硬件之间的接口,它为应用程序屏蔽硬件的细节,一般来说,Linux的设备驱动程序需要完成如下功能:   ·设备初始化、释放;   ·提供各类设备服务;   ·负责内核和设备之间的数据交换;   ·检测和处理设备工作过程中出现的错误。   Linux下的设备驱动程序被组织为一组完成不同任务的函数的集合,通过这些函数使得Windows的设备操作犹如文件一般。在应用程序看来,硬件设备只是一个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作,如open ()、close ()、read ()、write () 等。   Linux主要将设备分为二类:字符设备和块设备。字符设备是指设备发送和接收数据以
[单片机]
移植嵌入式Linux到<font color='red'>ARM处理器</font>S3C2410:设备驱动
ARM处理器7种工作模式
一、ARM处理器7种工作模式(特权模式 特权模式异常模式) 用户模式(USR):正常程序执行模式,不能直接切换到其他模式 系统模式(SYS):运行操作系统的特权任务,与用户模式类似,但具有可以直接切换到其他模式等特权 快中断模式(FIQ):支持高速数据传输及通道处理,FIQ异常响应时进入此模式 中断模式(IRQ):用于通用中断处理,IRQ异常响应时进入此模式 管理模式(SVC):操作系统保护模式,系统复位和软件中断响应时进入此模式(由系统调用执行软中断SWI命令触发) 中止模式(ABT):用于支持虚拟内存和/或存储器保护,在ARM7TDMI没有大用处 未定义模式(UND):支持硬件协处理器的软件仿真,未定义指令异常响
[单片机]
基于ARM处理器S3C2440的VGA显示技术
目前很多SOC厂商的微处理器芯片都集成了LCD控制器,如三星公司的S3C2410。S3C2440,Intel的Xscale系列等。大多数嵌入式系统也采用流行的LCD显示技术。但是在需要大屏幕显示、对分辨率要求不高的场合,如车间、厂房,采用大屏幕LCD则成本过高。另一方面,VGA显示技术因为技术发展成熟,成本低廉,仍在被大量使用,直到今天它仍是所有显示终端最为成熟的标准接口。如果让嵌入式处理器直接支持VGA显示器,则能很大地利用现有资源,节约系统成本。 1 基于S3C2440的VGA显示技术分析 通过分析VGA显示技术的时序逻辑与S3C2440内部集成LCD控制器驱动TFT LCD的时序逻辑,找出它们的共同点,分析在S3C24
[单片机]
基于<font color='red'>ARM处理器</font>S3C2440的VGA显示技术
基于ARM处理器LPC2142的高速数据采集卡设计
0 引言 在瞬态信号测量和图像处理等一些高速、高精度的测量中,往往都需要进行高速数据采集。现在通用的高速数据采集卡(一般多是PCI卡或ISA卡)存在有安装麻烦、价格昂贵、受计算机插槽数量/地址/中断资源的限制、可扩展性差,而且在一些电磁干扰性强的测试现场无法专门对其进行电磁屏蔽,因而会导致采集的数据失真等缺点。为此,本文给出了采用PHILIPS公司的一款LPC2142芯片(基于ARM7内核,内置了宽范围的USB2.0 Device全速串行通信接口)设计的数据采集卡的设计方案,从而有效解决了传统高速数据采集卡的上述缺陷。 1 基于ARM的数据采集卡系统结构 该系统主要由双通道模/数转换器AD9238、ARM微控制器LPC214
[工业控制]
基于Android的ARM汇编语言系列之四:ARM处理器的寻址方式
章节列表 之一:ARM汇编语言开篇 之二:C/C++程序生成ARM汇编程序的过程分析 之三:ARM汇编语言程序结构 之四:ARM处理器的寻址方式 之五:ARM指令集与Thumb指令集 之六:NEON指令集与VFP指令集 处理器的寻址方式是通过指令给出的地址码字段来寻找真实操作数地址的方式,ARM处理器支持9中寻址方式。 一 立即寻址 立即寻址指令后面的地址码部分为立即数(常量或常数),立即寻址多用于给寄存器赋值。 举例 MOV RO, #1234 指令执行后,R0=1234。 二 寄存器寻址 寄存器寻址中,操作数在寄存器中,指令执行时直接从寄存器中取值进行操作。 举例 MOV R0, R1 指令执行后
[单片机]
ARM处理器体系结构简要总结
  搞arm两个月了,有点收获,就谈它了。本文主要介绍ARM7系列处理器。呵呵,不是相关专业可能有很多人不知道arm是个什么东西吧,我现在简要介绍一下各种处理器分类,目前我们的处理器阵营中分为CISC和RISC两大系列,CISC是复杂指令集处理器,这种处理器每条指令可以执行比较多的复杂操作,而且指令长度不定,我知道的有X86处理器是CISC处理器,目前intel和amd出的处理器主要都是x86处理器,intel的x86从8086开始到80186,283,386,486,Pemtium,pentium pro,pentium 2,pentium 3,pentium 4,扣肉2,四核志强等,还有赛扬,pentium M,pentium
[单片机]
嵌入式开发之ARM处理器的选择问题
很多嵌入式初学者都希望有一套自己能用的系统,但他们往往会产生一种错误认识,就是认为处理器版本越高越好,性能越高越好,就象很多人认为ARM9比ARM7好, 我想对于初学者在此方面以此入门还应该理智,开发系统的选择最终要看自己往嵌入式系统的哪个方向上走,是做驱动开发还是应用,还是做嵌入式系统硬件层设计与板级测试。如果想从操作系统层面或应用层面上走,不管是驱动还是应用,当然处理器性能越高越好了,但这个东西自学,有十分大的困难,不是几个月或半年或是一年二年能搞定的事。 在某种意义上讲,ARM7与ARM9的差别就是在某些功能指令集上丰富了些,主频提高一些而已,就比如286 和386。对于用户来讲可能觉察不到什么,只能是感觉速度有些快而已
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved