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

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

时间:11-20 来源:互联网 点击:

写汇编代码的话也很简单,下面是例子:

xdef OSCPUSaveSR
xdef OSCPURestoreSR
OSCPUSaveSR:
tfr ccr,b ; Its assumed that 8-bit return value is in register B
sei ; Disable interrupts
rts ; Return to caller with D containing the previous CCR

OSCPURestoreSR:
tfr b, ccr ; B contains the CCR value to restore, move to CCR
rts

和上面 C 函数的代码几乎一样,没什么可介绍的了。

另外多说一句,大家可能觉得上面的代码可以直接写成内联汇编语句,就不用函数调用了。比如下面的代码:

#define OS_ENTER_CRITICAL() asm ("tpa; staa cpu_sr; sei")
#define OS_EXIT_CRITICAL() asm ("ldaa cpu_sr; tap")

上面的代码看似很好,进入临界区时将 CCR 的值放到 寄存器 a 中,然后存到 cpu_sr 中,再关中断。退出临界区是恢复 CCR。问题在于 CodeWarrior Development Studio 中带的 C 编译器太弱智了,无法感知 寄存器 a 被改变了,更无法添加相应的处理代码。自己保存寄存器 a 的内容又很麻烦,不能直接放到堆栈中,否则会影响局部变量的访问,只能存在 C 编译器可以感知的地方。比如用下面的方法:
char tmp_a;
asm ("staa tmp_a, tpa; staa cpu_sr; sei; ldaa tmp_a")
asm ("staa tmp_a, tpa; ldaa cpu_sr; tap; ldaa tmp_a")

这样的开销也不小,不如直接写两个函数方便。

OS_CPU.H 还有几行代码:

  1. #defineOS_TASK_SW()__asmswi;
  2. #defineOS_STK_GROWTH/*Definestackgrowth:1=Down,0=Up*/
  3. #pragmaCODE_SEGNON_BANKED
  4. voidOSStartHighRdy(void);
  5. voidOSIntCtxSw(void);
  6. voidOSCtxSw(void);
  7. #pragmaCODE_SEGDEFAULT

都比较简单,OS_TASK_SW()将操作系统使用的中断指定为 SWI 中断,也就是 software interrupt。
堆栈生长方向为向下生长。

至此,OS_CPU.H 就写完了。

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

网站地图

Top