在MC68HC908GP32上移植μC/OS-II

嵌入式系统 时间:2016-09-12来源:网络

在前几讲中,介绍了μC/OS-II 的概念、工作机制,还介绍了μC/OS-II在Intel 80X86CPU上的移植,相信读者通信学习,已经对移植的过程和步骤有了一定的了解。ΜC/OS-II最初是为摩托罗拉68HC11系列单片机设计的。 68HC11系列单片机有外部总线,可以外接RAM和ROM;而没有外部总线8位MCU。由于RAM容量的限制,移植就存在一定的困难;但对于有些8位的 MCU,将μC/OS-II移植到MOTOROLA MC68H908GP32(以下简称GP32)上。

一、在GP32上移植μC/OS-11的主要问题

在第(4)讲中,介绍过要移植μC/OS-11,目标处理必须满足以下要求:

(1)处理器的C编译器能产生可重入代码;

(2)用C语言就可以打开和关闭中断;

(3)处理器支持中断,并且能产生定时中断(通常在10~100Hz之间);

(4)处理器支持足够的RAM,保存全局变量和作为多任务环境下的任务堆栈。

(5)处理器有将堆栈指针和其他CPU寄存器读出和存储到堆栈或内存中的指令。

编译后的μC/OS-II的内核大约有6~10KB;如果只保留最核心的代码,则最小可压缩到2KB。RAM的占用与系统中的任务数有关,任务堆栈要占用大量的RAM空间,堆栈的大小取决于任务的局部变量、缓冲区大小及可能的中断嵌套的层数。所以,所要移植的系统中必须有足够的RAM资源。而像MOTOROLA6805系列的8位MCU,由于RAM资源太小且堆栈指针是固定的,不能满足上面的第(4)条和第(5)条要求,所以μC/OS-II不能在这类处理器上运行。

GP32是68HC08家庭的成员,具有512字节的片内RAM,32K字节的片内Flash,8MHz总线时钟。内部寄存器包括1个8位累加器A,1个16位索引寄存器X,1个16位堆栈指针寄存器SP,1个16位程序指针寄存器 PC及1个8位标志寄存器CCR。与6805系列MCU相比,68HC08系列MCU的堆栈指针为16位,可以自由寻址。这就满足了移植条件(5),且可以使用C编译器生成代码。GP32的用户手册可以在摩托罗拉公司的主页上下载,http://www.motorola.com。

在GP32上移植μC/OS-II的主要困难还是RAM资源太少。为了移植成功,必须采取措施减少RAM的用量,包括限制系统中的任务数量、仔细修改μC/OS-II内核、去掉不使用的部分、限制任务的断嵌套层数、在任务中尽量减少使用局部变量等等。在采取了上述措施后,可将RAM用量减少到最低。但需要提醒的是,为了节省堆栈空间而采用的限制中断嵌套层数的方法将影响系统的实时性能。所以,在GP32上移植μC/OS-II更多的是一种演示,能更好地说明μC/OS-II内核的可裁剪性和灵活性。

在本讲中将介绍一个移植实例。为了减少RAM用量,在本例中只运行了2个用户任务。尽量减池一内核中不必要的模块(包括由箱、消息队列、内存管理等),去掉了任务挂起、唤醒和删除等扩展功能,但仍然支持任务的创建和管理,也保留了信号量模块来用来任务间的通讯。

二、工具和运行环境

要实现μC/OS-II向GP32的移植,需要一个面向MC68HC08的C编译器。笔者使用的是HIWARE公司的C编译器。移植过程同样适用于MC68HC08家庭的其他成员。

三、移植中所需修改的文件

首先是编写整个项目的公共头文件include.h,这个文件定义使用内核中的哪些模块。Include.h会被所有的C源程序引用。还要修改和CPU相关的三个文件,分别是头文件OS_CPU08.H、汇编代码文件 OS_CPU08.ASM和C代码文件OS_CPU08.C。

1.include.h文件

include.h是主头文件,在所有后缀名为.C的文件的开始都包含include.h文件。文件中可以内核进行裁剪。在本例中定义如下:

#define OS_MAX_EVENTS 2 /*共用了2个信号量*/

#define OS_MAX_MEM_PART 0 /*不使用内存块功能*/

#define OS_MAX_QS 0 /*不使用消息队列功能*/

#define OS_MAX_TASKS 3 /*共有3个任务(包括空闲任务)*/

#define OS_LOWEST_PRIO 20 /*定义最低优先级20*/

#define OS_TASK_IDLE_STK_SIZE 60 /*定义空闲任务堆栈60字节*/

#define OS_TASK_STAT_EN 0 /*不使用统计任务*/

#define OS_MBOX_EN 0 /*不使用消息邮箱功能*/

#define OS_MEM_EN 0 /*不包括内存管理部分代码*/

#define OS_Q_EN 0 /*不包括消息队列部分代码*/

#define OS_SEM_EN 1 /*定义包括信息量相关代码*/

#define OS_TASK_CHANGE_PRIO_EN 0 /*不包括任务优先级动态改变代码*/

#define OS_TASK_CREATE_EN1 /*包括任务创建函数代码*/

#define OS_TASK_CREATE_EXT_EN 0 /*不包括带扩展功能的任务创建函数*/

#define OS_TASK_DEL_EN 0 /*不包括删除任务函数代码*/

#define OS_TASK_SUSPEND_EN 0 /*不包括任务挂起和唤醒函数代码*/

#define OS_TICKS_PER_SEC 10 /*定义每秒的时钟节拍数*/

对于不同类型的处理器,还需要改写include.h文件,增加自己的头文件,但必须加在文件末尾。在安装μC/OS-II的时候,附带了几个移植实例,例如,针对Intel 80X86的代码安装到IIL目录下。我们为GP32编写的移植实例可放在IIHC08下,这样,为GP32改写的include.h文件中应该加入下列语句:

#include iiHC08_CPU08.ASM

#include iiHC08_CPU08.C

#include iiHC08_CPU08.H

2.OS_CPU08.H文件

OS_CPU08.H文件中定义了硬件相关的基本信息:

/*数据类型*/

typedef unsigned char BOOLEAN;

typedef unsigned char INT8U;

typedef signed char INT8S;

typedef unsigned short INT16U;

typedef signed short INT16S;

typedef unsigned long INT32U;

typedef signed long INT32S;

/*定义堆栈增长方向*/

#define OS_STK_GROWTH1 /*堆栈由高地址向低地址增长*/

/*定义堆栈单位*/

#define OS_STK INT8U

/*定义进入临界代码区开关中断宏*/

#define OS_ENTER_CRITICAL() asm sei

#define OS_EXIT_CRITICAL() asm cli

#define OS_TASK_SW() asm swi

(1)数据类型

由于不同的处理器有不同的字长,μC/OS-II的移植需要重新定义一系列的数据结构。具体字长还和使用的C编译器有关。在GP32中堆栈是按字节操作的,堆栈数据类型OS_STK声明为8位。μC/OS-II中所有任务的堆栈都必须用OS_STK声明。

1 2 3

关键词:

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章

查看电脑版