⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 os_cpu_a.s

📁 The LN2410SBC is a high performance single board computer based on ARM920T (MMU included). Its ultra
💻 S
字号:
@::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@                                                                             @
@   uC/OS-II ARM porting source                                               @
@   version 2.52                                                              @
@                                                                             @
@   CyberLab 2003.11.25                                                       @
@   www.armkorea.com                                                          @
@     by redizi                                                               @
@                                                                             @
@::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

   .text                @ AREA ???, CODE, READONLY
   .code 32             @ CODE32


   .global  OSStartHighRdy
   .global  OSCtxSw
   .global  OSIntCtxSw

   .global  OSTaskSwHook
   .global  OSRunning
   .global  OSTCBHighRdy

   .global  OSTCBCur
   .global  OSPrioCur
   .global  OSPrioHighRdy

   .global  OSIntNesting
   .global  OSTimeTick
   .global  OSIntExit

   .equ   OS_TASK_USERMODE, 0

@::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@-----------------------------------------------------------------------------@
@  uC/OS Porting Core Function : OSStartHighRdy                               @
@::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
OSStartHighRdy :
   BL       OSTaskSwHook         @ Call user defined task switch hook
   LDR      r0, =OSRunning       @ Indicate that multitasking has started
   MOV      r1, #1
   STRB     r1, [r0]
   LDR      r0, =OSTCBHighRdy    @ r0 <= &OSTCBHighRdy
   LDR      r0, [r0]             @ r0 <=  OSTCBHighRdy

@@ context restored
   LDMIA    r0!, {r12, r14}
   MSR      spsr_fsxc, r12
   LDMIA    r0, {r0-r14}^
   NOP
   MOVS     pc, r14


@::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@-----------------------------------------------------------------------------@
@  uC/OS Porting Core Function : OSIntCtxSw                                   @
@::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
OSIntCtxSw:
   ADD      sp, fp, #4

@@ set variables
   BL       OSTaskSwHook               @ Call user defined task switch hook
   LDR      r1, =OSPrioHighRdy         @ r1 <= &OSPrioHighRdy
   LDR      r0, =OSPrioCur             @ r0 <= &OSPrioCur
   LDRB     r3, [r1]                   @ r3 <=  OSPrioHighRdy
   STRB     r3, [r0]                   @ OSPrioCur = OSPrioHighRdy
   LDR      r1, =OSTCBHighRdy          @ r1 <= &OSTCBHighRdy
   LDR      r0, =OSTCBCur              @ r0 <= &OSTCBCur
   LDR      r2, [r1]                   @ r2 <=  OSTCBHighRdy
   STR      r2, [r0]                   @ OSTCBCur = OSTCBHighRdy

@@ context restored
   LDMIA    r2!, {r12, r14}
   MSR      spsr_fsxc, r12
   LDMIA    r2, {r0-r14}^
   NOP
   MOVS     pc, r14

@::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@-----------------------------------------------------------------------------@
@  uC/OS Porting Core Function : OSCtxSw                                      @
@::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
OSCtxSw:

