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

发布者:熙风细雨最新更新时间:2016-05-06 来源: eefocus关键字:μCOS-II  移植笔记  68HCS12  核单片机 手机看文章 扫描二维码
随时随地手机看文章
2.2 OS_CPU_A.S

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


 
  1. ;***************************************************************************  
  2. ;                          PUBLIC DECLARATIONS  
  3. ;***************************************************************************     
  4.     xdef   OSCPUSaveSR  
  5.     xdef   OSCPURestoreSR      
  6.     xdef   OSStartHighRdy  
  7.     xdef   OSCtxSw  
  8.     xdef   OSIntCtxSw  
  9.     xdef   OSTickISR  
  10.       
  11. ;***************************************************************************  
  12. ;                      EXTERNAL DECLARATIONS  
  13. ;***************************************************************************     
  14.     xref   OSIntExit  
  15.     xref   OSIntNesting    
  16.     xref   OSPrioCur      
  17.     xref   OSPrioHighRdy  
  18.     xref   OSRunning     
  19.     xref   OSTaskSwHook   
  20.     xref   OSTCBCur       
  21.     xref   OSTCBHighRdy   
  22.     xref   OSTimeTick  


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


 
  1. OSCPUSaveSR:  
  2.     tfr  ccr,b       ; It's assumed that 8-bit return value is in register B  
  3.     sei              ; Disable interrupts  
  4.     rts              ; Return to caller with B containing the previous CCR  
  5.   
  6. OSCPURestoreSR:  
  7.     tfr  b, ccr      ; B contains the CCR value to restore, move to CCR  
  8.     rts  


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

 
  1. ;***********************************************************************  
  2. ;           START HIGHEST PRIORITY TASK READY-TO-RUN  
  3. ;  
  4. ; Description : This function is called by OSStart() to start   
  5. ;  the highest priority task that was created by your   
  6. ;  application before calling OSStart().  
  7. ;  
  8. ; Arguments   : none  
  9. ;  
  10. ; Note(s)     : 1) The stack frame is assumed to look as follows:  
  11. ;     
  12. ;                  OSTCBHighRdy->OSTCBStkPtr +  0       CCR  
  13. ;                                            +  1       B  
  14. ;                                            +  2       A  
  15. ;                                            +  3       X (H)  
  16. ;                                            +  4       X (L)  
  17. ;                                            +  5       Y (H)  
  18. ;                                            +  6       Y (L)  
  19. ;                                            +  7       PC(H)  
  20. ;                                            +  8       PC(L)  
  21. ;  
  22. ;               2) OSStartHighRdy() MUST:  
  23. ;                      a) Call OSTaskSwHook() then,  
  24. ;                      b) Set OSRunning to TRUE,  
  25. ;                      c) Switch to the highest priority task by loading   
  26. ;                          the stack pointer of the highest priority task   
  27. ;                          into the SP register and execute an   
  28. ;                          RTI instruction.  
  29. ;************************************************************************  
  30. OSStartHighRdy:  
  31.     jsr    OSTaskSwHook    ;  4~, 调用 OSTaskSwHook              
  32.   
  33.     ldab   #$01            ;  2~, OSRunning = 1  
  34.     stab   OSRunning       ;  4~                    
  35.   
  36.     ldx    OSTCBHighRdy    ;  3~, 将 OSTCBHighRdy 的地址放到寄存器 X  
  37.     lds    0, x            ;  3~, 将 OSTCBHighRdy->OSTCBStkPtr 放到 SP   
  38.     nop                                  
  39.     rti                    ;  4~, Run task   


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

 
  1. #pragma CODE_SEG NON_BANKED  
  2. #pragma TRAP_PROC SAVE_NO_REGS     
  3. void OSStartHighRdy(void)  
  4. {  
  5.     __asm jsr OSTaskSwHook ;  //OSTaskSwHook();  
  6.     __asm ldab #$01;  
  7.     __asm stab OSRunning;     // OSRunning = TRUE;       
  8.     __asm  
  9.     {  
  10.         ldx    OSTCBHighRdy       
  11.         lds    0, x               
  12.         nop                            
  13.     }  
  14. }  


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

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

 
  1. OSCtxSw:  
  2.     ldy    OSTCBCur       ;  3~, OSTCBCur->OSTCBStkPtr = Stack Pointer       
  3.     sts    0, y                                                      
  4. OSIntCtxSw:  
  5.     jsr    OSTaskSwHook   ;  4~, Call user task switch hook                         
  6.     ldx    OSTCBHighRdy   ;  3~, OSTCBCur  = OSTCBHighRdy  
  7.     stx    OSTCBCur                                 
  8.     ldab   OSPrioHighRdy  ;  3~, OSPrioCur = OSPrioHighRdy                          
  9.     stab   OSPrioCur        
  10.     lds    0, x           ;  3~, Load SP into 68HC12                                
  11.     nop      
  12.     rti                   ;  8~, Run task     


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

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

 
  1. OSTickISR:  
  2.     inc    OSIntNesting       ;  4~, Notify uC/OS-II about ISR  
  3.     ldab   OSIntNesting       ;  4~, if (OSIntNesting == 1) {      
  4.     cmpb   #$01                 
  5.     bne    OSTickISR1           
  6.     ldy    OSTCBCur           ;  OSTCBCur->OSTCBStkPtr = Stack Pointer       
  7.     sts    0, y               ;  }                                            
  8. OSTickISR1:  
  9.     BSET   $37, #128          ;  CRGFLG_RTIF = 1, 这句是反汇编出来的,应该没错  
  10.     jsr    OSTimeTick   
  11.     jsr    OSIntExit          ;  6~+, Notify uC/OS-II about end of ISR  
  12.     rti        ;  12~, Return from interrupt, no higher priority tasks ready.  


