μC/OS-II 移植笔记 1(FreeScale 68HCS12 核单片机)
最近闲暇下来,花了些时间研究了如何将 μC/OS-II 移植到 FreeScale 68HCS12 内核的单片机。其实这个工作前年做过一次,当时是在网上找的相近的移植代码(68HC11核,Bank Memory Model,METROWERKS 编译器)自己做了些修改,内核已经跑起来了,但是在跑串口测试程序(ESBB书上的那个串口模块)时,程序运行一段时间就会跑飞。当时调试了许久也没有找到问题。这次就是接着上次的工作继续深入的往下做,消除错误。其实前年调试时就已经隐约的想到了错误可能的地方,只是当年对 68HCS12 内核还有 CodeWarrior IDE 附带的 C 编译器、汇编器了解的有限,尤其是对编译器的 C Calling Convention、还有 C 编译器对代码中内嵌汇编的处理几乎完全不知,这种水平下调试不出错误也是理所当然的。
这次由于有了以前的基础,这次着眼点直接就放在了编译器对我写的移植代码的处理上,在汇编语言的层面上对移植代码进行了剖析,很快(其实也不算快了,花了我整整 2 天时间)就找到了问题所在,并给出了一个初步的解决方案。现在的移植代码谈不上完美,但至少是正确的。
1. μC/OS-II 版本的选择
这次的移植代码主要针对 μC/OS-II V2.52,2.52 之后的版本对移植代码的要求大体相同,因此这个移植代码稍加修改就应该能在新版本上运行,并且我相信修改的难度应该很小。 μC/OS-III还没有研究过,因此移植代码是否适合 μC/OS-III 我就不得而知了。
之所以选择μC/OS-II V2.52这个版本主要基于两个方面的考虑。首先,Jean J.Labrosse写的那本大名鼎鼎的《MicroC/OS-II The Real-Time Kernel Second Edition》就是根据这个版本写成的,移植过程中遇到问题至少可以翻翻书。另外,这个版本确实也称得上经典,每一行代码都经过经得起推敲。因此,我选择了这个版本。
2. 移植代码详解
μC/OS-II 移植主要需要重写 3 个代码文件:
OS_CPU.H
OS_CPU_C.C
OS_CPU_A.S
下面就对移植代码进行详细的说明。开发环境采用:CodeWarrior Development Studio V5.9.0
2.1 OS_CPU.H
OS_CPU.H 中的代码主要有两部分,第一部分 typedef 了一系列的基本数据类型和几个宏定义。具体代码如下:
- /*
- ******************************************************************************
- *DATATYPES
- ******************************************************************************
- */
- typedefunsignedcharBOOLEAN;
- typedefunsignedcharINT8U;/*Unsigned8bitquantity*/
- typedefsignedcharINT8S;/*Signed8bitquantity*/
- typedefunsignedintINT16U;/*Unsigned16bitquantity*/
- typedefsignedintINT16S;/*Signed16bitquantity*/
- typedefunsignedlongINT32U;/*Unsigned32bitquantity*/
- typedefsignedlongINT32S;/*Signed32bitquantity*/
- typedeffloatFP32;/*Singleprecisionfloatingpoint*/
- typedefdoubleFP64;/*Doubleprecisionfloatingpoint*/
- #defineBYTEINT8S/*Definedatatypesforbackwardcompatibility..*/
- typedefcharSBYTE;
- #defineUBYTEINT8U/*...touC/OSV1.xx*/
- #defineWORDINT16S
- #defineUWORDINT16U
- #defineLONGINT32S
- #defineULONGINT32U
- typedefunsignedcharOS_STK;/*Eachstackentryis8-bitwide*/
- typedefunsignedcharOS_CPU_SR;/*DefinesizeofCPUstatusregister(CCR=8bits)*/
- /*
- ******************************************************************************
- *CONSTANTS
- ******************************************************************************
- */
- #ifndefFALSE
- #defineFALSE0
- #endif
- #ifndefTRUE
- #defineTRUE1
- #endif
基本数据类型的长度查编译器手册都有详细的说明。
有点难度的是堆栈和状态寄存器,需要查68HCS12内核手册,虽然68HCS12内核是16位的内核,但是堆栈是以字节为单位的,所以有如下代码:
typedef unsigned char OS_STK;
68HCS12内核的状态寄存器称为 CCR,也是8位了,因此:
typedef unsigned char OS_CPU_SR;
OS_CPU.H 中还包含对临界区的处理:
- #defineOS_CRITICAL_METHOD3
- #ifOS_CRITICAL_METHOD==3
- OS_CPU_SROSCPUSaveSR(void);
- voidOSCPURestoreSR(OS_CPU_SRos_cpu_sr);
- #endif
- #ifOS_CRITICAL_METHOD==1
- #defineOS_ENTER_CRITICAL()__asmsei;
- #defineOS_EXIT_CRITICAL()__asmcli;
- #endif
- #ifOS_CRITICAL_METHOD==2
- #defineOS_ENTER_CRITICAL()__asmpshc;__asmsei;
- #defineOS_EXIT_CRITICAL()__asmpulc;
- #endif
- #ifOS_CRITICAL_METHOD==3
- #
μCOS-II移植笔记68HCS12核单片 相关文章:
- μC/OS-II 移植笔记 2(FreeScale 68HCS12 核单片机)(11-20)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)