·概述—移植需要编写的文件 根据uC/OSIⅡ的要求,移植μC/OS-IⅡ到一个新的体 条结构上需要提供2个或3个文件: OS CPU.H(C语言头文件) OS CPU C.C(C程序源文件) OS CPU A.ASM(汇编程序源文件) 其中OS CPU A.ASM在某些情况下不需要,但极 其罕见。不需要OS CPU A.ASM的必须满足以下苛 刻条件,而同时满足这些条件的微控制器几乎没有: 1.可以直接使用C语言开关中断; 2.可以直接使用C语言编写中断服务程序; 3.可以直接使用C语言操作堆栈指针; 4.可以直接使用C语言保存CPU的所有寄存器
• 概述 根据μC/OS-II的要求,移植μC/OS-II到一个新的体 系结构上需要提供2个或3个文件: OS_CPU.H(C语言头文件) OS_CPU_C.C(C程序源文件) OS_CPU_A.ASM(汇编程序源文件) 其中OS_CPU_A.ASM在某些情况下不需要,但极 其罕见。不需要OS_CPU_A.ASM的必须满足以下苛 刻条件,而同时满足这些条件的微控制器几乎没有: 1.可以直接使用C语言开关中断; 2.可以直接使用C语言编写中断服务程序; 3.可以直接使用C语言操作堆栈指针; 4.可以直接使用C语言保存CPU的所有寄存器。 ——移植需要编写的文件
·概述一移植代码包括的内容 移植内容 类型 所属文件 描述 BOOLEAN、INT8U、INT8S、 数据类型 OS_CPU.H 与编译器无关的数据类型 OS STK 数据类型 OS CPU.H 堆栈的数据类型 OS ENTER CRITICALO)和 OS EXIT CRITICALO) 宏 OS CPU.H 开关中断的代码 OS STK GROWTH 常量 OS CPU.H 定义堆栈的增长方向 OS TASK SW 函数 OS CPU.H 任务切换时执行的代码 OSTaskStklnit() 函数 OS CPU C.C 任务堆栈初始化函数 OSInitHookBeginO、 OSInitHookEnd0、 函数 OS CPU C.C μC/OS-l在执行某些操作时 调用的用户函数,一般为空 . OSStartHighRdy() 函数 *OS CPU A.AS 进入多任务环境时运行优先 M 级最高的任务, OS CDI A AS 实际上,还有一个文件很重要,宅就是IRQ.INC,宅定义了一个汇编宏, 它是uC/OS-ll for ARM7通用的中断服务程序的汇编与C函数接口代码。时钟 节拍中断服务程序也没有移植,因为其与芯片和应用都强烈相关,需要用户自 己编写,不过可以通过RQ.INC简化用户代码的编写
• 概述 移植内容 类型 所属文件 描述 BOOLEAN、INT8U、INT8S、 . 数据类型 OS_CPU.H 与编译器无关的数据类型 OS_STK 数据类型 OS_CPU.H 堆栈的数据类型 OS_ENTER_CRITICAL()和 OS_EXIT_CRITICAL() 宏 OS_CPU.H 开关中断的代码 OS_STK_GROWTH 常量 OS_CPU.H 定义堆栈的增长方向 OS_TASK_SW 函数 OS_CPU.H 任务切换时执行的代码 OSTaskStkInit() 函数 OS_CPU_C.C 任务堆栈初始化函数 OSInitHookBegin()、 OSInitHookEnd()、 . 函数 OS_CPU_C.C μC/OS-II在执行某些操作时 调用的用户函数,一般为空 OSStartHighRdy() 函数 *OS_CPU_A.AS M 进入多任务环境时运行优先 级最高的任务, OSIntCtxSw() 函数 *OS_CPU_A.AS M 中断退出时的任务切换函数 OSTickISR() 中断服务程序 *OS_CPU_A.AS M 时钟节拍中断服务程序 实际上,还有一个文件很重要,它就是IRQ.INC,它定义了一个汇编宏, 它是μC/OS-II for ARM7通用的中断服务程序的汇编与C函数接口代码。时钟 节拍中断服务程序也没有移植,因为其与芯片和应用都强烈相关,需要用户自 己编写,不过可以通过IRQ.INC简化用户代码的编写。 ——移植代码包括的内容
·关于头文件includes.h和config.h uC/OS-Ⅱ要求所有.C文件的都要包含都文件includes.h,这样 使得用户项目中的每个C文件不用分别去考虑它实际上需要哪些 头文件。使用NCLUDES.H的缺点是它可能会包含一些实际不相 关的头文件,这意味着每个文件的编译时间可能会增加,但却增 强了代码的可移植性。 在本移植中另外增加了一个头文件config.h,我们要求所有用 户程序必须包含config.h,在config.h中包含includes.h和特定的头 文件和配置项。而uC/OSⅡ的象统文件依然只是包会includes.h, 即μC/ 卡文 件的增 (μC/W Includes.h congfig.h uC/os 上减 少。 UCOS内核文件 用户程序
• 关于头文件includes.h和config.h μC/OS-II要求所有.C文件的都要包含都文件includes.h,这样 使得用户项目中的每个.C文件不用分别去考虑它实际上需要哪些 头文件。使用INCLUDES.H的缺点是它可能会包含一些实际不相 关的头文件,这意味着每个文件的编译时间可能会增加,但却增 强了代码的可移植性。 在本移植中另外增加了一个头文件config.h,我们要求所有用 户程序必须包含config.h,在config.h中包含includes.h和特定的头 文件和配置项。而μC/OS-II的系统文件依然只是包含includes.h, 即μC/OS-II的系统文件完全不必改动。所有的配置改变包括头文 件的增减均在config.h中进行,而includes.h定下来后不必改动 (μC/OS-II的系统文件需要包含的东西是固定的)。这样, μC/OS-II的系统文件需要编译的次数大大减少,编译时间随之减 少。 congfig.h UCOS内核文件 Includes.h 用户程序
·编写OS CPU.H一不依赖于编译的数据类型 uCOS-Ⅱ不使用C语言中的short、int、long等数据类型的定义, 因为它们与处理器类型有关,隐会着不可移植性。代之以移植性 强的整数数据类型,这样,既直观又可移植,不过这就成了必须 移植的代码。根据ADS编译器的特性,这些代码如程序请单7.1所 示。 typedef unsigned char BOOLEAN typedef unsigned char INT8U typedef signed char INT8S typedef unsigned short INT16U; typedef signed short INT16S; typedef unsigned int INT32U typedef signed int INT32S; typedef float FP32; typedef double FP64; typedef INT32U OS STK;
• 编写OS_CPU.H μCOS-II不使用C语言中的short、int、long等数据类型的定义, 因为它们与处理器类型有关,隐含着不可移植性。代之以移植性 强的整数数据类型,这样,既直观又可移植,不过这就成了必须 移植的代码。根据ADS编译器的特性,这些代码如程序清单7.1所 示。 typedef unsigned char BOOLEAN; typedef unsigned char INT8U; typedef signed char INT8S; typedef unsigned short INT16U; typedef signed short INT16S; typedef unsigned int INT32U; typedef signed int INT32S; typedef float FP32; typedef double FP64; typedef INT32U OS_STK; ——不依赖于编译的数据类型
·编写OS CPU.H一使用软中断SWI作底层接口 μCOS-Ⅱ运行时,处理器可能处于的状态如下图所示: ARM指令 Thumb指令 用户模式 用户模式 ARM指令集 Thumb指令集 用户模式 用户任务使用 的处理器模式 系统模式 ARM指令 Thumb指令 系统模式 系统模式 ARM7内核具有的指令集
• 编写OS_CPU.H μCOS-II运行时,处理器可能处于的状态如下图所示: ——使用软中断SWI作底层接口 ARM指令集 Thumb指令集 用户模式 系统模式 用户任务使用 的处理器模式 ARM7内核具有的指令集 ARM指令 用户模式 ARM指令 系统模式 Thumb指令 系统模式 Thumb指令 用户模式