中断程序的大部分代码都比较简答,只有下面这句我下了番功夫才写出来:
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 内核的移植代码的这部分都或多或少的有问题。下面先给出我的代码:


 
  1. OS_STK *OSTaskStkInit (void (*task)(void *pd), void *p_arg, OS_STK *ptos, INT16U opt)  
  2. {  
  3.     INT16U *wstk;  
  4.     INT8U  *bstk;  
  5.    
  6.     (void) opt;             /* 'opt' is not used, prevent warning    */  
  7.     ptos--;                 /* 需要这么调整一下栈顶地址,否则存的第一个int16 的低 Byte 会溢出堆栈 */  
  8.     wstk  = (INT16U *)ptos;       /* Load stack pointer  */  
  9.     *wstk-- = (INT16U)task;       /* Return address.  Format: PCH:PCL */  
  10.     *wstk-- = (INT16U)task;       /* Return address.  Format: PCH:PCL */  
  11.     *wstk-- = (INT16U)0x2222;     /* Y Register */  
  12.     *wstk-- = (INT16U)0x1111;     /* X Register */  
  13.     *wstk   = (INT16U)p_arg;      /* Simulate call to function with argument (In D Register) */    
  14.      bstk    = (INT8U *)wstk;     /* Convert WORD ptr to BYTE ptr to set CCR                */  
  15.      bstk--;  
  16.     *bstk = (0xC0);               /* CCR Register (Disable STOP instruction and XIRQ)       */  
  17.     return ((OS_STK *)bstk);      /* Return pointer to new top-of-stack */     
  18. }  


其中有几点需要特别注意:
(1)68HC12 内核与 68HC11 内核一个大的区别就是 SP 指向的是实栈顶。老的68HC11的移植代码都是 *--wstk = XXXX。移植到68HC12 内核就要改为*wstk-- = XXXX。否则会浪费掉堆栈的前两个字节。
(2)先要执行 ptos--;否则第一个双字节会有一半溢出堆栈空间。
(3)任务的参数传递是通过寄存器 D 的,而不是堆栈。网上代码多数是:

[cpp] view plain copy
 
  1. *wstk--   = (INT16U)p_arg;        
  2. *wstk--   = (INT16U)task;       


这样参数是传递不进来的,只有像我的代码中这样写才是正确的。
(4)代码中 *wstk-- = (INT16U)task; 重复了两遍,千万别以为这是我的笔误。堆栈中先存的(INT16U)task实际上是 task 函数的返回地址。虽然 μC/OS-II 要求任务不能返回,但是作为 C 语言的调用约定,在调用一个 C 函数之前要将 C 函数的返回地址先入栈。因此我将 task 的地址重复了两次,实际上第一的地址是什么都不重要,因为程序运行中觉得不会用到。甚至不要这行也行,还能节省堆栈中两个字节的空间。不过我还是选择了保留这行,使其看起来更加符合 C 语言的调用规范。
  
