MDK + STM 32 펌웨어 라 이브 러 리 시작 파일 startupstm32f10x_hd. s 기능 및 주석
27364 단어 [끼 워 넣 기] Cortex - M
전주
1. 스 택 및 더미 초기 화
; Amount of memory (in bytes) allocated for Stack
; Tailor this value to your application needs
; Stack Configuration
; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
;
Stack_Size EQU 0x00000400 ; Stack_Size--- , 0x00000400 ,1K --EQU #define
AREA STACK, NOINIT, READWRITE, ALIGN=3 ; STACK , 0, , 8
Stack_Mem SPACE Stack_Size ; Stack_Size ;Stack_Mem: ; unsigned char Stack_Mem[Stack_Size];
__initial_sp ; __initial_sp, 。
; Heap Configuration
; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
;
Heap_Size EQU 0x00000200 ;
AREA HEAP, NOINIT, READWRITE, ALIGN=3 ;
__heap_base ; __heap_base, 。
Heap_Mem SPACE Heap_Size ; Heap_Size
__heap_limit ; __heap_limit, 。
위 더미 와 스 택 의 구체 적 인 주 소 는 프로젝트 컴 파일 후 발생 하 는 * map 파일 에서 볼 수 있 습 니 다.
2. 인 터 럽 트 벡터 테이블 정의
PRESERVE8 ; 8 。
THUMB ; THUMB 。
; Vector Table Mapped to Address 0 at Reset
AREA RESET, DATA, READONLY ; RESET ,
EXPORT __Vectors ; __Vectors,
EXPORT __Vectors_End ;
EXPORT __Vectors_Size ;
/* ,__Vectors */
__Vectors DCD __initial_sp ; Top of Stack , ,FLASH 0 ,
DCD Reset_Handler ; Reset Handler; , , , 。
DCD NMI_Handler ; NMI Handler
DCD HardFault_Handler ; Hard Fault Handler
DCD MemManage_Handler ; MPU Fault Handler
DCD BusFault_Handler ; Bus Fault Handler
DCD UsageFault_Handler ; Usage Fault Handler
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD SVC_Handler ; SVCall Handler; ,
DCD DebugMon_Handler ; Debug Monitor Handler
DCD 0 ; Reserved
DCD PendSV_Handler ; PendSV Handler; " "--" " ,
DCD SysTick_Handler ; SysTick Handler
; External Interrupts ;
DCD WWDG_IRQHandler ; Window Watchdog
DCD PVD_IRQHandler ; PVD through EXTI Line detect
DCD TAMPER_IRQHandler ; Tamper
DCD RTC_IRQHandler ; RTC
DCD FLASH_IRQHandler ; Flash
DCD RCC_IRQHandler ; RCC
DCD EXTI0_IRQHandler ; EXTI Line 0
DCD EXTI1_IRQHandler ; EXTI Line 1
DCD EXTI2_IRQHandler ; EXTI Line 2
DCD EXTI3_IRQHandler ; EXTI Line 3
DCD EXTI4_IRQHandler ; EXTI Line 4
DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1
DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2
DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3
DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4
DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5
DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6
DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7
DCD ADC1_2_IRQHandler ; ADC1 & ADC2
DCD USB_HP_CAN1_TX_IRQHandler ; USB High Priority or CAN1 TX
DCD USB_LP_CAN1_RX0_IRQHandler ; USB Low Priority or CAN1 RX0
DCD CAN1_RX1_IRQHandler ; CAN1 RX1
DCD CAN1_SCE_IRQHandler ; CAN1 SCE
DCD EXTI9_5_IRQHandler ; EXTI Line 9..5
DCD TIM1_BRK_IRQHandler ; TIM1 Break
DCD TIM1_UP_IRQHandler ; TIM1 Update
DCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation
DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare
DCD TIM2_IRQHandler ; TIM2
DCD TIM3_IRQHandler ; TIM3
DCD TIM4_IRQHandler ; TIM4
DCD I2C1_EV_IRQHandler ; I2C1 Event
DCD I2C1_ER_IRQHandler ; I2C1 Error
DCD I2C2_EV_IRQHandler ; I2C2 Event
DCD I2C2_ER_IRQHandler ; I2C2 Error
DCD SPI1_IRQHandler ; SPI1
DCD SPI2_IRQHandler ; SPI2
DCD USART1_IRQHandler ; USART1
DCD USART2_IRQHandler ; USART2
DCD USART3_IRQHandler ; USART3
DCD EXTI15_10_IRQHandler ; EXTI Line 15..10
DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line
DCD USBWakeUp_IRQHandler ; USB Wakeup from suspend
DCD TIM8_BRK_IRQHandler ; TIM8 Break
DCD TIM8_UP_IRQHandler ; TIM8 Update
DCD TIM8_TRG_COM_IRQHandler ; TIM8 Trigger and Commutation
DCD TIM8_CC_IRQHandler ; TIM8 Capture Compare
DCD ADC3_IRQHandler ; ADC3
DCD FSMC_IRQHandler ; FSMC
DCD SDIO_IRQHandler ; SDIO
DCD TIM5_IRQHandler ; TIM5
DCD SPI3_IRQHandler ; SPI3
DCD UART4_IRQHandler ; UART4
DCD UART5_IRQHandler ; UART5
DCD TIM6_IRQHandler ; TIM6
DCD TIM7_IRQHandler ; TIM7
DCD DMA2_Channel1_IRQHandler ; DMA2 Channel1
DCD DMA2_Channel2_IRQHandler ; DMA2 Channel2
DCD DMA2_Channel3_IRQHandler ; DMA2 Channel3
DCD DMA2_Channel4_5_IRQHandler ; DMA2 Channel4 & Channel5
__Vectors_End ;
__Vectors_Size EQU __Vectors_End - __Vectors ; __Vectors_Size , : -
AREA |.text|, CODE, READONLY ; .text,
3. 리 셋 핸들 러 호출
; Reset handler
Reset_Handler PROC ; ,PROC…ENDP 。
EXPORT Reset_Handler [WEAK] ; Reset_Handler ,
IMPORT __main ; __main( __main C_Library , main())
IMPORT SystemInit ; SystemInit, SystemInit
LDR R0, =SystemInit ;// C SystemInit
BLX R0 ; SystemInit
LDR R0, =__main
BX R0
ENDP
설명: 안내 프로그램 진입main (이 main 은 C Library 의 함수 이 며 main () 이 아 닙 니 다)
4. 인 터 럽 트 벡터 표 구성원 할당 및 인 터 럽 트 서비스 프로그램 정의 (빈 함수)
; Dummy Exception Handlers (infinite loops which can be modified) Dummy ( )
NMI_Handler PROC
EXPORT NMI_Handler [WEAK]
B . ;//
ENDP
HardFault_Handler\
PROC
EXPORT HardFault_Handler [WEAK]
B .
ENDP
MemManage_Handler\
PROC
EXPORT MemManage_Handler [WEAK]
B .
ENDP
BusFault_Handler\
PROC
EXPORT BusFault_Handler [WEAK]
B .
ENDP
UsageFault_Handler\
PROC
EXPORT UsageFault_Handler [WEAK]
B .
ENDP
SVC_Handler PROC
EXPORT SVC_Handler [WEAK]
B .
ENDP
DebugMon_Handler\
PROC
EXPORT DebugMon_Handler [WEAK]
B .
ENDP
PendSV_Handler PROC
EXPORT PendSV_Handler [WEAK]
B .
ENDP
SysTick_Handler PROC
EXPORT SysTick_Handler [WEAK]
B .
ENDP
Default_Handler PROC ; , ,
EXPORT WWDG_IRQHandler [WEAK]
EXPORT PVD_IRQHandler [WEAK]
EXPORT TAMPER_IRQHandler [WEAK]
EXPORT RTC_IRQHandler [WEAK]
EXPORT FLASH_IRQHandler [WEAK]
EXPORT RCC_IRQHandler [WEAK]
EXPORT EXTI0_IRQHandler [WEAK]
EXPORT EXTI1_IRQHandler [WEAK]
EXPORT EXTI2_IRQHandler [WEAK]
EXPORT EXTI3_IRQHandler [WEAK]
EXPORT EXTI4_IRQHandler [WEAK]
EXPORT DMA1_Channel1_IRQHandler [WEAK]
EXPORT DMA1_Channel2_IRQHandler [WEAK]
EXPORT DMA1_Channel3_IRQHandler [WEAK]
EXPORT DMA1_Channel4_IRQHandler [WEAK]
EXPORT DMA1_Channel5_IRQHandler [WEAK]
EXPORT DMA1_Channel6_IRQHandler [WEAK]
EXPORT DMA1_Channel7_IRQHandler [WEAK]
EXPORT ADC1_2_IRQHandler [WEAK]
EXPORT USB_HP_CAN1_TX_IRQHandler [WEAK]
EXPORT USB_LP_CAN1_RX0_IRQHandler [WEAK]
EXPORT CAN1_RX1_IRQHandler [WEAK]
EXPORT CAN1_SCE_IRQHandler [WEAK]
EXPORT EXTI9_5_IRQHandler [WEAK]
EXPORT TIM1_BRK_IRQHandler [WEAK]
EXPORT TIM1_UP_IRQHandler [WEAK]
EXPORT TIM1_TRG_COM_IRQHandler [WEAK]
EXPORT TIM1_CC_IRQHandler [WEAK]
EXPORT TIM2_IRQHandler [WEAK]
EXPORT TIM3_IRQHandler [WEAK]
EXPORT TIM4_IRQHandler [WEAK]
EXPORT I2C1_EV_IRQHandler [WEAK]
EXPORT I2C1_ER_IRQHandler [WEAK]
EXPORT I2C2_EV_IRQHandler [WEAK]
EXPORT I2C2_ER_IRQHandler [WEAK]
EXPORT SPI1_IRQHandler [WEAK]
EXPORT SPI2_IRQHandler [WEAK]
EXPORT USART1_IRQHandler [WEAK]
EXPORT USART2_IRQHandler [WEAK]
EXPORT USART3_IRQHandler [WEAK]
EXPORT EXTI15_10_IRQHandler [WEAK]
EXPORT RTCAlarm_IRQHandler [WEAK]
EXPORT USBWakeUp_IRQHandler [WEAK]
EXPORT TIM8_BRK_IRQHandler [WEAK]
EXPORT TIM8_UP_IRQHandler [WEAK]
EXPORT TIM8_TRG_COM_IRQHandler [WEAK]
EXPORT TIM8_CC_IRQHandler [WEAK]
EXPORT ADC3_IRQHandler [WEAK]
EXPORT FSMC_IRQHandler [WEAK]
EXPORT SDIO_IRQHandler [WEAK]
EXPORT TIM5_IRQHandler [WEAK]
EXPORT SPI3_IRQHandler [WEAK]
EXPORT UART4_IRQHandler [WEAK]
EXPORT UART5_IRQHandler [WEAK]
EXPORT TIM6_IRQHandler [WEAK]
EXPORT TIM7_IRQHandler [WEAK]
EXPORT DMA2_Channel1_IRQHandler [WEAK]
EXPORT DMA2_Channel2_IRQHandler [WEAK]
EXPORT DMA2_Channel3_IRQHandler [WEAK]
EXPORT DMA2_Channel4_5_IRQHandler [WEAK]
;
WWDG_IRQHandler
PVD_IRQHandler
TAMPER_IRQHandler
RTC_IRQHandler
FLASH_IRQHandler
RCC_IRQHandler
EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
DMA1_Channel1_IRQHandler
DMA1_Channel2_IRQHandler
DMA1_Channel3_IRQHandler
DMA1_Channel4_IRQHandler
DMA1_Channel5_IRQHandler
DMA1_Channel6_IRQHandler
DMA1_Channel7_IRQHandler
ADC1_2_IRQHandler
USB_HP_CAN1_TX_IRQHandler
USB_LP_CAN1_RX0_IRQHandler
CAN1_RX1_IRQHandler
CAN1_SCE_IRQHandler
EXTI9_5_IRQHandler
TIM1_BRK_IRQHandler
TIM1_UP_IRQHandler
TIM1_TRG_COM_IRQHandler
TIM1_CC_IRQHandler
TIM2_IRQHandler
TIM3_IRQHandler
TIM4_IRQHandler
I2C1_EV_IRQHandler
I2C1_ER_IRQHandler
I2C2_EV_IRQHandler
I2C2_ER_IRQHandler
SPI1_IRQHandler
SPI2_IRQHandler
USART1_IRQHandler
USART2_IRQHandler
USART3_IRQHandler
EXTI15_10_IRQHandler
RTCAlarm_IRQHandler
USBWakeUp_IRQHandler
TIM8_BRK_IRQHandler
TIM8_UP_IRQHandler
TIM8_TRG_COM_IRQHandler
TIM8_CC_IRQHandler
ADC3_IRQHandler
FSMC_IRQHandler
SDIO_IRQHandler
TIM5_IRQHandler
SPI3_IRQHandler
UART4_IRQHandler
UART5_IRQHandler
TIM6_IRQHandler
TIM7_IRQHandler
DMA2_Channel1_IRQHandler
DMA2_Channel2_IRQHandler
DMA2_Channel3_IRQHandler
DMA2_Channel4_5_IRQHandler
B .
ENDP
ALIGN ;
5. 스 택 및 스 택 초기 화 행위
;*******************************************************************************
; User Stack and Heap initialization--
;*******************************************************************************
IF :DEF:__MICROLIB ; __MICROLIB
EXPORT __initial_sp
EXPORT __heap_base
EXPORT __heap_limit
ELSE
IMPORT __use_two_region_memory ; -- ,
EXPORT __user_initial_stackheap
__user_initial_stackheap ; -- , ,
; , , 。
LDR R0, = Heap_Mem
LDR R1, =(Stack_Mem + Stack_Size)
LDR R2, = (Heap_Mem + Heap_Size)
LDR R3, = Stack_Mem
BX LR
ALIGN
ENDIF
END ;END ,
6. ARM m3 C 는 startup 을 어떻게 호출 합 니까?stm32f10x_hd. s 파일 의?
startup_stm32f10x_hd. s 의 대부분 내용 은 C 에서 호출 된 것 이 아니 라 C 프로그램 전에 실 행 된 것 입 니 다.m3 에 전 화 를 걸 면 0 주소 에서 MSP 를 읽 은 다음 0x4 주소 에서 리 셋 벡터 를 읽 고 리 셋 이상 서비스 프로그램 Reset 으로 이동 합 니 다.Handler.MDK 를 사용 하면 프로젝트 설정 Debug 아래 run to main () 에서 지우 고 디 버 깅 에 들 어가 면 첫 번 째 문장 이 Reset 인 것 을 알 수 있 습 니 다.핸들 러 의 첫 마디. Reset_Handler 는 startupstm32f10x_hd. s 에서 정의 하 는 것 은 시스템 을 초기 화하 고 main 함수 에 들 어 갑 니 다.벡터 표 도 startup. s 에서 정 의 된 것 입 니 다. 왜 프로그램 이 컴 파일 된 후에 벡터 표 가 0 주소 에 있 는 지 에 대해 서 는 벡터 표 앞 에 AREA RESET, CODE, READOnly 와 유사 한 성명 이 있 기 때 문 입 니 다.MDK 에서 생 성 된 분산 로드 파일 에서 RESET 는 플래시 의 0 주소 에 설정 되 어 벡터 시트 의 주 소 를 규정 합 니 다.
막 을 내리다
지령
AREA 의사 명령: AREA 의사 명령 은 코드 세그먼트 나 데이터 세그먼트 이름 을 정의 하 는 데 사 용 됩 니 다.ARM 어 셈 블 리 프로 그래 밍 은 세그먼트 식 디자인 을 사용 하고 하나의 ARM 소스 프로그램 은 적어도 하나의 코드 세그먼트 가 필요 하 며 큰 프로그램 은 몇 개의 코드 세그먼트 와 데이터 세그먼트 를 포함 할 수 있 습 니까?의사 명령 형식: AREA sectionname (, attr 곶 {, attr}... 상용 속성: CODE 속성: 코드 세그먼트 정의 에 사용 되 며, 기본 값 은 READOnly 입 니 다.DATA 속성: 데이터 세그먼트 를 정의 하 는 데 사 용 됩 니 다. 기본 값 은 READWRITE 입 니 다.READOnly 속성: 이 단락 을 제도 로 지정 하고 코드 단락 은 기본적으로 READOnlY 입 니 다.REATWRITE 속성: 읽 고 쓸 수 있 는 이 단락 을 지정 합 니 다. 데이터 세그먼트 의 기본 속성 은 REATWRITE 입 니 다.ALIGN 속성: 정렬 방식 을 지정 합 니 다.ALIGN n 명령 의 정렬 값 은 n 또는 2 ^ n 두 가지 방안 이 있 습 니 다. 여 기 는 두 번 째 방안 으로 뒤의 명령 8 바이트 정렬 을 지정 합 니 다.NOINIT 속성: 이 데이터 세그먼트 는 메모리 셀 만 유지 하고 각 시작 값 을 메모리 셀 에 기록 하지 않 았 습 니 다. 즉, 메모리 셀 값 을 0 으로 초기 화 하 는 것 입 니 다.e.g:AREA STACK, NOINIT, READWRITE, ALIGN=3 ;STACK 세그먼트 를 정의 합 니 다. 메모리 가 0 으로 초기 화 되 고 읽 기와 쓰기 가 가능 하 며 뒤쪽 명령 어 8 바이트 정렬 을 지정 합 니 다.
SPACE: SPACE 는 메모리 셀 을 할당 하고 0 으로 초기 화 합 니 다.unsigned char DataBuf [100] 로 이해 할 수 있 습 니 다.의사 명령 형식: {label} SPACE expr 중: label 메모리 블록 시작 주소 레이 블.expr 가 할당 할 메모리 바이트 수 입 니 다.의사 명령 어 응용 예 는 다음 과 같다. AREA DataRA, DATA, READWROTE;DataRAM DataBuf SPACE 1000 이라는 데이터 세그먼트 를 설명 합 니 다.1000 바이트 공간 할당 e. g: StackMem SPACE Stack_Size;한 단락 의 크기 를 Stack 로 개척 하 다Size 의 메모리 공간 을 창고 로 사용 하기;Stack_Mem: 메모리 블록 시작 주소 표시;서명 되 지 않 은 char DataBuf [100] 와 유사 합 니 다.
IMPORT 와 EXTERN: IMPORT 위조 명령 지시 컴 파일 러 의 현재 기 호 는 원본 파일 에서 정 의 된 것 이 아니 라 다른 원본 파일 에서 정 의 된 것 입 니 다. 원본 파일 에서 이 기 호 를 참조 할 수 있 습 니 다.EXTERN 은 마찬가지 입 니 다.알림 컴 파 일 러 이 레이 블 은 다른 파일 에서 정의 되 지만 이 파일 에서 사용 해 야 합 니 다. 비교적 자주 사용 하 는 방법 은 어 셈 블 리 언어 에서 C 함 수 를 호출 할 때..... 명령 형식: IMPORT symbol {[WEAK]} EXTERN symbol {[WEAK]} 입 니 다. 그 중에서 symbol 은 설명 할 기호 이름 입 니 다.[WEAK] 이 옵션 을 지정 하면 symbol 이 모든 원본 프로그램 에서 정의 되 지 않 으 면 컴 파 일 러 도 오류 가 발생 하지 않 습 니 다. 또한 컴 파 일 러 는 현재 INCLUDE 가 들 어 오지 않 은 라 이브 러 리 에서 이 레이 블 을 찾 지 않 습 니 다.EXPORT 함수 가 WEAK 로 고 를 가지 고 있 고 다른 소스 코드 가 동명 함 수 를 정의 하지 않 았 다 면 연결 할 때 이 함수 입 니 다.그렇지 않 으 면 다른 동명 함수 입 니 다.이 메커니즘 은 클래스 의 계승 과 약간 비슷 하 다. 모두 하나의 함수 가 다른 함 수 를 가 렸 다.다른 것 은 WEAK 의 이 가 려 진 것 은 철저히 다른 함 수 를 사라 지게 하 는 것 이다.e.g:EXPORT Reset_Handler [WEAK] ;외부 에서 Reset 을 정의 하면Handler, 외부 정의 우선 실행, 그렇지 않 으 면 이 파일 의 함수 정의. IMPORTmain
DCD: DCD 는 문자 메모리 셀 을 할당 하고 의사 명령 의 expr 로 초기 화 합 니 다.DCD 의사 명령 이 분 배 된 메모 리 는 글자 정렬 이 필요 합 니 다. 일반적으로 데이터 시트 나 다른 상 수 를 정의 할 수 있 습 니 다.의사 명령 형식: {label} DCD expr {, expr} {, expr}... 그 중: label 메모리 블록 시작 주소 표시.expr 상수 표현 식 이나 프로그램의 레이 블 입 니 다.메모리 할당 바이트 수 는 expr 개수 에 의 해 결 정 됩 니 다.
LDR: 변수의 주 소 를 가 져 와 유 니 버 설 레지스터 (예 를 들 어 R1) 에 넣 습 니 다 – 참조: arm 어 셈 블 리 - ldr 로드 명령, ldr 의사 명령 - 그 글 의 해석 이 약간 어 리 석 습 니 다. COUNT EQU 0x 40003100;COUNT 주 소 는 0x 40003100???????e.g:IMPORT SystemInit LDR R0, =SystemInit ;C 파일 의 SystemInit 함수 주소 가 져 오기
BLX: 되 돌아 오고 상태 전환 명령 을 가 져 옵 니 다.BX: 상태 전환 이 있 는 점프 명령.B: 지정 한 주소 로 이동 합 니 다.
기타
Top of Stack: 스 택 상단 포인터, 벡터 시트 의 시작 에 놓 여 있 습 니 다. FLASH 의 0 주소, 리 셋 후 스 택 상단 지침 을 먼저 불 러 옵 니 다.Reset Handler: 리 셋 이상, 스 택 지붕 을 불 러 온 후 첫 번 째 로 실 행 된 것 이 며 되 돌아 오지 않 습 니 다.Usage Fault Handler: 용법 오류 가 중단 되 었 습 니 다. 일반적으로 사전 추출 값 이나 위치 명령, 데이터 처리 등 오류 가 있 습 니 다.SVCAL Handler: 시스템 호출 이상 은 주로 운영 체제 커 널 서 비 스 를 호출 하기 위 한 것 입 니 다.PendSV Handler: 이상 이 걸 려 있 습 니 다. uCOS - II 로 사용 되 는 컨 텍스트 전환 이상 을 볼 수 있 습 니 다. 이 는 권장 되 는 것 입 니 다. Cortex - M3 는 이상 이 발생 했 을 때 R0 - R3, R12, R13 (스 택 포인터 SP), R14 (링크 주소, 반환 주소 LR 이 라 고도 함, 이상 이 되 돌 아 왔 을 때 사용), R15 (프로그램 카운터 PC, 현재 프로그램 + 4) 를 자동 으로 저장 하기 때 문 입 니 다.중단 완료 시 자동 으로 복 구 됩 니 다. R4 - R11 만 저장 하면 중단 응답 과 컨 텍스트 전환 시간 을 크게 줄 일 수 있 습 니 다.설명: 이 곳 은 인 터 럽 트 레지스터 저장 문제 와 관련 이 있 습 니 다. 모든 실행 모드 에서 그룹 레지스터 가 같은 물리 적 레지스터 를 가리 키 지 않 기 때문에 시스템 에서 특별한 용도 로 사용 되 지 않 습 니 다. 따라서 인 터 럽 트 나 이상 처리 로 모드 전환 을 할 때 서로 다른 모드 (여 기 는 '스 레 드' 와 '특권') 가 같은 물리 적 레지스터 를 사용 합 니 다.레지스터 의 데이터 가 파 괴 될 수 있 습 니 다.이것 도 흔히 말 하 는 '관건 적 인 코드 세그먼트' 와 'l 임계 구역' 이 보호 하 는 원인 이다.SysTick Handler: 타이머, 운영 체제 커 널 시계.