微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于μC/OS-Ⅱ在ARM7上移植方法的探讨与实现

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

时间:11-30 来源:互联网 点击:
  随着嵌入式技术的快速发展,实时多任务操作系统作为一种软件平台已逐步成为国际嵌入式系统的主流,目前世界上已经有一大批成熟的实时嵌入式操作系统。

  通常,对嵌入式软件的基本要求是体积小、指令速度快、具有较好的裁减性和可移植性,目前,实时操作系统很多,如vxworks,windows ce,psos,qnx,lynxos等,这些操作系统都具有高可靠性、强实时性等特点,但他们都是商业操作系统,价格昂贵,人们往往很难接受,μc/os-ⅱ操作系统的出现是对这些商业操作系统的一个很大的冲击。

  1 μc/os-ⅱ操作系统简介

  μc/os-ⅱ是源码公开的实时操作系统,是一个自由操作系统。程序开发人员可以改写源代码,使之符合自己的要求,裁减掉不需要的部分,使操作系统变得小巧、灵活、并且能满足用户特定操作系统的需要。为了提高系统的实时能力,μc/os-ⅱ可以将一个复杂的应用划分为多个相互独立的任务,并根据任务的重要性来分配优先级。任务的调度完全由μc/os-ⅱ的实时内核完成,主要包括任务的状态管理、选择最高优先级的任务、执行任务和撤销任务等,μc/os-ⅱ内核还负责cpu时间分配,cpu时间总是优先分配给中断事件,其次是任务队列中当前优先级最高的任务,不同任务间的通信可以通过μc/os-ⅱ提供的信号量、邮箱、信息队列等机制完成,他的绝大部分代码是用c语言编写的,可移植性强,因此1997年以后,在国际上逐渐被广泛采用。

  2 其软硬件体系及可移植性分析

  μc/os-ⅱ核心代码很小,程序开发人员要把他移植到自己的目标板中只需做少量的工作。图1是基于μc/os-ⅱ的嵌入式系统的软硬件体系结构。


  虽然μc/os-ⅱ大部分源代码是用c语言写的,但是完成和处理器有关的代码时,还是用汇编语言来实现的,由图1可以看出,μc/os-ⅱ的移植的主要工作是修改与处理器相关部分的代码,他们集中在3个文件中,其中,os_cpu.h包含与处理器相关的常量、宏和结构体的定义;os_cpu_c.c和os_cpu_asm中定义了用于底层的任务切换,退出中断服务程序,在cpu级屏蔽中断、打开中断、对任务栈初始化以及时钟的中断服务程序的函数等,为了使应用程序运行于μc/os-ⅱ上,还要相应地修改应用中使用的硬件和设备驱动。

  3 μc/os-ⅱ的移植工作

  3.1 与应用相关的代码

  这一部分是用户根据自己的应用系统来定制合适的内核服务功能,包括2个文件:os_cfg.h和includes.h。

  os_cfg.h 用来配置内核,用户根据需要对内核进行修改,留下需要的部分,去掉不需要的部分,比如系统可提供的最大任务数量,是否定制邮箱服务,是否提供优先级动态改变功能等等,所有的配置更改包括头文件的增减均在该文件中进行。

  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(

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top