除此之外,OS_CPU_C.C 还包括一系列的 Hook 函数:

 
  1. #if OS_CPU_HOOKS_EN > 0 && OS_VERSION > 203  
  2.   
  3. void  OSInitHookBegin (void)  
  4. {  
  5.     #if OS_TMR_EN > 0  
  6.         OSTmrCtr = 0;  
  7.     #endif  
  8. }  
  9.   
  10. void  OSInitHookEnd (void)  
  11. {  
  12. }  
  13.   
  14. #endif  
  15.   
  16.   
  17. #if OS_CPU_HOOKS_EN > 0   
  18.   
  19. void  OSTaskCreateHook (OS_TCB *ptcb)  
  20. {  
  21.     #if OS_APP_HOOKS_EN > 0  
  22.         App_TaskCreateHook(ptcb);  
  23.     #else  
  24.         (void)ptcb;    
  25.     #endif  
  26. }  
  27.   
  28. void  OSTaskDelHook (OS_TCB *ptcb)  
  29. {  
  30.     #if OS_APP_HOOKS_EN > 0  
  31.         App_TaskDelHook(ptcb);  
  32.     #else  
  33.         (void)ptcb;     
  34.     #endif  
  35. }  
  36.   
  37.   
  38. void  OSTaskStatHook (void)  
  39. {  
  40.     #if OS_APP_HOOKS_EN > 0  
  41.         App_TaskStatHook();  
  42.     #endif  
  43. }  
  44.   
  45. void  OSTaskSwHook (void)  
  46. {  
  47.     #if OS_APP_HOOKS_EN > 0  
  48.         App_TaskSwHook();  
  49.     #endif  
  50. }  
  51.   
  52. #endif  
  53.   
  54.   
  55. #if OS_CPU_HOOKS_EN > 0 && OS_VERSION >= 251  
  56. void  OSTaskIdleHook (void)  
  57. {  
  58.     #if OS_APP_HOOKS_EN > 0  
  59.         App_TaskIdleHook();  
  60.     #endif  
  61. }  
  62. #endif  
  63.   
  64. #if OS_CPU_HOOKS_EN > 0 && OS_VERSION > 203  
  65. void  OSTCBInitHook (OS_TCB *ptcb)  
  66. {  
  67. #if OS_APP_HOOKS_EN > 0  
  68.     App_TCBInitHook(ptcb);  
  69. #else  
  70.     (void)ptcb;      /* Prevent compiler warning         */  
  71. #endif  
  72. }  
  73. #endif  
  74.   
  75. #if OS_CPU_HOOKS_EN > 0   
  76. void  OSTimeTickHook (void)  
  77. {  
  78. #if OS_APP_HOOKS_EN > 0  
  79.     App_TimeTickHook();  
  80. #endif  
  81.   
  82. #if OS_TMR_EN > 0  
  83.     OSTmrCtr++;  
  84.     if (OSTmrCtr >= (OS_TICKS_PER_SEC / OS_TMR_CFG_TICKS_PER_SEC))   
  85.     {  
  86.         OSTmrCtr = 0;  
  87.         OSTmrSignal();  
  88.     }  
  89. #endif  
  90. }  
  91. #endif  


代码中  OS_APP_HOOKS_EN  和 OS_TMR_EN  在v2.52 版本中还没出现,我在这里这样写是为了移植到后面版本时更轻松。

