mirror of
https://github.com/dimoniche/Moyka.git
synced 2026-01-30 18:03:31 +03:00
122 lines
5.6 KiB
ArmAsm
122 lines
5.6 KiB
ArmAsm
;********************************************************************************************************
|
||
; uC/CPU
|
||
; CPU CONFIGURATION & PORT LAYER
|
||
;
|
||
; (c) Copyright 2004-2007; Micrium, Inc.; Weston, FL
|
||
;
|
||
; All rights reserved. Protected by international copyright laws.
|
||
;
|
||
; uC/CPU is provided in source form for FREE evaluation, for educational
|
||
; use or peaceful research. If you plan on using uC/CPU in a commercial
|
||
; product you need to contact Micrium to properly license its use in your
|
||
; product. We provide ALL the source code for your convenience and to
|
||
; help you experience uC/CPU. The fact that the source code is provided
|
||
; does NOT mean that you can use it without paying a licensing fee.
|
||
;
|
||
; Knowledge of the source code may NOT be used to develop a similar product.
|
||
;
|
||
; Please help us continue to provide the Embedded community with the finest
|
||
; software available. Your honesty is greatly appreciated.
|
||
;********************************************************************************************************
|
||
|
||
;********************************************************************************************************
|
||
;
|
||
; CPU PORT FILE
|
||
;
|
||
; ARM
|
||
; IAR C Compiler
|
||
;
|
||
; Filename : cpu_a.s
|
||
; Version : V1.17
|
||
; Programmer(s) : JJL
|
||
; JDH
|
||
; ITJ
|
||
;********************************************************************************************************
|
||
|
||
|
||
;********************************************************************************************************
|
||
; PUBLIC FUNCTIONS
|
||
;********************************************************************************************************
|
||
|
||
PUBLIC CPU_SR_Save
|
||
PUBLIC CPU_SR_Restore
|
||
|
||
|
||
;********************************************************************************************************
|
||
; EQUATES
|
||
;********************************************************************************************************
|
||
|
||
CPU_ARM_CTRL_INT_DIS EQU 0xC0 ; Disable both FIQ & IRQ
|
||
|
||
|
||
;********************************************************************************************************
|
||
; CODE GENERATION DIRECTIVES
|
||
;********************************************************************************************************
|
||
|
||
RSEG CODE:CODE:NOROOT(2)
|
||
CODE32
|
||
|
||
|
||
;$PAGE
|
||
;********************************************************************************************************
|
||
; CRITICAL SECTION FUNCTIONS
|
||
;
|
||
; Description : Disable/Enable interrupts by preserving the state of interrupts. Generally speaking, the
|
||
; state of the interrupt disable flag is stored in the local variable 'cpu_sr' & interrupts
|
||
; are then disabled ('cpu_sr' is allocated in all functions that need to disable interrupts).
|
||
; The previous interrupt state is restored by copying 'cpu_sr' into the CPU's status register.
|
||
;
|
||
; Prototypes : CPU_SR CPU_SR_Save (void);
|
||
; void CPU_SR_Restore(CPU_SR cpu_sr);
|
||
;
|
||
; Note(s) : (1) These functions are used in general like this :
|
||
;
|
||
; void Task (void *p_arg)
|
||
; {
|
||
; /* Allocate storage for CPU status register */
|
||
; #if (CPU_CFG_CRITICAL_METHOD == CPU_CRITICAL_METHOD_STATUS_LOCAL)
|
||
; CPU_SR cpu_sr;
|
||
; #endif
|
||
;
|
||
; :
|
||
; :
|
||
; CPU_CRITICAL_ENTER(); /* cpu_sr = CPU_SR_Save(); */
|
||
; :
|
||
; :
|
||
; CPU_CRITICAL_EXIT(); /* CPU_SR_Restore(cpu_sr); */
|
||
; :
|
||
; :
|
||
; }
|
||
;
|
||
; (2) CPU_SR_Restore() is implemented as recommended by Atmel's application note :
|
||
;
|
||
; "Disabling Interrupts at Processor Level"
|
||
;********************************************************************************************************
|
||
|
||
CPU_SR_Save
|
||
MRS R0, CPSR
|
||
|
||
CPU_SR_Save_Loop
|
||
; Set IRQ & FIQ bits in CPSR to DISABLE all interrupts
|
||
ORR R1, R0, #CPU_ARM_CTRL_INT_DIS
|
||
MSR CPSR_c, R1
|
||
MRS R1, CPSR ; Confirm that CPSR contains the proper interrupt disable flags
|
||
AND R1, R1, #CPU_ARM_CTRL_INT_DIS
|
||
CMP R1, #CPU_ARM_CTRL_INT_DIS
|
||
BNE CPU_SR_Save_Loop ; NOT properly DISABLED (try again)
|
||
BX LR ; DISABLED, return the original CPSR contents in R0
|
||
|
||
|
||
CPU_SR_Restore ; See Note #2
|
||
MSR CPSR_c, R0
|
||
BX LR
|
||
|
||
|
||
;$PAGE
|
||
;********************************************************************************************************
|
||
; CPU ASSEMBLY PORT FILE END
|
||
;********************************************************************************************************
|
||
|
||
END
|
||
|