?????????????о????RTOS?????????е????????????????????????????飬???????????飬???????????????????????????????????????????????????????о?????????????????????????????????????????.???????????????????????????????????????????????ж??????????????????????л?????????????????????????????????????????????????漰?????е?????????????????????????????????bootloader????????????????????????IO???????????顣

????????????????????????ж??????????????????????譚????????????°?????????????????????????????????????ucos/II??stm32????????????????а??????????á???????????????????????????????????????????????????????????????????Ч??????????????и?????????????????????????????????????????linux????е?list_head????????????????????к???????????С?????keilRTX???е??????????????allox()?????????TCB????飬???????????????е????

????????????????OS_CPU_A.ASM??????????????л?????????檔

???????????????????OSCurTCB??OSNewTCB????????????????????cд???????????????????????

???????????????????????????????????????????????OSCtxSw()???????????????????????OSNewTCB??????????????л???

;/*********************** (C) COPYRIGHT 2010 Libraworks *************************
;* File Name : os_cpu_a.asm
;* Author  : Librae
;* Version  : V1.0
;* Date   : 06/10/2010
;* Description : μCOS-II asm port for STM32
;*******************************************************************************/
  IMPORT  OSCurTCB                    ; External references
  IMPORT  OSNewTCB
  IMPORT  OSTaskSwHook
                 
  EXPORT  OSStartTask
  EXPORT  OSCtxSw
  EXPORT  OSIntCtxSw
  EXPORT  OS_CPU_SR_Save                       ; Functions declared in this file
  EXPORT  OS_CPU_SR_Restore     
  EXPORT  PendSV_Handler
   
NVIC_PENDSV_PRI  EQU     0xFFFF0000               ; PendSV priority value (lowest)
NVIC_PENDSVSET   EQU     0x10000000               ; value to trigger PendSV exception
NVIC_INT_CTRL    EQU     0xE000ED04               ; interrupt control state register
NVIC_SYSPRI2     EQU     0xE000ED20               ; system priority register (2)

  PRESERVE8
 
  AREA    |.text|?? CODE?? READONLY
        THUMB
  
         
;********************************************************************************************************
;                                   CRITICAL SECTION METHOD 3 FUNCTIONS
;
;********************************************************************************************************
OS_CPU_SR_Save
    MRS     R0?? PRIMASK   ;???PRIMASK??R0??R0??????
    CPSID   I    ;PRIMASK=1?????ж?(NMI?????FAULT???????)
    BX      LR       ;????
OS_CPU_SR_Restore
    MSR     PRIMASK?? R0     ;???R0??PRIMASK?У?R0?????;open interrupt
    BX      LR    ;????

;/**************************************************************************************
;* ????????: OSStartTask
;*
;* ????????: ???????????е????????
;*
;* ??    ??: None
;*
;* ?? ?? ?: None
;**************************************************************************************/
OSStartTask
        LDR     R4?? =NVIC_SYSPRI2      ; set the PendSV exception priority
        LDR     R5?? =NVIC_PENDSV_PRI
        STR     R5?? [R4]
        MOV     R4?? #0                 ; set the PSP to 0 for initial context switch call
        MSR     PSP?? R4
                                       ;?л????????????????
        LDR     R4?? =NVIC_INT_CTRL     ;rigger the PendSV exception (causes context switch)
        LDR     R5?? =NVIC_PENDSVSET    ;????PendSV?? (causes context switch)
        STR     R5?? [R4]
        CPSIE   I                      ;enable interrupts at processor level
OSStartHang
        B       OSStartHang            ;should never get here
;/**************************************************************************************
;* ????????: OSCtxSw
;*
;* ????????: ???????????л?       
;*
;* ??    ??: None
;*
;* ?? ?? ?: None
;***************************************************************************************/
 
OSCtxSw
  PUSH    {R4?? R5}
        LDR     R4?? =NVIC_INT_CTRL   ;????PendSV?? (causes context switch)
        LDR     R5?? =NVIC_PENDSVSET
        STR     R5?? [R4]
  POP     {R4?? R5}
        BX      LR
  NOP