2017-03-14 4 views
0

권한 모드로 전환 했으므로 Cortex-M3의 SysTick 타이머에 액세스하려고합니다. 나는 그것을하고있다cortex-m3의 권한 모드로 전환

/* Active previlige mode */ 
asm ("mov r0, #0x0"); 
asm ("msr control, r0"); 
asm ("ISB"); 

그러나 SYST_CSR 레지스터를 쓸 수 없기 때문에 작동하지 않는다. YES이면이 작업을 수행하는 데 예외 항목이 필요합니다. 어떻게?

+0

에서 SysTick 타이머 코드 예제 및 기타 물건을 가지고, 모드 그냥 내가 두 개의 스택 포인터 또는 일부의 두 가지를 생각하는 당신을 줄 레지스터 집합과 전체 크기의 암에서 다른 모드와 같은 경험이 아닙니다. 당신은 정말로 모드를 전환 할 이유가 필요합니다. 지금까지 나는 하나를 모른다. –

+1

사용자 및 권한 모드를 두 개의 다른 스택 포인터 msp 및 psp와 혼동하지 마십시오. 그들은 함께 사용될 수 있지만 다른 것들입니다. 인터럽트는 항상 msp를 사용합니다. 다른 코드는 msp 또는 psp를 사용할 수 있습니다. 시작시의 모드 인 SYST_CSR에 액세스하려면 특권 모드 여야합니다. –

+0

내가 작업 한 대부분의 베어 메탈 (비 RTOS) 시스템은 항상 권한 모드에 있으며 msp 만 사용합니다. 베어 메탈 시스템에서 사용자 모드로 전환하면 코드가 더 안전 해지지 만 복잡성은 증가합니다. RTOS에서 RTOS와 인터럽트는 msp를 사용하고 스레드는 psp를 사용합니다. 솔직하게 말하면, MPU를 사용하지 않는 한 실제로 사용자와 권한 모드의 모든 이점을 얻지 못합니다. –

답변

2

사용자 모드에서 권한을 직접 모드로 설정할 수 없습니다 (권한 모드에서 직접 사용자 모드로 변경할 수 있음). SVC 통화 (수퍼바이저 통화)를 통해이 작업을 수행해야합니다. 당신은 그러나 어셈블러에서 당신이 asm("svc, #1");

#1을 사용할 수 있습니다, 당신이 C에서 그것을 할 경우 SVC 호출이 컴파일러에 따라 달라집니다 올리는 방법

는 숫자가 될 수 있습니다. 이것은 SVC 처리기에서 사용할 수 있습니다. 이 목적으로 만 SVC 처리기를 사용하려는 경우 핸들러에서 숫자를 디코딩 할 필요가 없으며 위의 어셈블리를 사용하여 권한을 상승시킬 수 있습니다. 그러나 SVC를 하나 이상의 목적으로 사용하려면 번호를 해독해야합니다. # 1은 권한을 높이기위한 것이고, # 2는 다른 일을하는 것입니다. 여기서 가장 중요한 점은 SVC 전화가 걸렸을 때 사용했던 스택에 번호가 표시됩니다 (msp 또는 psp). 스택을 한 번만 사용했다면 더 쉽습니다. 사용자 가이드에서 스택 프레임을 찾아야합니다.

그래서 SVC 처리기를 구현해야합니다. 웹에서 몇 가지 예를 찾아야합니다. "ARM Cortex-M3 및 Cortex M4에 대한 확실한 안내서"책의 좋은 예가 있습니다.

+0

GCC 구문의 경우 'asm ("SVC# 11");' –

0

Janathan Valvano이 http://users.ece.utexas.edu/~valvano/arm/#Timer

당신은 타이머에 액세스하려면 우선 모드를 전환 할 필요가없는
; SysTickInts.s 
; Runs on LM4F120/TM4C123 
; Use the SysTick timer to request interrupts at a particular period. 
; Daniel Valvano 
; September 11, 2013 

; This example accompanies the book 
; "Embedded Systems: Introduction to ARM Cortex M Microcontrollers" 
; ISBN: 978-1469998749, Jonathan Valvano, copyright (c) 2013 
; Volume 1, Program 9.7 

