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

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

时间:11-20 来源:互联网 点击:
2.2 OS_CPU_A.S

首先是函数和全局变量的声明。

  1. ;***************************************************************************
  2. ;PUBLICDECLARATIONS
  3. ;***************************************************************************
  4. xdefOSCPUSaveSR
  5. xdefOSCPURestoreSR
  6. xdefOSStartHighRdy
  7. xdefOSCtxSw
  8. xdefOSIntCtxSw
  9. xdefOSTickISR
  10. ;***************************************************************************
  11. ;EXTERNALDECLARATIONS
  12. ;***************************************************************************
  13. xrefOSIntExit
  14. xrefOSIntNesting
  15. xrefOSPrioCur
  16. xrefOSPrioHighRdy
  17. xrefOSRunning
  18. xrefOSTaskSwHook
  19. xrefOSTCBCur
  20. xrefOSTCBHighRdy
  21. xrefOSTimeTick

然后是临界区的相关代码。

  1. OSCPUSaveSR:
  2. tfrccr,b;Itsassumedthat8-bitreturnvalueisinregisterB
  3. sei;Disableinterrupts
  4. rts;ReturntocallerwithBcontainingthepreviousCCR
  5. OSCPURestoreSR:
  6. tfrb,ccr;BcontainstheCCRvaluetorestore,movetoCCR
  7. rts

下面的代码是重点部分,首先是 OSStartHighRdy 函数,虽然这个函数只在 OSStart 函数中被调用一次,在之后的程序生命周期中就再也用不到了,但这次调用至关重要,决定了用户任务是否能被调度起来。因此代码中给出的注释尽可能的详细,我想看过注释后就不需要我解释什么了。

  1. ;***********************************************************************
  2. ;STARTHIGHESTPRIORITYTASKREADY-TO-RUN
  3. ;
  4. ;Description:ThisfunctioniscalledbyOSStart()tostart
  5. ;thehighestprioritytaskthatwascreatedbyyour
  6. ;applicationbeforecallingOSStart().
  7. ;
  8. ;Arguments:none
  9. ;
  10. ;Note(s):1)Thestackframeisassumedtolookasfollows:
  11. ;
  12. ;OSTCBHighRdy->OSTCBStkPtr+0CCR
  13. ;+1B
  14. ;+2A
  15. ;+3X(H)
  16. ;+4X(L)
  17. ;+5Y(H)
  18. ;+6Y(L)
  19. ;+7PC(H)
  20. ;+8PC(L)
  21. ;
  22. ;2)OSStartHighRdy()MUST:
  23. ;a)CallOSTaskSwHook()then,
  24. ;b)SetOSRunningtoTRUE,
  25. ;c)Switchtothehighestprioritytaskbyloading
  26. ;thestackpointerofthehighestprioritytask
  27. ;intotheSPregisterandexecutean
  28. ;RTIinstruction.
  29. ;************************************************************************
  30. OSStartHighRdy:
  31. jsrOSTaskSwHook;4~,调用OSTaskSwHook
  32. ldab#$01;2~,OSRunning=1
  33. stabOSRunning;4~
  34. ldxOSTCBHighRdy;3~,将OSTCBHighRdy的地址放到寄存器X
  35. lds0,x;3~,将OSTCBHighRdy->OSTCBStkPtr放到SP
  36. nop
  37. rti;4~,Runtask

其实上面的代码也可以放到OS_CPU_C.C 中,下面是个示例:

  1. #pragmaCODE_SEGNON_BANKED
  2. #pragmaTRAP_PROCSAVE_NO_REGS
  3. voidOSStartHighRdy(void)
  4. {
  5. __asmjsrOSTaskSwHook;//OSTaskSwHook();
  6. __asmldab#$01;
  7. __asmstabOSRunning;//OSRunning=TRUE;
  8. __asm
  9. {
  10. ldxOSTCBHighRdy
  11. lds0,x
  12. nop
  13. }
  14. }

上面代码中 #pragma TRAP_PROC SAVE_NO_REGS 表示这是个中断处理函数,编译器不为之保存任何寄存器内容。 虽然 OSStartHighRdy 并不是个真正的中断处理函数,但它模拟却模拟了中断处理函数的行为,函数结束时调用 rti 而不是 rts 命令。

下面是任务切换的代码,注释已经足够的详细了,如果有不明白的地方建议将 Jean J.Labrosse 的书再仔细读读。

  1. OSCtxSw:
  2. ldyOSTCBCur;3~,OSTCBCur->OSTCBStkPtr=StackPointer
  3. sts0,y
  4. OSIntCtxSw:
  5. jsrOSTaskSwHook;4~,Callusertaskswitchhook
  6. ldxOSTCBHighRdy;3~,OSTCBCur=OSTCBHighRdy
  7. stxOSTCBCur
  8. ldabOSPrioHighRdy;3~,OSPrioCur=OSPrioHighRdy
  9. stabOSPrioCur
  10. lds0,x;3~,LoadSPinto68HC12
  11. nop
  12. rti;8~,Runtask

可以看到,上面两个函数公用了大部分的函数体。上面的代码也可以直接写到 OS_CPU_C.C 中,不过写成 C 函数后就不能公用函数体了。

最后一部分是时钟中断程序,我使用RTI中断作为周期性时钟源。

  1. OSTickISR:
  2. incOSIntNesting;4~,NotifyuC/OS-IIaboutISR
  3. ldabOSIntNesting;4~,if(OSIntNesting==1){
  4. cmpb#$01
  5. bneOSTickISR1
  6. ldyOSTCBCur;OSTCBCur->OSTCBStkPtr=StackPointer
  7. sts0,y;}
  8. OSTickISR1:
  9. BSET$37,#128;CRGFLG_RTIF=1,这句是反汇编出来的,应该没错
  10. jsrOSTimeTick
  11. jsrOSIntExit;6~+,NotifyuC/OS-IIaboutendofISR
  12. rti;12~,Returnfrominterrupt,nohigherprioritytasksready.

中断程序的大部分代码都比较简答,只有下面这句我下了番功夫才写出来:
BSET $37, #128
与这行代码功能相同的 C 代码是:CRGFLG_RTIF = 1
我将 C代码直接生成汇编代码的结果是:BSET _CRGFLG,#128
可是直接拿到汇编文件中却无法编译,提示说 _CRGFLG 没有定义。一番查找才确定了_CRGFLG = 0x37。

2.3 OS_CPU_C.C
由于大部分的移植代码都放到了汇编文件中,OS_CPU_C.C 中的工作就很少了。OS_CPU_C.C 最重要的工作是 OSTaskStkInit 函数,并且网上流传的大多数 68HC12 内核的移植代码的这部分都或多或少的有问题。下面先给出我的代码:

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

网站地图

Top