至此,移植代码就基本完成了。不过这样还不能运行,因为两个中断处理函数(OSCtxSw和OSTickISR)还没有和对应的中断产生关联。将这二者关联起来的方法有几种,比如直接在 PRM 文件中制定,我用了种比较笨的办法,从网上找了个 vector.c 文件,虽然看起来不是很优雅,但确实是正确的代码。


 
  1. /******************************************************************* 
  2.  * 
  3.  *              Freescale MC9S12DP256 ISR Vector Definitions 
  4.  * 
  5.  * File Name  : vectors.c 
  6.  * Version    : 1.0 
  7.  * Date       : Jun/22/2004 
  8.  * Programmer : Eric Shufro 
  9.  ********************************************************************/  
  10.   
  11. /******************************************************************** 
  12. *                 EXTERNAL ISR FUNCTION PROTOTYPES 
  13. *********************************************************************/  
  14.   
  15. extern void near _Startup(void);    /* Startup Routine.                    */  
  16. extern void near  OSTickISR(void);  /* OS Time Tick Routine.               */  
  17. extern void near  OSCtxSw(void);    /* OS Contect Switch Routine.          */  
  18. extern void near  SCI1_ISR(void);   /* SCI1 Routine.                       */  
  19. extern void near  SCI0_ISR(void);   /* SCI0 Routine.                       */  
  20.   
  21.   
  22. /* 
  23. ************************************************************************ 
  24. *               DUMMY INTERRUPT SERVICE ROUTINES 
  25. * Description : When a spurious interrupt occurs, the processor will  
  26. *               jump to the dedicated default handler and stay there 
  27. *               so that the source interrupt may be identified and 
  28. *               debugged. 
  29. * Notes       : Do Not Modify 
  30. ************************************************************************ 
  31. */  
  32.   
  33. #pragma CODE_SEG __NEAR_SEG NON_BANKED   
  34. __interrupt void software_trap64 (void) {for(;;);}  
  35. __interrupt void software_trap63 (void) {for(;;);}  
  36. __interrupt void software_trap62 (void) {for(;;);}  
  37. __interrupt void software_trap61 (void) {for(;;);}  
  38. __interrupt void software_trap60 (void) {for(;;);}  
  39. __interrupt void software_trap59 (void) {for(;;);}  
  40. __interrupt void software_trap58 (void) {for(;;);}  
  41. __interrupt void software_trap57 (void) {for(;;);}  
  42. __interrupt void software_trap56 (void) {for(;;);}  
  43. __interrupt void software_trap55 (void) {for(;;);}  
  44. __interrupt void software_trap54 (void) {for(;;);}  
  45. __interrupt void software_trap53 (void) {for(;;);}  
  46. __interrupt void software_trap52 (void) {for(;;);}  
  47. __interrupt void software_trap51 (void) {for(;;);}  
  48. __interrupt void software_trap50 (void) {for(;;);}  
  49. __interrupt void software_trap49 (void) {for(;;);}  
  50. __interrupt void software_trap48 (void) {for(;;);}  
  51. __interrupt void software_trap47 (void) {for(;;);}  
  52. __interrupt void software_trap46 (void) {for(;;);}  
  53. __interrupt void software_trap45 (void) {for(;;);}  
  54. __interrupt void software_trap44 (void) {for(;;);}  
  55. __interrupt void software_trap43 (void) {for(;;);}  
  56. __interrupt void software_trap42 (void) {for(;;);}  
  57. __interrupt void software_trap41 (void) {for(;;);}  
  58. __interrupt void software_trap40 (void) {for(;;);}  
  59. __interrupt void software_trap39 (void) {for(;;);}  
  60. __interrupt void software_trap38 (void) {for(;;);}  
  61. __interrupt void software_trap37 (void) {for(;;);}  
  62. __interrupt void software_trap36 (void) {for(;;);}  
  63. __interrupt void software_trap35 (void) {for(;;);}  
  64. __interrupt void software_trap34 (void) {for(;;);}  
  65. __interrupt void software_trap33 (void) {for(;;);}  
  66. __interrupt void software_trap32 (void) {for(;;);}  
  67. __interrupt void software_trap31 (void) {for(;;);}  
  68. __interrupt void software_trap30 (void) {for(;;);}  
  69. __interrupt void software_trap29 (void) {for(;;);}  
  70. __interrupt void software_trap28 (void) {for(;;);}  
  71. __interrupt void software_trap27 (void) {for(;;);}  
  72. __interrupt void software_trap26 (void) {for(;;);}  
  73. __interrupt void software_trap25 (void) {for(;;);}  
  74. __interrupt void software_trap24 (void) {for(;;);}  
  75. __interrupt void software_trap23 (void) {for(;;);}  
  76. __interrupt void software_trap22 (void) {for(;;);}  
  77. __interrupt void software_trap21 (void) {for(;;);}  
  78. __interrupt void software_trap20 (void) {for(;;);}  
  79. __interrupt void software_trap19 (void) {for(;;);}  
  80. __interrupt void software_trap18 (void) {for(;;);}  
  81. __interrupt void software_trap17 (void) {for(;;);}  
  82. __interrupt void software_trap16 (void) {for(;;);}  
  83. __interrupt void software_trap15 (void) {for(;;);}  
  84. __interrupt void software_trap14 (void) {for(;;);}  
  85. __interrupt void software_trap13 (void) {for(;;);}  
  86. __interrupt void software_trap12 (void) {for(;;);}  
  87. __interrupt void software_trap11 (void) {for(;;);}  
  88. __interrupt void software_trap10 (void) {for(;;);}  
  89. __interrupt void software_trap09 (void) {for(;;);}  
  90. __interrupt void software_trap08 (void) {for(;;);}  
  91. __interrupt void software_trap07 (void) {for(;;);}  
  92. __interrupt void software_trap06 (void) {for(;;);}  
  93. __interrupt void software_trap05 (void) {for(;;);}  
  94. __interrupt void software_trap04 (void) {for(;;);}  
  95. __interrupt void software_trap03 (void) {for(;;);}  
  96. __interrupt void software_trap02 (void) {for(;;);}  
  97. __interrupt void software_trap01 (void) {for(;;);}  
  98. #pragma CODE_SEG DEFAULT     
  99.   
  100.   
  101. /*********************************************************************** 
  102. *               INTERRUPT VECTORS 
  103. ***********************************************************************/  
  104.   
  105. typedef void (*near tIsrFunc)(void);  
  106. const tIsrFunc _vect[] @0xFF80 = {     /* Interrupt table                           */  
  107.         software_trap63,      /* 63 RESERVED                               */  
  108.         software_trap62,      /* 62 RESERVED                               */  
  109.         software_trap61,      /* 61 RESERVED                               */  
  110.         software_trap60,      /* 60 RESERVED                               */  
  111.         software_trap59,      /* 59 RESERVED                               */  
  112.         software_trap58,      /* 58 RESERVED                               */  
  113.         software_trap57,      /* 57 PWM Emergency Shutdown                 */  
  114.         software_trap56,      /* 56 Port P Interrupt                       */  
  115.         software_trap55,      /* 55 CAN4 transmit                          */  
  116.         software_trap54,      /* 54 CAN4 receive                           */  
  117.         software_trap53,      /* 53 CAN4 errors                            */  
  118.         software_trap52,      /* 52 CAN4 wake-up                           */   
  119.         software_trap51,      /* 51 CAN3 transmit                          */  
  120.         software_trap50,      /* 50 CAN3 receive                           */  
  121.         software_trap49,      /* 49 CAN3 errors                            */  
  122.         software_trap48,      /* 48 CAN3 wake-up                           */   
  123.         software_trap47,      /* 47 CAN2 transmit                          */  
  124.         software_trap46,      /* 46 CAN2 receive                           */  
  125.         software_trap45,      /* 45 CAN2 errors                            */  
  126.         software_trap44,      /* 44 CAN2 wake-up                           */   
  127.         software_trap43,      /* 43 CAN1 transmit                          */  
  128.         software_trap42,      /* 42 CAN1 receive                           */  
  129.         software_trap41,      /* 41 CAN1 errors                            */  
  130.         software_trap40,      /* 40 CAN1 wake-up                           */   
  131.         software_trap39,      /* 39 CAN0 transmit                          */  
  132.         software_trap38,      /* 38 CAN0 receive                           */  
  133.         software_trap37,      /* 37 CAN0 errors                            */  
  134.         software_trap36,      /* 36 CAN0 wake-up                           */          
  135.         software_trap35,      /* 35 FLASH                                  */  
  136.         software_trap34,      /* 34 EEPROM                                 */  
  137.         software_trap33,      /* 33 SPI2                                   */  
  138.         software_trap32,      /* 32 SPI1                                   */  
  139.         software_trap31,      /* 31 IIC Bus                                */  
  140.         software_trap30,      /* 30 BDLC                                   */  
  141.         software_trap29,      /* 29 CRG Self Clock Mode                    */  
  142.         software_trap28,      /* 28 CRG PLL lock                           */  
  143.         software_trap27,      /* 27 Pulse Accumulator B Overflow           */  
  144.         software_trap26,      /* 26 Modulus Down Counter underflow         */  
  145.         software_trap25,      /* 25 Port H                                 */  
  146.         software_trap24,      /* 24 Port J                                 */  
  147.         software_trap23,      /* 23 ATD1                                   */  
  148.         software_trap22,      /* 22 ATD0                                   */  
  149.         SCI1_ISR,             /* 21 SC11                                   */  
  150.         SCI0_ISR,             /* 20 SCI0                                   */                                
  151.         software_trap19,      /* 19 SPI0                                   */  
  152.         software_trap18,      /* 18 Pulse accumulator input edge           */  
  153.         software_trap17,      /* 17 Pulse accumulator A overflow           */  
  154.         software_trap16,      /* 16 Enhanced Capture Timer Overflow        */  
  155.         software_trap15,      /* 15 Enhanced Capture Timer channel 7       */          
  156.         software_trap14,      /* 14 Enhanced Capture Timer channel 6       */  
  157.         software_trap13,      /* 13 Enhanced Capture Timer channel 5       */  
  158.         software_trap12,      /* 12 Enhanced Capture Timer channel 4       */  
  159.         software_trap11,      /* 11 Enhanced Capture Timer channel 3       */  
  160.         software_trap10,      /* 10 Enhanced Capture Timer channel 2       */  
  161.         software_trap09,      /* 09 Enhanced Capture Timer channel 1       */  
  162.         software_trap08,      /* 08 Enhanced Capture Timer channel 0       */  
  163.         OSTickISR,            /* 07 Real Time Interrupt                    */  
  164.         software_trap06,      /* 06 IRQ                                    */  
  165.         software_trap05,      /* 05 XIRQ                                   */  
  166.         OSCtxSw,              /* 04 SWI - Breakpoint on HCS12 Serial Mon.  */  
  167.         software_trap03,      /* 03 Unimplemented instruction trap         */  
  168.         software_trap02,      /* 02 COP failure reset                      */  
  169.         software_trap01//,    /* 01 Clock monitor fail reset               */  
  170.         //_Startup            /* 00 Reset vector                           */  
  171.    };              


             