; "Embedded Systems: Real Time Interfacing to ARM Cortex M Microcontrollers", 
; ISBN: 978-1463590154, Jonathan Valvano, copyright (c) 2013 
; Volume 2, Program 5.12, section 5.7 
; 
;Copyright 2013 by Jonathan W. Valvano, [email protected] 
; You may use, edit, run or distribute this file 
; as long as the above copyright notice remains 
;THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED 
;OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF 
;MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. 
;VALVANO SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, 
;OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. 
;For more information about my classes, my research, and my books, see 
;http://users.ece.utexas.edu/~valvano/ 

NVIC_ST_CTRL_R  EQU 0xE000E010 
NVIC_ST_RELOAD_R  EQU 0xE000E014 
NVIC_ST_CURRENT_R  EQU 0xE000E018 
NVIC_ST_CTRL_COUNT EQU 0x00010000 ; Count flag 
NVIC_ST_CTRL_CLK_SRC EQU 0x00000004 ; Clock Source 
NVIC_ST_CTRL_INTEN EQU 0x00000002 ; Interrupt enable 
NVIC_ST_CTRL_ENABLE EQU 0x00000001 ; Counter mode 
NVIC_ST_RELOAD_M  EQU 0x00FFFFFF ; Counter load value 
NVIC_SYS_PRI3_R  EQU 0xE000ED20 ; Sys. Handlers 12 to 15 Priority 

     AREA |.text|, CODE, READONLY, ALIGN=2 
     THUMB 
     EXPORT SysTick_Init 

; **************SysTick_Init********************* 
; Initialize SysTick periodic interrupts, priority 2 
; Input: R0 interrupt period 
;  Units of period are 1/clockfreq 
;  Maximum is 2^24-1 
;  Minimum is determined by length of ISR 
; Output: none 
; Modifies: R0, R1, R2, R3 
SysTick_Init 
    ; start critical section 
    MRS R3, PRIMASK    ; save old status 
    CPSID I      ; mask all (except faults) 
    ; disable SysTick during setup 
    LDR R1, =NVIC_ST_CTRL_R   ; R1 = &NVIC_ST_CTRL_R (pointer) 
    MOV R2, #0 
    STR R2, [R1]     ; disable SysTick 
    ; maximum reload value 
    LDR R1, =NVIC_ST_RELOAD_R  ; R1 = &NVIC_ST_RELOAD_R (pointer) 
    SUB R0, R0, #1     ; counts down from RELOAD to 0 
    STR R0, [R1]     ; establish interrupt period 
    ; any write to current clears it 
    LDR R1, =NVIC_ST_CURRENT_R  ; R1 = &NVIC_ST_CURRENT_R (pointer) 
    STR R2, [R1]     ; writing to counter clears it 
    ; set NVIC system interrupt 15 to priority 2 
    LDR R1, =NVIC_SYS_PRI3_R  ; R1 = &NVIC_SYS_PRI3_R (pointer) 
    LDR R2, [R1]     ; friendly access 
    AND R2, R2, #0x00FFFFFF   ; R2 = R2&0x00FFFFFF (clear interrupt 15 priority) 
    ORR R2, R2, #0x40000000   ; R2 = R2|0x40000000 (interrupt 15 priority is in bits 31-29) 
    STR R2, [R1]     ; set SysTick to priority 2 
    ; enable SysTick with core clock 
    LDR R1, =NVIC_ST_CTRL_R   ; R1 = &NVIC_ST_CTRL_R 
; ENABLE SysTick (bit 0), INTEN enable interrupts (bit 1), and CLK_SRC (bit 2) is internal 
    MOV R2, #(NVIC_ST_CTRL_ENABLE+NVIC_ST_CTRL_INTEN+NVIC_ST_CTRL_CLK_SRC) 
    STR R2, [R1]     ; store a 7 to NVIC_ST_CTRL_R 
    ; end critical section 
    MSR PRIMASK, R3    ; restore old status 
    BX LR       ; return 

    ALIGN       ; make sure the end of this section is aligned 
    END        ; end of file 
+1

C에서 훨씬 쉽습니다. –