微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于MC68HC908GP32的μC/OS-II移植

基于MC68HC908GP32的μC/OS-II移植

时间:01-04 来源:互联网 点击:

被所有的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_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_TASK_CHANGE_PRIO_EN 0 /*不包括任务优先级动态改变代码*/

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

#define OS_TASK_CREATE_EXT_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 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声明。

数据类型的出现,是因为电脑内存有限。 把数据分成所需内存大小不同的数据,编程的时候需要用大数据的时候才需要申请大内存,就可以充分利用内存。 例如大胖子必须睡双人床,就给他双人床,瘦的人单人床就够了。

(2)代码临界区

μC/OS-II在进入系统临界代码区之前要关闭中断,等到退出临界区后再打开,从而保护核心数据不被多任务环境下的其他任务或中断破坏。在GP32中,开关中断可以通过汇编指令CLI和SEI来实现。所以μC/OS-II中的宏OS_ENTER_CRITICAL()定义为指令SEI,OS_EXIT_CRITICAL()定义为指令CLI。

(3)堆栈增长方向

GP32的堆栈是由高地址向低地址方向增长的,所以常量OS_STK_GPOWTH必须设置为1。判断堆栈增长方向

说明:今天看到alloca.c中find_stack_direction函数,用来判断堆栈的增长方向,记录下来。

#define ADDRESS_FUNCTION(arg) (arg)

/* Define STACK_DIRECTION if you know the direction of stack

growth for your system; otherwise it will be automatically

deduced at run-time.

STACK_DIRECTION > 0 => grows toward higher addresses

STACK_DIRECTION 0 => grows toward lower addresses

STACK_DIRECTION = 0 => direction of growth unknown */

#ifndef STACK_DIRECTION

#define STACK_DIRECTION 0 /* Direction unknown. */

#endif

#if STACK_DIRECTION != 0

#define STACK_DIR STACK_DIRECTION /* Known at compile-time. */

#else /* STACK_DIRECTION == 0; need run-time code. */

static int stack_dir; /* 1 or -1 once known. */

#define STACK_DIR stack_dir

static void

find_stack_direction ()

{

static char *addr = NULL; /* Address of first `dummy', once known. */

auto char dummy; /* To get stack address. */

if (addr == NULL)

{ /* Initial entry. */

addr = ADDRESS_FUNCTION (dummy);

find_s

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

网站地图

Top