delin17的笔记 https://bbs.21ic.com/?467504 [收藏] [复制] [RSS]

日志

ucOS移植学习

已有 1289 次阅读2011-12-1 06:05 |系统分类:嵌入式系统| ucOS

系统是基于移植到LP17XX,CMD的核


ucOS移植需要重写OS_ENTER_CRITICAL()


第一种方法可通过使用 直接快速操作关中断就可以实现,记得先把要用的寄存器保护好


OS_ENTER_CRITICAL_1:


 CPSID   I 


OS_EXIT_CRITICAL_1:


 CPSIE   I 


第二种方法可以通过同第一种方法,只是多了一个push操作待


//这种方法有问题£?会破坏掉r0的值£?后续还需修改
#define  OS_ENTER_CRITICAL()  __ASM ("PUSH primask;
                                      mov r0, 0;
                                      msr primask, r0 ;");//asm {PUSHF; CLI}            /* Disable interrupts                        */
#define  OS_EXIT_CRITICAL()   __ASM("POP R0;
                                     msr primask, r0 ;")//asm  POPF                   /* Enable  interrupts                        */


现在用第四种方法,


OS_ENTER_CRITICAL_4
    IF OS_CRITICAL_INT_PRIO > 0
      PUSH  {R1,R2}
      LDR  R1, =OS_CRITICAL_INT_PRIO                               ;  Disable priorities between
                                                                        ;  OS_CRITICAL_INT_PRIO & 0xFF


  MSR  BASEPRI,  R1                                            ;  禁能优先级在OS_CRITICAL_INT
                                                                        ;  _PRIO到0xFF的中断
    ELSE
  CPSID   I                                                       ;  Disable all the interrupts
                                                                        ;  禁能所有中断
  PUSH  {R1,R2}
    ENDIF


;如果出现多层嵌套。不会出错
  LDR  R1, =OsEnterSum                                   ;  OsEnterSum++
        LDRB  R2, [R1]
        ADD    R2, R2, #1
        STRB  R2, [R1]
  POP     {R1,R2}
    BX LR



;*********************************************************************************************************
;**  name:   OS_EXIT_CRITICAL
;** Deions:   Exit the critical section  退出临界区
;** Output parameters:     None 无
;** Input parameters:  None 无
;** Returned value:   None 无
;** Created by:    Steven Zhou 周绍刚
;** Created Date:      2007.01.18
;**-------------------------------------------------------------------------------------------------------
;** Modified by:            Ni Likao 倪力考
;** Modified date:          2007.11.02
;**-------------------------------------------------------------------------------------------------------
;*********************************************************************************************************
OS_EXIT_CRITICAL_4
  PUSH    {R1, R2}
  LDR     R1, =OsEnterSum                                         ;  OsEnterSum--
        LDRB    R2, [R1]
        SUB     R2, R2, #1
        STRB    R2, [R1]
  MOV     R1,  #0
  CMP     R2,  #0                                           ;  if OsEnterSum=0,enable
                                                                        ;  interrupts如果OsEnterSum=0,
 IF OS_CRITICAL_INT_PRIO > 0                                         ;  开中断;
          IT EQ
   MSREQ BASEPRI, R1
 ELSE
          IT EQ
   MSREQ  PRIMASK, R1
 ENDIF
            MSR PRIMASK,R1
     POP    {R1, R2}
  BX LR


 


;*********************************************************************************************************
;**  name:   OSStartHighRdy
;** Deions:   Uses the context switcher  to cause the first task to start.
;**                         使用调度器运行第一个任务  
;** Input parameters:     None 无
;** Output parameters:     None 无
;** Returned value:   None 无
;** Created by:    Steven Zhou 周绍刚
;** Created Date:      2007.01.18
;**-------------------------------------------------------------------------------------------------------
;** Modified by:            Ni Likao 倪力考
;** Modified date:          2007.11.02
;**-------------------------------------------------------------------------------------------------------
;*********************************************************************************************************
OSStartHighRdy


        LDR     R4, =NVIC_SYSPRI2                                       ;  set the PendSV exception
                                                                        ;  priority设置PendSV优先级
        LDR     R5, =NVIC_PENDSV_PRI 
        STR     R5, [R4]
     //用户可以知道第一次调用任务切换,PSP等于0
        MOV     R4, #0                                                  ;  set the PSP to 0 for initial 
                                                                        ;  context switch call 使PSP等于0
        MSR     PSP, R4


        LDR     R4, =OSRunning                                          ;  OSRunning = TRUE
        MOV     R5, #1
        STRB    R5, [R4]


        LDR     R4, =NVIC_INT_CTRL                                      ;  trigger the PendSV exception
                                                                        ;  触发软件中断
        LDR     R5, =NVIC_PENDSVSET
        STR     R5, [R4]


        CPSIE   I                                                       ;  enable interrupts at processor
                                                                        ;  level使能所有优先级的中断


      //上面已产生任务切换,程序已切换到系统任务中,因此这里死机是不会导致系统死机。


   //如果此处不设置死机的话,会出现程序后无死循环的话,会使整个程序退出。
OSStartHang
        B       OSStartHang            


 


 


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)