嵌入式实时操作系统 μC/OS-II 在S12 单片机上的移植
摘要:本文介绍嵌入式实时操作系μC/OS-II 在飞思卡尔16 位单片机MC9S12DG128 上的移植过程。首先对MC9S12DG128 的体系结构和存储器组织进行了分析,然后详细论述
本文引用地址:http://www.amcfsurvey.com/article/148561.htm了μC/OS-II 移植过程中的难点和关键问题,最终实现了移植过程。对移植结果进行了测试实验,并验证了移植代码的正确性。
1 引言
在采用前后台系统软件设计模式的嵌入式系统中,主程序是一个无限循环,单任务顺序执行,通过设置一个或多个中断来处理异步事件。这种系统对于简单的应用是可以
的,但对于实时性要求比较高的、处理任务较多的应用,就会暴露出实时性差、系统可靠性低、稳定性差等缺点。μC/OS-II 是一个源代码公开、可移植、可裁剪的实时多任
务操作系统,具有低成本、稳定可靠、实时性好等优点,是专门针对微处理器和微控制器设计的实时内核,它的内核可以做到很小,很适合在单片机系统上移植。移植了μC/OS-II 的嵌入式系统可以使各个任务独立工作,互不干涉,很容易实现准时而且无误执行,使实时应用程序的设计和扩展变得容易,使应用程序的设计过程大为减化。本
文选用飞思卡尔(Freescale)公司的16 位单片机MC9S12DG128 作为硬件平台,针对MC9S12DG128 的存储器组织和体系结构,对μC/OS-II 源代码作了相应的改写,最终实
现了μC/OS-II 操作系统在MC9S12DG128 上的移植。通过μC/OS-II 在MC9S12DG128 上的移植,可以掌握移植和测试μC/OS-II 的实质内容,同时也很容易将其移植到其它的CPU 平台上。
2 MC9S12DG128 的体系结构(存储器的组织)
作者认为深刻理解MC9S12DG128 微控制器的体系结构和存储器组织是移植成功的一个关键步骤。MC9S12DG128 是16 位的高性能单片机,它具有极低的电源功耗和可高达
25MHz 的内部总线频率,片内资源包括1KB 的内部寄存器、8KB RAM、128KB FLASH、2KBEEPROM。MC9S12DG128 采用普林斯顿总线结构,程序存储器、数据存储器和I/O 端口为统一编址方式,总的寻址空间为64 KB,但DG128 内部有128KB Flash,显然存储空间超过了S12MCU 可寻址的64KB 空间,因此引入了页面访问机制,S12CPU 在内存的$8000~$BFFF 这一段开了一个窗口,这里有8 个16KB 的页面(其中$3E 和$3F 有固定地址),可以通过页面寄存器(PPAGE)选择其中的一页。对于64KB 以外的存储区,应用专用指令CALL 调用子程序,然后通过RTC 指令返回。
微控制器内部不同的存储器占用不同的存储空间,也就是说,不同的地址范围,它们均占据特定的地址空间,这些存储器和内部集成模块的地址分配并不是固定不变的,用户自己可以重新分配,但建不要轻易改动默认的映射空间,应直接采用默认地址映射空间。图1 是MC9S12DGl28 复位后的内存空间分配情况。其中,地址$0000~$03FF 为1KB 寄存器空间; $0000~$1FFF 为8KB RAM(可见7KB);$0000~$07FF 为2KBEEPROM(不可见)。
图1 MC9S12DGl28 复位后的内存空间分布情况
可以通过设置INITRG,INITRM,INIteE 寄存器来重新分配各存储器的位置。这些寄存器只能写一次,建议在初始化时分配存储器的位置。如果映射出现地址重叠时,S12CPU 内部的优先级控制逻辑会自动屏蔽级别较低的资源,保留级别最高的资源。寄存器具有最高优先级,与其重叠的RAM 和EEPROM 此时无效。存储器的优先级如下表所列。
3 μC/OS-II 在MC9S12DG128 上的移植
μC/OS-II 运行时要占用一部分ROM 和RAM 空间,但μC/OS-II 操作系统内核目标代码最小可以裁剪到小于2KB,MC9S12DG128 有8KB 的RAM 存储器和128KB 的Flash 存
储器,所以μC/OS-II 操作系统完全可以移植并运行在MC9S12DG128 上。
μC/OS-II 的95%代码是由ANSI C 写成的,具有很好的移植性。要实现μC/OS-II向S12 的移植,主要是做两方面的工作,一是重新定义内核的大小和功能;二是为内核编写与硬件相关的代码。μC/OS-II 的文件结构如图2 所示。
图2 μC/OS-II 的文件结构
可以看到,μC/OS-II 与CPU 类型无关的C 代码文件包括很多文件,它们是μC/OS-II的内核和很多功能函数,其中OS_CORE.C、OS_TIME.C 和OS_TASK.C 这三个文件是一定要用的,其他几个文件用于任务间通信,应用程序中可能只用到其中的几个,不用的可以不包含进去,以避免编译时生成没有代码。这部分代码与CPU 类型无关,在移植时,这些文件一个也不要动。
与CPU 类型有关的代码文件主要有:OS_CFG.H、OS_CPU.H、OS_CPU_A.ASM 和OS_CPUC.C。OS_CFG.H 是配置文件,需要根据应用配置,主要作用是确定用户应用程序使用μC/OS-II 提供的哪些系统功能函数,这个文件移植时要修改。OS_CPU.H 文件定义用于特定CPU 的数据类型、定义相关的宏。OS_CPU_A.ASM 是用汇编语言写的硬件有关的代码,OS_CPUC.C 文件是用C 语言写的与硬件有关的代码。如果移植使用的C 交叉编译工具在C 代码中可以插入汇编语句,那么在移植中,可以将OS_CPU_A.ASM 合到S_CPUC.C文件中。
3.1 重新定义内核的大小和功能
公共头文件INCLUDES.H,这个文件会被所有的C 源程序引用。在本例中此文件的代码如下。
#include
#include
#include
#include
#include
#include
#include
前四个头文件是C 函数库、预定义的类型等,和移植没有关系,是否一定要加取决于所用的编译器。后三个头文件必须被引用,用户可以添加自己的头文件,但一定要放
在最后面。
需要根据应用修改的文件是OS_CFG.H,这个文件用于配置内核的属性。用于设置与微控制器CPU 核心相关的属性,包括各种数据类型对应的存储长度等等。OS_CPU.H 包括了用#define 语句定义的、与处理器相关的常数、宏及类型等。因为不同的处理器有不同的字长,所以μC/OS-II 的移植包括的一系列数据类型定义,以确保其可移植性。μC/OS-II 代码不使用语言中的short,int,及long 等数据类型,因为它们是与编译器相关的,是不可移植的。采用定义的整形数据结构等既是可移植的,又很直观。
linux操作系统文章专题:linux操作系统详解(linux不再难懂)
评论