新闻中心

EEPW首页>嵌入式系统>设计应用> 基于μC/OS-Ⅱ在ARM7上移植方法的探讨与实现

基于μC/OS-Ⅱ在ARM7上移植方法的探讨与实现

作者: 时间:2012-11-30 来源:网络 收藏

  includes.h 系统头文件,整个实时系统程序所需要的文件,包括了内核和用户的头文件,这样使得用户项目中的每个.c文件不用分别去考虑他实际上需要哪些头文件。

  3.2 与处理器相关的代码

  这是移植中最关键的部分。内核将应用系统和底层硬件有机地结合成一个实时系统,要使同一个内核能适用于不同的硬件体系,就需要在内核和硬件之间有一个中间层,这就是与处理器相关的代码,处理器不同,这部分代码也不同,我们在移植时需要自己处理这部分代码,在μc/os中这一部分代码分成3个文件:os_cpu.h,os_cpu_a.asm,os_cpu_c.c。

  3.2.1 os_cpu.h

  包含了用#define定义的与处理器相关的常量、宏和类型定义,具体有系统数据类型定义、栈增长方向定义、关中断和开中断定义、系统软中断的定义等。

  (1)不依赖于编译的数据类型

  μc/os-ⅱ不使用c语言中的short,int和long等数据类型的定义,因为他们与处理器类型有关,隐含着不可移植性,代之以移植性强的整数数据类型,这样,既直观又可移植。根据ads编译器的特性,代码为:

  typedef unsigned char boolean;

  typedef unsigned char int8u;

  typedef signed char int8s;

  typedef unsigned short int16u;

  typedef signed short int16s;

  typedef unsigned int int32u;

  typedef signed int int32s;

  typedef float fp32;

  typedef double fp64;

  typedef int32u os_stk;

  (2)使用软中断swi做底层接口

  因为带t变量的arm7处理器核具有两个指令集,用户任务可以使用两种处理器模式,为了使底层接口函数与处理器状态无关,同时在任务调用相应函数时不需要知道该函数位置,本例使用软中断指令swi作为底层接口,使用不同的功能号区分不同的函数,其swi服务函数代码为:


  (3)os_stk_growth

  μc/os-ⅱ使用结构常量os_stk_growth指定堆栈的生长方式,其代码为:

  #define os_stk_growth 1

  3.2.2 os_cpu_c.c

  包含了与移植有关的c函数,包括堆栈的初始化和一些钩子函数的实现,但是最重要的是ostaskstkinit()函数,该函数是在用户建立任务时系统内部自己调用的,用来对用户任务的堆栈初始化。在arm7体系结构下,任务堆栈空间由高至低递减,依次保存着pc,lr,r12,…,r1,r0,cpsr的初始化堆栈结构,当用户初始化了堆栈,ostaskstkinit()就返回新的堆栈指针stk所指的定地址。ostaskcreate()和ostaskcreateext()会获得该地址并将他保存到任务控制块tcb中,其他的几个钩子函数必须声明,但可以不包含任务代码,这些钩子函数在本移植中全为空函数。

  3.2.3 os_cpu_a.s

  μc/os-ⅱ移植的绝大部分工作都集中在os_cpu_a.s文件的移植上,在这个文件里,最困难的工作又集中体现在osintctxsw和ostickisr这两个函数的实现上。这是因为这两个函数的实现是和移植者的移植思路以及相关硬件定时器、中断寄存器的设置有关,在实际的移植工作中,这两个地方也是比较容易出错的地方,这部分需要对处理器的寄存器进行操作,所以必须用汇编语言编写,包括4个子函数:osstarthighrdy()、osctxsw()、osintctxsw()、ostickisr()。



评论


相关推荐

技术专区

关闭