임베디드 레시피 책 부셔버리기 시작
C++
복사
Hardware - 개요
임베디드 레시피 책을 산지는 오래지만 이제서야 공부를 시작한다. 임베디드 해킹 쪽으로 기술력을 쌓으려면 해킹 실력도 중요하지만 그 원본이 되는 임베디드 자체에 대해서 좀더 깊이 알고 있어야 한다고 생각한다.
따라서 책이랑 저자의 블로글을 참고해서 공부한 내용을 정리해보려한다. 이번 공부의 목표는 시간안에 공부를 끝맡치는 느낌보다는 오래걸리더라도 모든 내용을 내것으로 체화시키는 것이 목표이다.
하드웨어는 Physical한 현상을 이용하여, 우리가 원하는 대로 동작하도록 만든 전기적인 장치를 말한다.
책에서 저항, 인덕터, 캐패시터가 회로에서 어떤 역할을 하는지 한번에 대답할 수 있는지 물어본다. 혹은 위 회로도를 해석할수 있는지 물어본다. 전자과를 나온사람들은 알 수 도 있지만 나는 잘 모른다. 앞으로 이러한 기초적인 원리에 대해서 학습할 것이다.
초간단 회로이론
저항의 양단에 전압이 V로 걸렸을 때 저항 R에 흐르는 전류 I의 양은 V=IR에 의하여 I=V/R이며 저항의 단위는 옴이라 한다.
캐패시터란 전기를 일시적으로 저장하는 소자이다. 캐패시터는 교류 신호만 통과할 수 있으며 충전과 방전을 반복하여 과도 파형을 만들어내는 기능을 한다.(발진) 또한 보조 배터리처럼 전압을 충전한 다음 전류를 출력하는 기능도 한다. 그리고 노이즈 성분을 그라운드로 흘려버리는 기능을 한다.(바이패스)
인덕터는 코일이라고도 불리며 전류의 변화를 이용하여 번압의 변화를 유도해내는 부품이다. 회로에서 전류가 변하면 그것을 방해하는 방향으로 전압을 유도하는데 이를 역기전력, 유도기전력이라고 부른다.
필터 란 정수기 필터처럼 원하는 신호만 통과시켜주는 역할을 한다. 위 회로도는 LPE Filter로 저주파 영역만 걸러내는 일을 하는 회로이다.
트랜지스터는 전류의 양을 조절하는 레지스터 값을 변화시키는 역할을 한다. 트랜지스터는 npn형과 pnp 형 두가지가 존재한다.
IC 기본
IC는 Intergated Circuit의 약자이며 직접회로라고 한다. 디지털 논리회로를 통해 하나의 패키지로 만든 chip을 IC라고 한다.
IC 스펙을 보면 위 그림과 같이 설명되어있다. NC는 No Connection으로서 아무것도 연결하지 말라는 의미이다. 3번 CLK은 edge trigger를 의미한다. 이는 clock이 올라 갈 때 혹은 내려갈 때 동작하는 것을 의미한다. 나머지는 네이밍 그대로를 뜻한다. 위 사진은 플래시 메모리에서 펌웨어 덤프 뜰때 많이 봤던 형태라 나름 익숙하다.
Timing 및 Spec 읽기
tCE는 CE/라는 신호가 Low로 떨어지고 나서 Output Data가 나올 때 까지의 시간을 뜻한다.
위 Table이 Timing Diagram에 대한 으미로, tCE는 CE/Access time이고 최대 65nS를 넘어서는 안된다는 의미이다. 또 예를 들어 tRC는 Address Line에 흐르는 신호에 대한 Timing Spec으로서 Read Cycle Time이며 최소 65nS를 유지해야 제대로 된 Data를 얻을 수 있다는 의미이다.
Memory의 선정과 XIP
메모리는 크게 RAM과 ROM으로 나눌 수 있다. RAM을 휘발성, ROM을 비 휘발성이라고 부른다. 따라서 전원이 나가면 RAM에 들어있는 Datat도 다 같이 날아가버리며 ROM에는 계속 저장되어 있다.
XIP(Execute In Place)는 메모리 상에서 직접 program/code를 실행 할 수 있는 기술을 말하며 그 기본조건으로는 Random Access가 가능해야한다.
RAM
제일 비싼 램은 SRAM(Static RAM)이며 값싼 램은 DRAM(Dynamic RAM)이다. PSRAM은 DRAM과 SRAM의 장점을 본 떠서 만든 RAM으로 SRAM처럼 보이는 DRAM이라고 보면 된다.
SRAM > PSRAM > DRAM 순으로 가격이 비싸다.
DRAM중 SDRAM은 Synchronous DRAM으로 동기식 DRAM을 뜻하는데, System Bus와 동기를 맞춘다는 뜻으로 거의 CPU의 동작에 맞추어 동작하기 때문에 CPU가 보기에는 최대의 성능을 낼 수 있다는 뜻이다.
DDR SDRAM은 Double Data Rate로서 System Bus와 동기는 System Bus의 Clock으로 맞출 수 있으며 이 bus clock의 상승/하강 edge에서 모두 동작하므로 Data가 두배로 빨리 전송될 수 있는 메모리이다.
ROM
Embedded System에서는 쓰고 지울 수 있는 Flash Memory가 ROM으로 가장 많이 애용된다. ROM은 NOR, NAND 종류가 있다.
여하튼 이런 Memory의 종류를 보니, 보통 Flash Memory 업체에서 RAM에 까지 손을 뻗쳐서 Flash memory와 RAM을 한꺼번에 한 칩에 집적한 선물 포장세트를 만들어 내기에 이르렀으니 이를 일컬어 MCP (Multi chip package)라고 부릅니다.
- http://recipes.egloos.com/4980549
요즘은 NAND + (DDR) SDRAM의 형태에 맞춘 MCP가 유행한다. NAND는 단지 코드 저장용이고 이런 코드를 SDRAM에 복사하여 RAM에서 직접 XIP를 하는 형식으로 발전해 가고 있다.
RAM Memory의 물리적 동작
Memory를 이해하면 System을 이해하는데 많은 도움이 된다. 위 사진은 메모리를 표현하는 사진이며 크게 Address Pin과 Data Pin으로 구성되어 있다.
•
RD : Read
•
WR : write
•
A0~A7 : Address
How CPU Works
CPU는 논리회로의 집합체이다. 만일 8bit CPU에서 0-7번 pin에 약속되어진 신호를 주면 CPU는 그에 해당하는 일을 하는 단순한 원리이다.
CPU 내부에는 여러가지 장치들로 이루어져 있다.(제어장치, 연산장치, 레지스터)
•
제어장치(CU) : 명령어를 해석하여 다른 Unit에 동작을 지시하는 일을 함
•
연산장치(ALU) : 산술연산장치
•
레지스터 : 연산의 결과 등을 임시저장하는 곳
위 그림은 앞서 설명한 CPU에 Embedded System에 걸맞게 여러가지 외부 기능이 더해진 AVR MCU의 구조이다.
CPU 부분은 레지스터, ALU, PC, IR(Memory로부터 명령어를 가져와서 담아 놓는)로 구성되어 있고 그 이외의 주변 장치들로 구성되어 있다.
CPU block 이외에 Flash, UART, I/O 등 여러가지 기능들의 논리회로들이 버스를 통해서 연결되어 한개의 chip 내에 구현되어 있는 것을 MCU(Micro Controller Unit)이라고 부른다.
•
PC : CPU가 실행할 다음 명령어의 주소를 가리킴
•
IR : 주기억장치에서 수행할 명령을 가져오면 명령어 레지스터에 저장된다.
•
Data Register : Address Register가 가리키는 주소의 실제 값
•
ACC : 특수한 레지스터로서, 연산에 사용되는 값들을 저장하며, 연산 결과 값을 잠시 저장하는 역할을 한다.
•
Decoder : IR에 가져온 명령어를 해석하여 CU에 넘김
•
ALU : 산술 연산 담당
word a = 1;
word b = 2;
word c = 3;
word add(void)
{
int temp;
temp = a;
c = a + b;
return;
}
C
복사
CPU 동작을 이해하기 쉽게 예제로 살펴보자. 위 코드를 컴파일하여 나온 어셈 코드를 쉽게 다음처럼 표기하겠다.
주소 어셈
0x1000 LOAD 0x2000
0x1002 ADD 0x2002
0x1004 STORE 0x2004
C
복사
Load, Add, Store 과정을 이 실제 CPU 내부에서 어떻게 처리되는지 살펴보자
1) Load 과정
1.
현재 CPU가 실행하려는 주소는 PC에 들어있는 0x1000
2.
Address Register에 0x1000주소를 넣는다
3.
그 순간 자동을 메모리의 0x1000 주소를 접근하여
4.
그곳에 존재하는 명령어를 읽어서
5.
IR에 저장하고
6.
저장된 명령어는 디코더에서 해석됨과 동시에 PC 값 증가
7.
0x2000번지의 값을 읽어오라는 구나!(LOAD 0x2000)를 해석하여
8.
메모리로부터 0x2000번지의 값(1)을 읽어 오라고 CU가 제어신호를 보낸다
9.
제어 신호에 의해 1의 값을 읽어 Data Register에 저장하고
10.
이 값을 ALU을 통하여 계산을 위해 ACC에 임시 저장한다.
2) ADD 과정
1.
현재 CPU가 실행하려는 주소는 PC에 들어있는 0x1002
2.
Address Register에 0x1002를 넣는 순간
3.
자동으로 0x1002에 존재하는 ADD 0x2002가
4.
IR에 로드되며
5.
전달된 값은
6.
디코더에서 해석되고(이때 PC값 증가)
7.
CU는 해석된 명령어를 실행하기 위해 제어신호를 발생시키며
8.
메모리 0x2002에 접근하여
9.
값을 읽어와
10.
Data Register에 넣고
11.
ALU에서 존재하는 1과 읽어온 2를 더하여 ACC에 결과값을 저장한다(3)
3) Store 과정
1.
실행할 주소는 PC값인 0x1004
2.
Address Register에 전달되고
3.
자동으로 0x1004메모리에 접근하여
4.
0x1004 값을 IR에 저장하고
5.
디코더로 전달하여
6.
디코더에서 값을 해석하여
7.
CU로 값을 전달 후
8.
ALU에 있는 값을 0x2004에 저장할 수 있도록 제어신호를 발생시켜
9.
ACC에 있는 값(3)은 메모리 0x2004 번지에 저장된다.
자세히 보면 LOAD, ADD, STORE 과정 모두 다음과 동일한 흐름으로 작동한다는 것을 알 수있다.
1.
Instruction을 메모리로부터 가져오고(fetch)
2.
가져온 Instruction을 해석하고(Decode)
3.
해석된 Instruction을 실행한다.(Execution)
ARM7 기준으로 3개의 pipe line을 따르며 ARM9의 경우는 5단계를 가진다.
•
ARM9 Pipe Line : Fetch → Decode → Execute → Memory → Write
또한 파이프라이닝을 사용하게되면 PC 값은 항상 Fetch하고 있는 곳을 가리키고 있다(+8). 제사한 설명은 아래를 참조하쟈.