后记:
当我完成全部移植工作并测试通过后,我又重新审视了一遍整个移植过程,发现走了许多弯路。这些弯路基本都是因为我对C编译器的特性,尤其是内联汇编的处理不熟悉造成的。比如中断处理函数,其实可以直接写到 OS_CPU_C.C 中。就可以省略了 vector.c 文件了。其实我一开始也是这样做的,但是最初的中断处理函数混合了C 语句和汇编语句,产生了各种莫名奇妙的错误。比如下面的RTI中断处理函数代码:


 
  1. interrupt VectorNumber_Vrti void OSTickISR (void)  
  2. {   
  3.     OSIntNesting++;               // 4~, Notify uC/OS-II about ISR  
  4.     if (OSIntNesting == 1)  
  5.     {     
  6.      __asm   
  7.         {  
  8.             ldx    OSTCBCur     //  3~, OSTCBCur->OSTCBStkPtr = Stack Pointer       
  9.          sts    0, x        //  3~,}                                             
  10.         }  
  11.     }   
  12.     CRGFLG_RTIF = 1;     // clear interrupt flag.               
  13.     OSTimeTick();        // 6~+, Call uC/OS-II's tick updating function   
  14.     OSIntExit ();        // 6~+, Notify uC/OS-II about end of ISR   
  15. }    


