μC/OS-II 移植笔记 1(FreeScale 68HCS12 核单片机)
写汇编代码的话也很简单,下面是例子:
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 还有几行代码:
- #defineOS_TASK_SW()__asmswi;
- #defineOS_STK_GROWTH/*Definestackgrowth:1=Down,0=Up*/
- #pragmaCODE_SEGNON_BANKED
- voidOSStartHighRdy(void);
- voidOSIntCtxSw(void);
- voidOSCtxSw(void);
- #pragmaCODE_SEGDEFAULT
都比较简单,OS_TASK_SW()将操作系统使用的中断指定为 SWI 中断,也就是 software interrupt。
堆栈生长方向为向下生长。
至此,OS_CPU.H 就写完了。
μ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)
