您的位置 首页 分销

在MOTOROLAA68K系列MCU上移植μC/OS-II

以下介绍如何将μC/OS-II移植到MOTOROLA MC68K系列CPU上。一、MC68K CPU简介MC68K及68020、68040等的著名的MOTOROLA32位微处理器,和与之兼容的6

以下介绍如何将μC/OS-II移植到MOTOROLA MC68K系列CPU上。

一、MC68K CPU简介

MC68K及68020、68040等的闻名的MOTOROLA32位微处理器,和与之兼容的68K、CPU32、CPU32+等CPU扩大守时处理单元TPU、行列串行模块QSM、体系操控模块和RAM等组成MC683xx系列单片机。

CPU32内部有8个32位通用数据寄存器,8个32位通用地址寄存器。8个通用数据寄存器可作为累加器运用,也可当作C言语中各种类型的变量;8个通用地址寄存器,可作为变址寄存器运用,也可当作C言语中的指针型变量。CPU32 有独立的用户仓库指针和体系仓库指针,可差异程序区、数据区、体系区、用户区等存储空间,有7级中止。

要完结μC/OS-II向MC68K的移值,需求有MC68K的C编译器。咱们运用的HIWARE公司的C编译器。该C编译器答应嵌入行汇编。

二、移植中所需修正的文件

和CPU相关的文件主要有三个:C言语文件OS_CPU32.C、头文件OS_CPU32.H和汇编文件OS_CPU32.ASM。

1.INCLUDES.H文件

INCLUDES.H是主头文件,在一切后缀名为.C文件的开端都包括 INCLUDES.H文件。关于不同类型的处理器,用户需求改定INCLUDES.H文件,添加自己的头文件,但有必要加在文件结尾。在装置μC/OS- II的时分,附带了几个移植实例,例如,针对Intel 80×86的代码装置到IIL目录。咱们为MC68K编写的移植实例都放在II下,在INCLUDES.H文件中添加有:

#include iiK_CPU32.ASM

#include iiK_CPU32.C

#include iiK_CPU32.H

2.OS_CPU32.H文件

OS_CPU32.H文件中界说了与硬件相关的基本信息:

typedef unsigned char INT8U; /*无符号8位数*/

typedef signed char INT8S; /*带符号8位数*/

typedef unsigned int INT16U; /*无符号16位数*/

typedef signed int INT16S; /*带符号16位数*/

typedef signed long INT32S; /*带符号32位数*/

typedef unsigned int OS_STK; /*仓库进口宽度为16位*/

#define OS_STK_GROWTH1 /*仓库由高地址向低地址增加*/

#define UCOS 0 /*用于使命切换的软中止*/

define OS_TASK_SW() _TRAP(UCOS)

#define OS_ENTER_CRITICAL() move.w#$2700,SR /*进入临界区*/

#define OS_EXIT_CRITICAL() move.w #$2000,SR /*退出临界区*/

(1)数据类型

因为不同的处理器有不同的字长,μC/OS-II的移植需求从头界说一系列的数据结构。因为MC68K为32位MCU,整数(int)类型数据为16位,长整开有(long)为32位。在MC68K中仓库都是按字进行操作的,所以仓库数据类型OS_STK声明为16位。一切的仓库有必要用OS_STK声明。

(2)代码临界区

μC/OS-II在进入体系临界代码区之间要关中止,比及退出临界区后再翻开,然后维护中心数据不被多使命环境下的其他使命或中止损坏。在MC68K中,开关中止能够经过设置状况寄存器SR中的中止屏蔽位来完结。μC/OS-II中的宏OS_ENTER_CRITICAL()界说将状况寄存器的中止屏蔽方位位,屏蔽一切的七级中止;OS_EXIT_CRITICAL()界说将状况寄存器的中止屏蔽位清零,翻开一切的七级中止。这种处理办法十分简略,但CPU32供给分级中止机制得不到运用。假如要运用分级中止,有必要改写一些相关的函数,将在第4节中说明。

(3)仓库方向

MC68K处理器的仓库是由高地址向低地址递减的,所以OS_STK_GROWTH有必要设置为1。

(4)OS_TASK_SW()函数的界说

在μC/OS-II中,OS_TASK_SW()用来完结使命切换。安排妥当使命的仓库初始化应该模仿一次中止发生后的姿态,椎栈中应该按入栈次第设置好各个寄存器。OS_TASK_SW()函数模仿一次断进程,在中止回来的进修进行使命切换。CPU32有16个软中止可供选用,称为圈套TRAP调用。中止程序程序的进口有必要指向汇编函数OSCtxSw()。

咱们在μC/OS-II所供给的例程中运用的0号圈套调用,由下面的句子完结界说:

#define OS_TASK_SW() -TRAP(UCOS)

3.OS_CPU32.ASM文件

μC/OS-II的移植需求用户改写OS_CPU_A.ASM中的4个函数:OSStartHighRdy()、OSCtxSw()、OSIntCtxSw()和OSTickISR()。

(1)OSStartHighRdy()函数

该函数由OSStart()函数调用,功用是运转优先级最高的安排妥当态使命。在调用OSStart()之前,用户有必要先调用OSInit(),而且现已至少创立了一个使命。为发动使命,OSStartHighRdy()首要找到当时安排妥当的优先级最高的使命,OSTCBHighRdy中保存有优先级最高使命的使命操控块(TCB)的地址,并从使命的使命操控块中找到指向仓库的指针,然后运转指令MOVEM.L(A7)+,A0-A6/D0-D7,从仓库中弹出悉数寄存器的内容,运转RTE中止回来。因为使命创立时仓库的结构便是按中止捕捉仓库结构初始化的,履行RET指令后就切换到了新使命。有关μC/OS-II的使命切换机制,请参考系列计座(3).

OSStartHighRdy的汇编代码如下:

_OSStarHighRdy

MOVE.L(_OSTCBHighRdy),A1

;获取最高优先级安排妥当使命的TCB地址

MOVE.L A1,(_OSTCBCur)

MOVE.L (A1),A7 ;获得仓库指针

MOVEM.L (A7)+,A0-A6/D0-D7

RTE ;中止回来,切换使命

(2)OSCtxSw( )函数

OSCtxSw( )是一个使命级的使命切换函数(在使命中调用,差异于在中止程序中调用的OSIntCtxSw(),在MC68K体系上,经过履行一条软中止指令来完结使命切换。软中止向量指向函数,而该函数的履行结构或许形成体系使命从头调度(例如,企图唤醒一个优先级更高的使命),则在函数的结尾会调用 OSSched(),OSSched()将查找当时安排妥当的优先级最高的使命。假如不是当时使命,则判别是否需求进行使命调度,再找到该使命操控块 OS_TCB的地址,并将该地址拷贝到变量OSTCBHighRdy中,然后经过宠OS_TASK_SW()履行软中止,进行使命切换。在此进程中,变量 OSTCBCur一直包括一个指向当时运转使命OS_TCB的指针。OSCtxSw()的汇编代码如下:

_OSCtxSw

MOVEM.L A0-A6/D0-D7,-(A7) ;存储当时使命环境

MOVE.L (_OSTCBCur),A1 ;保存当时使命TCB指针

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/fenxiao/299546.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部