对比后来的汇编代码,其实已经离成功很近了,只要将其中的C 语句全部用汇编写成来大功告成了:


 
  1. interrupt VectorNumber_Vrti void OSTickISR (void)  
  2. {   
  3.     __asm   
  4.          {  
  5.           inc    OSIntNesting    
  6.           ldab   OSIntNesting    
  7.           cmpb   #$01               
  8.           bne    OSTickISR1       
  9.           ldx    OSTCBCur          
  10.           sts    0, x    
  11. OSTickISR1:  
  12.           BSET   _CRGFLG, #128   
  13.           jsr    OSTimeTick    
  14.           jsr    OSIntExit                                                        
  15.        }  
  16. }    


其他的代码也一样,都这样改写后就完全不需要 vector.c 文件了。但这里还是将这些本可以省略掉的代码保留下来了,是想记录下一条真实的探索路程。

关键字:μCOS-II  移植笔记  68HCS12  核单片机 引用地址:μC/OS-II 移植笔记 2(FreeScale 68HCS12 核单片机)

上一篇:Freescale 9S12 系列单片机应用笔记(ECT 模块) 1
下一篇:μC/OS-II 移植笔记 1(FreeScale 68HCS12 核单片机)

推荐阅读最新更新时间:2024-03-16 14:53

