?编写BSP
板级支持包( BSP) 是介于底层硬件和操作系统之间的软件层次, 负责进行系统启动后最初的硬件和软件
初始化, 并对底层硬件进行封装, 使得操作系统不再面对具体的硬件[ 9] 。在此建立两个BSP 文件: BSP. ASM 和BSP. C。其中, BSP. ASM 中包含了汇编语言写的中断接口程序。BSP. C 中包含了硬件和软件的初始化程序和产生时钟节拍的中断服务程序。
与处理器相关代码的修改和编写
有三个与处理器相关的文件, 即OS_CPU . H, OS_CPU _ A. ASM 和OS _ CPU _ C. C 需要修改。由于MCF52235 有eMAC 模块, 所以还需要编写OS_CPU _I. ASM 文件, 用来在任务切换和中断时以及中断返回
时保存和恢复相关寄存器。
?1 、OS_CPU. H 的移植
OS_CPU. H 包含了一些与处理器和编译器相关的宏定义和数据类型定义。由于使用Codew arrior 编译
器, shor t 类型是16 位的, int 类型是32 位的。MCF52235 的堆栈是32 位宽的, 因此OS_STK 定义为
32 位, 所有任务的堆栈必须声明使用OS_ST K 这种数据类型。数据类型定义如下:
ty pedef unsigned char BOOLEAN;
ty pedef unsigned char INT 8U;
ty pedef signed char INT8S;
ty pedef unsigned sho rt INT16U;
ty pedef signed shor t INT16S;
ty pedef unsigned int INT32U;
ty pedef signed int INT32S;
typedef float?FP32;
typedef double FP64;
typedef unsigned int OS_STK;
typedef unsigned shor t OS_CPU_SR;
( 1) 临界区域处理。像所有的实时性内核一样, 在进入代码临界区时要关中断, 完成时要开中断。C/
OS 定义了两个宏来关闭和使能中断: OS_ENT ER_CRITICAL( ) 和OS_EXIT _CRIT ICAL( ) 。C/ OS定义了三种方法来关闭和使能中断, 大多数情况下选择第三种方法。
# define OS_CRITICAL_METH OD # 3
# define OS_ENTER_CRITICAL( ) { cpu_sr = OS _CPU_
SR_Save( ) ; } / / 关中断
# def ineOS _ EXIT _ CRITICAL( ) { OS _ CPU _ SR_ Resto re
( cpu_sr) ; } / / 开中断
( 2) 任务层上下文切换。当C/ OS 调用OS _TASK_SW( ) 时发生任务层的上下文切换。因为上下
文切换是根据处理器的不同而不同的, 所以需要执行一个汇编的函数。在这种情况下, 用TRA P 指令来产
生一个异常, 用T RAP 指令的优点是能使它像发生了一次中断一样。这里用# 14 T RAP, 因为大多数情况
下, # 15 TRAP 被调试和监控程序保留了。# 14TRAP 定位于VBR+ 0x00B8, 然后跳转到相应的地址。
在这个向量处放置OSCtx Sw( ) 的地址。这个函数声明在OS_CPU_A. ASM 里。VBR 代表向量基址寄存器,
包含异常向量表的基址, 程序开始时被初始化为0x00000000, 但是在运行时可以改变。
# define OS_TASK_SW( ) asm( T RAP # 14; )
( 3) 堆栈的增长方向。MCF52235 的堆栈增长方向是从高地址向低地址, 因此OS _ST K_GROWTH 置
为1。
# define OS_STK_GROWTH 1
评论