본문 바로가기
코스웨어/15년 스마트컨트롤러

20151127 - 홍준모 ARM~>ASM 2일 차 - 126p~

by 알 수 없는 사용자 2015. 11. 27.
728x90
반응형

책 126p


Exception 발생 조건

-SVC mode

-Power on / reset

-IRQ mode

-Hardware적인 interrupt 발생한 경우

-FIQ mode

-Interrupt 중 fast interrupt가 발생한 경우

-ABT mode

-Access하려는 주소가 없는 주소

-Instruction fetch에 실패한 경우

-UND mode

-Instruction을 decode했는데 ARM이 모르는 경우


Exception 우선 순위

-Reset

-Data abort

-FIQ

-IRQ

-Prefetch abort

-Undefined instruction

-SWI




*CPSR - 현재 mode가 어떤 mode 였는지에 대한 정보가 들어가 있다.

이셉션 핸들러 가 함수고, 리턴이 st





PCS

-Procedure Call Standard

-Register의 쓰임새를 약속한 것

-PCS의 약속들

-함수를 호출할 때 register는 어떻게 사용하는가?

-Return 값은 어떻게 돌려 주는가?

-Stack은 어떨 때, 어떻게 사용되는가?

-위에서 사용된 register 이외의 register의 사용 방법

-현재 표준은 AAPCS (Procedure Call Standard for ARM Architecture)



암은 어큐멀레이터 개념이 없다고 보면 된다.







1). 설명

(1). 리셋 벡터 실행(__vector)

①. 벡터 테이블(__vector) 정의된 익셉션 벡터들중 리셋백터를 실행함

②. 벡터 테이블은 0x0 번지에서부터 워드(4Byte) 할당되어 있음

③. 벡터 테이블에는 8가지 벡터가 정의 되어 있음

__gnu_program_start

전원이 공급될  프로세서에 의해 처음 실행되는 명령어 위치

OS_CPU_ARM_ExceptUndefInstrHndlr

프로세서가 명령어를 분석할  없을  사용

OS_CPU_ARM_ExceptSwiHndlr

SWI 명령어를 실행 시켰을  호출

OS_CPU_ARM_ExceptPrefetchAbortHndlr

프로세서가 정확한 접근 권한이 없이 임의의 주소에서 명령어 접근 시도  발생

OS_CPU_ARM_ExceptDataAbortHndlr

명령어가 접근 권한 없이 임의의 데이터에 접근 시도  발생

OS_CPU_ARM_Reserved

예비로 비여 있는 벡터

OS_CPU_ARM_ExceptIrqHndlr

IRQ 인터럽트 발생시 실행

OS_CPU_ARM_ExceptFiqHndlr

FRQ 인터럽트 발생시 실행

④. 리셋 벡터 값인 __gnu_program_start으로 이동하게 

(2). 워치도그 타이머 정지(__gnu_program_start)

①. __gnu_program_start 처음 부분은 워치도그 타이머를 정지 시킴

②. 초기화 코드를 진행하는 도중 워치 도그 타이머에 의한 리셋이 발생할  있기 때문임

③. 워치도그 타이머 Disable 값을 WDTC_WDMR 저장

(3). 스택 초기화(__gnu_program_start)

①. 6개의 모드  스택을 구성하고 초기화 시킴

②. ARM에서 스택이 사용되는 경우

ü 함수를 실행하기  함수내 범용 레지스터와 링크레지스터 저장시

ü 함수의 인자 개수가 4 이상일 

ü 함수  지역 변수의 사용이 많아질 

ü 함수 내에서 배열이나 구조체가 사용될 

ü 예외 처리에 앞서 레지스터 저장할 

③.  모드를 변경해주고 스택 포인터를 잡아줌

(4). 클럭 설정(asm_pll_init)

①. 시스템에 모든 동작은 클럭에 의해 이루어지므로 MCU 클럭을 설정함

②. bsp.c  PLL_Init() 함수를 호출하여 클럭 설정을 

(5). 외부 SRAM 초기화(asm_ext_sram_init)

①. 외부에 장착되어 있는 SRAM(512K) 사용하기 위해서는 초기화가 이루어 저야 

②. etk.c  Ext_SRAM_Init() 함수를 호출하여 초기화를 

(6). .data섹션 복사(relocate_loop)

①. .data 섹션을 초기화 해줌

②. 2. 항목에서 설명

(7). .bss섹션 클리어(bss_loop)

①. .bss 영역을 0으로 클러어 시킴

②. 3. 항목에서 설명

(8). Main()으로 분기

①. 초기 설정이 완료되면 C 함수를 수행할  있음

②. 프로그램의 main() 함수로 분기가 일어남




여태 arm 이나 avr 함수 호출할때 함수 인자들은 실제로는 레지스터에 값이 저장되고 있었던 것이다.

인자 4개 이상, 5개부터는 스텍에 저장한다.


인텔은 무조건 스텍에 저장. 많이 쓰던 작게쓰던 크게 문제가 될 수 없다.

암은 4개 까지만 레지스터에 저장, 


임베디드는 메모리의 고려가 엄청나게 필요하다. 컨트롤러 쪽에 들어가면

최대한 메모리 작게 쓰고


만약 구조체를 리턴한다고 생각한다면? 어떤식으로 리턴하게 되는 것일까? 인텔은? 암은?

리턴값이 int가 아닌 구조체가 리턴값이면?? 

중간파일을 만들어서 확인하면된다. 이건 책에서도 나오지 않는다.

ret 전에 무슨 짓을 하는지 확인하면 된다.

그냥 인자 값

우리 입장에서는 한줄이지만 한땀한땀 대입하게된다.

그렇기에 정말 왠만하면 구조체 값을 같은 형태에 구조체에 복사하면 안된다.


<숙제>

*인텔에서는 구조체를 어떻게 대입하고 리턴하는가?



예를 들어 인자 2개만 사용하는 함수라고 한다면,

내부변수 사용하는 거 보다 인자 4개까지를 활용해서 변수를 활용하는 것이 좋다.

지역변수는 바뀌면 안되는 레지스터를 사용하기때문에 백업 시켜야 되는 번거로움이 존재하기 때문이다.


그래서 인텔은 값을 못 넣도록 막아놨다. 

EX> mov    eip, 30

이런것이 안된다. 허나, 암은 이것이 되도록 해놨다. 즉, 주의하며 넣어야한다.





안드로이드는 운영체제가 아닌 리눅스 + JRE(자바 컴파일러 <라이센스가 있으므로 돈이 든다.>)



728x90