基于MCU与USB设备控制器IP的设计方案
  1 引言   在传统的计算机系统上常采用串口(如RS232)和并口连接外围设备,但串口和并口都存在着通信速度 慢,接口独占不利于扩展等无法克服的缺点,而通用串行总线(Universal Serial Bus,即USB)因具有传输 速度快、支持热插拔、扩展方便、抗干扰强、成本低、数据传输质量高、节省系统资源等优点而得到了广 泛的应用,当前它已成为计算机最常用的接口之一。   现在USB控制器主要有两种:带USB接口的单片机(MCU) 和纯粹的USB接口芯片。纯粹的USB接口芯片仅处 理USB通信,必须有个外部微处理器来进行协议处理和数据交换。典型产品有Philips公司的PDIUSBD11(I2C 接口)、PDIUSBD12
[单片机]
基于<font color='red'>MCU</font>与USB设备控制器IP<font color='red'>核</font>的设计方案
STM32 文件系统 fatfs 移植笔记详解
1、内存和Flash介绍 stm32 的 flash 地址起始于 0x0800 0000,结束地址是 0x0800 0000 加上芯片实际的 flash 大小,不同的芯片 flash 大小不同。 RAM 起始地址是 0x2000 0000,结束地址是 0x2000 0000 加上芯片的 RAM 大小,不同的芯片RAM也不同。 Flash 中的内容一般用来存储代码和一些定义为 const 的数据,断电不丢失,RAM 可以理解为内存,用来存储代码运行时的数据,变量等等,掉电数据丢失。 stm32 将外设等都映射为地址的形式,对地址的操作就是对外设的操作。 stm32 的外设地址从 0x4000 0000 开始,可以
[单片机]
STM32 文件系统 fatfs <font color='red'>移植</font><font color='red'>笔记</font>详解
大容量Flash型AT91系列ARM微控制器
摘要:主要介绍美国Atmel公司最新推出的基于ARM7TDMI核的AT91FR40162微控制器的体系结构及功能特性。AT91FR40162是对AT91R40008增加了16Mbit的Flash存储器后形成的最终产品。本文对AT91FR40162新增的Flash存储器以及AT91 Flash Uploader软件作重点介绍。 关键词:AT91FR40162 AT91R40008 SRAM Flash 微控制器 引 言   AT91FR40162是美国Atmel公司生产的AT91系列微控制器中的一员,具有ARM7TDMI核、大容量Flash存储器以及片内SRAM和外围。这种微控制器的特点是高性能--32位RISC体系结构、高密度--1
[嵌入式]
AT91RM9200Linux移植笔记(二)-移植u-boot-1.1.6
u-boot的下载地址为http://sourceforge.net/project/showfiles.php?group_id=65938 ,最新的为u-boot-1.1.6,这个版本已经可以很好的支持AT91RM9200 添加PATH环境变量或者修改u-boot的Makefile将之前编译好的工具链路径添加进来 因为我们的开发板配置和at91rm9200dk很类似,因而可以直接使用at91rm9200dk_config的配置,如果相差比较大的话可以添加自己的开发板配置,还要修改诸如flash等的驱动,具体方法可参考u-boot的文档,一种简便的做法是在u-boot已经支持的开发板中参考选择一种较接近板的进行修改。 $ tar
[单片机]
实时操作系统C/OS-II在ARM7上的移植
  引言   目前,嵌入式系统在家电、移动电话、PDA等各种领域的应用日益广泛,程序设计也越来越复杂,这就需要采用一个通用的嵌入式操作系统来对其进行管理和控制。移植了操作系统的嵌入式系统开发,可大大减轻程序员的负担,操作系统提供了多任务的管理功能,只需专注于每个任务的管理。对于不同的应用,可以按照相同的步骤完成系统设计。如果更换硬件平台,则只需要对操作系统进行少量的移植工作,与硬件无关的应用代码完全无需修改,同时,可增强代码的可读性、可维护性和可扩展性。   μC/OS-II是一种专门为微处理器设计的抢占式实时多任务操作系统,具有源代码公开、可移植性和可靠性高等特点。由于μC/OS-II是为嵌入式应用编写的通用软件,故在具体应用
[单片机]
实时操作系统C/OS-II在ARM7上的<font color='red'>移植</font>
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved