μ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须初始化为任务的入口地址值,这样才能在任务切换时跳转到正确的地方开始执行。此函数可以用以下代码来实现

 

 

 

 





  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指令产生中断的中断服务程序,其源代码如下

 

 

 

 

 

 

继续阅读
智慧屏中亮相的鸿蒙系统移植到手机中,究竟有多大困难?

缺失的安卓系统能否完成华为的任务?事实告诉我们,缺失了谷歌相关授权服务的安卓系统,华为手机在海外市场的销售遭遇到了一定的困难。尤其从Mate 30开始,表现出来的影响更大。海外用户虽然对Mate 30手机情有独钟,但却因为缺失了谷歌相关服务的原因,只能望机兴叹,推迟入手计划。为什么会出现这样的情景呢?主要还是因为谷歌GMS服务在欧洲等地区的用户量巨大,而且用户粘性很大,邮件、搜索、支付、地图等等无一不是谷歌的天下,移动手机系统中,目前也只有苹果公司的iOS可以与其相抗衡。

ST成立嵌入式系统联合实验室 32位MCU成主导

微控制器设计开发的领导厂商意法半导体协同其增值服务商深圳市博巨兴,宣布与厦门大学签订合作协议,成立“ST嵌入式系统联合实验室”,并举行实验室揭牌仪式。意法半导体持续推动校园合作计划,与中国的大学携手开发嵌入式应用技术和培训电子工程专业学生,再迈出重要的一步。

STM32-FSMC机制的NOR Flash存储器扩展技术

Cortex-M3内核降低了系统存储要求,同时快速的中断处理能够满足控制领域的高实时性要求,使基于该内核设计的STM32系列微控制器能够以更优越的性价比,面向更广泛的应用领域。

STM32处理器存储空间布局结构说明

IROM1为片上程序存储器,即片上集成的Flash存储器,对该处理器Flash大小为256KB,即0x40000 IRAM1为片上数据存储器,即片上集成的SRAM存储器,对该处理器Flash大小为48KB,即0xC000 片上SRAM的起始地址是0x20000000,这是由Cortex-M3内核决定的

ARM宣布对DesignStart升级,Cortex-M0/M3处理器免预付授权费

ARM今天宣布对其DesignStart项目进行升级,加入ARM Cortex-M3处理器及相关IP子系统,帮助开发者以更简单、更快速、更低风险的途径实现定制化SoC。自2010年起,ARM DesignStart提供给用户快速获得ARM IP的途径。两年前,ARM宣布通过DesignStart项目开放Cortex-M0系统,这也开启了新的一波超高能效定制化SoC的开发热潮。