<목차>
2. Microprocessor 아뜰리에(Atelier) - ARM을 파헤치자
- 2.7 ARM-Thub PCS ; Register 사용법
- 2.8 ARM은 Interrupt 냄새를 어떻게 맡는가
- 2.9 ARM SoC(System On Chip)
- 2.10 SoC 안에서 IP끼리의 Bus 규격
3.Software 데꾸바쥬(Decoupage) - Software의 정체와 만들기
- 3.1 Little Endian과 Big Endian
- 3.2 컴파일에 대한 단상
- 3.3 컴파일 공장 이야기
- 3.4 원하는 컴파일을 해보자
- 3.5 PreProcess(-E option)과 #include
PC(Program Counter), LR(Link Register), SP(Stack Pointer)등 특수용법의 Register들이 많이 나왔다. 이외에도 일반 Register들도 쓰이는 쓰임새가 있는데 이에 대한 약속을 APCS(ARM Procedure Call Standard)라고 부른다 이에 맞춰서 Compiler는 기계어를 만들어 낸다.
APCS의 약속의 종류는 크게
모든 레지스터는 사용하기 전에 기존에 들어있는 값을 stack에 저장한 뒤 사용해야 하고, 루틴 끝난 후 복귀할 때는 다시 stack에서 꺼내 복구해줘야 한다.
Exception중에서도 가장 쓸모 있는 건 Interrupt이다. ARM은 Interrupt가 걸리면 어떻게 행동하는가가 바로 Exception처리 중 한가지입니다. 즉, Interrupt가 걸리면 실행 주소가 Exception Vector중에 IRQ나 FIQ Vector로 강제로 바뀌어 지며, 그 Vector에는 실제 Handler로 branch하기 위한 code가 들어 있습니다. IRQ, FIQ Handler는 MCU가 Interrupt에 대한 응답을 말하는 것입니다. Handler 내부에는 Interrupt종류가 다양한데 각각의 Interrupt에 따른 응답을 다릅니다.
MCU 내부에는 IP(Interrupt Controller)가 달려 있고 외부 pin,내부에 있는 선을 확인하여 그 선을 통해서 신호를 주면 Interrupt Controller가 Interrupt여부를 인지하여 IRQ mode로 바뀌어 줍니다.
CPU로의 Interface는 CU부분에서 여기에 몇 번 Interrupt가 들어 왔는지 확인후 그에 맞는 ISR만들어서 응답한다.
Interrupt가 걸려서 ISR을 처리하는 동안 Interrupt가 또 걸리는게 Nesting
??? Interrupt vecotr
대부분의 MCU MPU에 대부분 없음
기계를 다루기 위해서는 bit pattern을 저장ㅇ하고 Data Bus를 통하여 processor에게 던져주면 Prcoessor는 그일을 합니다. 즉 프로그램이란 일련의 기계어 명령의 순차적인 집합이며, 예전에는 이런 기계어 명령을 사람이 직접 Processor에게 입력시켰습니다. 그 이후 -Assembly라는 개념을 도입하게 되었는데, Native Code와 1:1 matching이 되는 그나마 사람이 보기 쉬운 표기 체계를 만들어냈습니다.
Native, Assember라는 것이 특정 Processor에만 통하고, Processor의 경우 특정한 약속된 Bit Pattern에 반응한다는 사실 때문에, 특정 Processor에서만 동작함
C, C++같은 High Level Language compiler의경우 C compilerㄹ를 이용해서 그 Processor에서 동작 가능한 Assembly를 generation하는 형태임
Cross compiler란?
- 실제 target에서 돌아갈 binary image를 PC 상에서 compile 할 수 있게 해주는 환경
- 다른 플렛폼에서(windows, Mac) 다른 플렛폼의(Android, IOS, Embedded) 실행 파일을 만들어 주는 컴파일러를 가르킴
- 예를 들어 Android의 .apk파일(어플리캐이션)을 만들고자 할 때 흔히 사용하는 소프트웨어가 있습니다.
바로 Android studio 입니다. 이 소프트웨어를 실행시킨 후 컴파일하면 실행파일이 만들어 집니다.
이 실행 파일은 windows에서 실행이 불가능 하죠. windows는 .exe파일만 실행 가능하기 때문입니다.
하지만 windows에서 스마트폰을 가상으로 띄우거나 직접 스마트폰에 apk파일을 넣은 후 직접 스마트폰으로 실행하면
어플리케이션은 실행이 잘 됩니다. 즉, 다른 플렛폼인 windows에서 다른 플렛폼에서 작동되는 .apk파일을 만들어 냈죠. 이를 가르켜 '크로스 컴파일' 이라고 합니다. 다시말해서 다른 플렛폼에서 작동되는 실행파일을 만들 때 사용하는 녀석입니다.
컴파일공장의 목적은 바로 우리가 흔히 말하는 Native code의 집합인 Binary Image를 만들어 내는 것이 목적입니다. Binary의 정체는 바로 Processor만이 알아들을 수 있는 Native Code(기계어)의 집합입니다. 인간의 눈으로는 도저히 무슨 말인지 알아낼 수가 없는 뭐 그런 세상의 것입니다. 컴파일의 단상에서 불쑥 튀어나온 그 녀석입니다.
Binary를 만들어 내기 위해서 원료가 필요합니다. 그 원료는 하하 바로 .c나 .h, 그리고 .s 등의 파일들입니다. (.c, .h는 C code와 header 그리고 .s는 ARM assembly file입니다. ) .s의 경우에는 .c를 컴파일하고 나면 Assembly로 만들어 줄 수 있지만, 여러 가지 성능 측면에서 사람이 직접 Assembly로 짠 파일입니다. 뭐 별거 아니지요.
link 개념의 등장
spaghetti.h
#define EQUAL=
typeef struct {
bool memberBool;
int memberInt;
word memberWord;
}structure
spaghetti.c
#include "spaghetti.h"
int zi EQUAL 0;
int rw EQUAL 3;
extern int relocate EQUAL 3;
extern structure recipes [3];
int add(int a, int b);
main()
{
int stack;
volatile int local, local1, local3;
local EQUAL 3;
local EQUAL 4;
local3 EQUAL add (local, local2);
stack +EQUAL local3;
return stack;
}
int add(int a, int b)
{
return(a+b);
}