@@ context saved
   LDR      r0, =OSTCBCur              @ r0 <= &OSTCBCur
   LDR      r0, [r0]                   @ r0 <=  OSTCBCur

   MRS      r12,  SPSR                 @ load spsr
   STR      r12,  [r0], #8             @ save spsr
   LDMFD    sp!,  {r2, r3}             @ load r0, r1
   STMIA    r0!,  {r2, r3}             @ save r0, r1
   LDMFD    sp!,  {r2, r3, r12, r14}   @ load r2, r3, r12, r14
   STR      r14,  [r0, #-12]           @ save return address
   STMIA    r0,   {r2-r14}^            @ save r2-r14

@@ set variables
   BL       OSTaskSwHook               @ Call user defined task switch hook
   LDR      r1, =OSPrioHighRdy         @ r1 <= &OSPrioHighRdy
   LDR      r0, =OSPrioCur             @ r0 <= &OSPrioCur
   LDRB     r3, [r1]                   @ r3 <=  OSPrioHighRdy
   STRB     r3, [r0]                   @ OSPrioCur = OSPrioHighRdy
   LDR      r1, =OSTCBHighRdy          @ r1 <= &OSTCBHighRdy
   LDR      r0, =OSTCBCur              @ r0 <= &OSTCBCur
   LDR      r2, [r1]                   @ r2 <=  OSTCBHighRdy
   STR      r2, [r0]                   @ OSTCBCur = OSTCBHighRdy

@@ context restored
   LDMIA    r2!, {r12, r14}
   MSR      spsr_fsxc, r12
   LDMIA    r2, {r0-r14}^
   NOP
   MOVS     pc, r14


@++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
@++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
@++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
@++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


   .global  UCOS_IRQ
   .global  UCOS_SWI

@------------------------------------------------------------------------
@ Handler for SWI
@------------------------------------------------------------------------
UCOS_SWI:
   STMFD    sp!, {r0-r3,r12,lr}     @ registers saved

@@ get the SWI number & prepare the argument 1
   LDR      r0, [lr, #-4]
   BIC      r0, r0, #0xff000000

@@ Context Switching
   CMP      r0, #0x80
   BLEQ     OSCtxSw

   .if OS_TASK_USERMODE
   .global  SWI_Handler

@@ prepare the argument 2
   MOV      r1, sp

   BL       SWI_Handler

   .endif

   LDMFD    sp!, {r0-r3,r12,pc}^    @ registers restored


@@===========================================================================
@@ for S3C2410
@@ Interrupt Control
@@===========================================================================
INTOFFSET     =  0x4a000014

@------------------------------------------------------------------------
@ Handler for IRQ
@------------------------------------------------------------------------
UCOS_IRQ:
   SUB      r14, r14, #4
   STMFD    sp!, {r14}                 @ save return address

@@ context saved
   LDR      r14, =OSTCBCur             @ r0 <= &OSTCBCur
   LDR      r14, [r14]                 @ r0 <=  OSTCBCur

   ADD      r14, r14, #8               @ pointer of armReg[2]: R0
   STMIA    r14, {r0-r14}^             @ save r0-r14
   MRS      r0,  SPSR
   LDMFD    sp!, {r1}
   STMFD    r14, {r0,r1}

@@ OSIntEnter()
   LDR      r0, =OSIntNesting          @ Notify uC/OS-II of ISR
   LDRB     r1, [r0]
   ADD      r1, r1, #1
   STRB     r1, [r0]

@@ process ISR
   LDR      r0, =INTOFFSET
   LDR      r0, [r0]
   MOV      r0, r0, lsl #2
   LDR      r2, =IRQ_TABLE
   
   MOV      lr, pc
   LDR      pc, [r2, r0]

@@ OSIntExit()
   BL       OSIntExit                  @ Notify uC/OS-II of end of ISR

@@ context restored
   LDR      r0, =OSTCBCur              @ r0 <= &OSTCBCur
   LDR      r0, [r0]                   @ r0 <=  OSTCBCur

   LDMIA    r0!, {r12, r14}
   MSR      spsr_fsxc, r12
   LDMIA    r0, {r0-r14}^
   NOP
   MOVS     pc, r14


@========================================================================
@========================================================================
@========================================================================

   .global  UCOS_DisableIRQ
   .global  UCOS_RestoreIRQ
   
@------------------------------------------------------------------------
@ Used in User Mode
   .if OS_TASK_USERMODE

UCOS_DisableIRQ:
   MOV      r0, #0
   MRS      r1, spsr
   TST      r1, #0x80
   ADDEQ    r0, r0, #1
   ORR      r1, r1, #0x80
   MSR      spsr_c, r1
   MOV      pc,lr

UCOS_RestoreIRQ:
   MRS      r1, spsr
   CMP      r0, #0
   ORREQ    r1, r1, #0x80
   BICNE    r1, r1, #0x80
   MSR      spsr_c, r1
   MOV      pc,lr

   .else
@------------------------------------------------------------------------
@ Used in System Mode

UCOS_DisableIRQ:
   MOV      r0, #0
   MRS      r1, cpsr
   TST      r1, #0x80
   ADDEQ    r0, r0, #1
   ORR      r1, r1, #0x80
   MSR      cpsr_c, r1
   MOV      pc,lr

UCOS_RestoreIRQ:
   MRS      r1, cpsr
   CMP      r0, #0
   ORREQ    r1, r1, #0x80
   BICNE    r1, r1, #0x80
   MSR      cpsr_c, r1
   MOV      pc,lr

   .endif


@------------------------------------------------------------------------
@  void UCOS_VectSet(int num, int addr)
@     num  : interrupt number
@     addr : address of the ISR
@------------------------------------------------------------------------
   .global  UCOS_VectSet
UCOS_VectSet:
   mov      r0, r0, lsl #2
   ldr      r2, =IRQ_TABLE
   add      r0, r0, r2
   str      r1, [r0]
   mov      pc, lr




@------------------------------------------------------------------------
@  void armOSCtxSw(void)
@------------------------------------------------------------------------
   .global  armOSCtxSw
armOSCtxSw:
   stmfd    sp!, {lr}
   swi      0x80
   ldmfd    sp!, {pc}

@------------------------------------------------------------------------
@  int armOSSaveIRQ(void)
@------------------------------------------------------------------------
   .global  armOSSaveIRQ
armOSSaveIRQ:
   stmfd    sp!, {lr}
   swi      2
   ldmfd    sp!, {pc}

@------------------------------------------------------------------------
@  void armOSRestoreIRQ(int)
@------------------------------------------------------------------------
   .global  armOSRestoreIRQ
armOSRestoreIRQ:
   stmfd    sp!, {lr}
   swi      3
   ldmfd    sp!, {pc}



   .data
IRQ_TABLE:  .space   4*32

   .END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -