微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > μC/OS-II 移植笔记 1(FreeScale 68HCS12 核单片机)

μC/OS-II 移植笔记 1(FreeScale 68HCS12 核单片机)

时间:11-20 来源:互联网 点击:
μC/OS-II移植笔记 1(移植到FreeScale 68HCS12 核单片机,Small Memory Model)

最近闲暇下来,花了些时间研究了如何将 μ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 了一系列的基本数据类型和几个宏定义。具体代码如下:

  1. /*
  2. ******************************************************************************
  3. *DATATYPES
  4. ******************************************************************************
  5. */
  6. typedefunsignedcharBOOLEAN;
  7. typedefunsignedcharINT8U;/*Unsigned8bitquantity*/
  8. typedefsignedcharINT8S;/*Signed8bitquantity*/
  9. typedefunsignedintINT16U;/*Unsigned16bitquantity*/
  10. typedefsignedintINT16S;/*Signed16bitquantity*/
  11. typedefunsignedlongINT32U;/*Unsigned32bitquantity*/
  12. typedefsignedlongINT32S;/*Signed32bitquantity*/
  13. typedeffloatFP32;/*Singleprecisionfloatingpoint*/
  14. typedefdoubleFP64;/*Doubleprecisionfloatingpoint*/
  15. #defineBYTEINT8S/*Definedatatypesforbackwardcompatibility..*/
  16. typedefcharSBYTE;
  17. #defineUBYTEINT8U/*...touC/OSV1.xx*/
  18. #defineWORDINT16S
  19. #defineUWORDINT16U
  20. #defineLONGINT32S
  21. #defineULONGINT32U
  22. typedefunsignedcharOS_STK;/*Eachstackentryis8-bitwide*/
  23. typedefunsignedcharOS_CPU_SR;/*DefinesizeofCPUstatusregister(CCR=8bits)*/
  24. /*
  25. ******************************************************************************
  26. *CONSTANTS
  27. ******************************************************************************
  28. */
  29. #ifndefFALSE
  30. #defineFALSE0
  31. #endif
  32. #ifndefTRUE
  33. #defineTRUE1
  34. #endif

基本数据类型的长度查编译器手册都有详细的说明。
有点难度的是堆栈和状态寄存器,需要查68HCS12内核手册,虽然68HCS12内核是16位的内核,但是堆栈是以字节为单位的,所以有如下代码:
typedef unsigned char OS_STK;

68HCS12内核的状态寄存器称为 CCR,也是8位了,因此:
typedef unsigned char OS_CPU_SR;

OS_CPU.H 中还包含对临界区的处理:

  1. #defineOS_CRITICAL_METHOD3
  2. #ifOS_CRITICAL_METHOD==3
  3. OS_CPU_SROSCPUSaveSR(void);
  4. voidOSCPURestoreSR(OS_CPU_SRos_cpu_sr);
  5. #endif
  6. #ifOS_CRITICAL_METHOD==1
  7. #defineOS_ENTER_CRITICAL()__asmsei;
  8. #defineOS_EXIT_CRITICAL()__asmcli;
  9. #endif
  10. #ifOS_CRITICAL_METHOD==2
  11. #defineOS_ENTER_CRITICAL()__asmpshc;__asmsei;
  12. #defineOS_EXIT_CRITICAL()__asmpulc;
  13. #endif
  14. #ifOS_CRITICAL_METHOD==3
  15. #

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

网站地图

Top