Notice
Recent Posts
Recent Comments
Today
Total
05-03 08:25
Archives
관리 메뉴

Jeongchul Kim

임베디드 플랫폼<1> 마이크로 프로세서 본문

Embedded Linux

임베디드 플랫폼<1> 마이크로 프로세서

김 정출 2015. 12. 19. 01:58

2.1 MPU vs MCU

마이크로프로세서(CPU)

CPU = CPU Core(CPU Architecture) + CPU Peripherals(Controllers)

ARM9 프로세서 = ARM9 Core + USB,Ethernet MAC, UART, ADC, …
> CPU Core

  • CPU Core는 8, 16, 32비트 프로세서로 구분, ARM9 Core는 32비트 리눅스(Linux)구동 가능

  • CPU Core가 하는 일은 소프트웨어를 실행시킨다. 연산 처리 담당

> CPU Peripheral

  • 처리된 연산 결과를 CPU 주변 하드웨어를 제어하는 일




 CPU Core와 Controller 들은 서로 버스(System Bus) 구조로 연결



 Bus 구조는 확장하기 쉽다.


 하드웨어 관점에서 CPU를 선정할 때에는 개발하려는 제품의 하드웨어 사양(Spec.)에서 어떤 회로가 구성하기 어려운 지를 먼저 살펴보고 회로 구성이 어려운 부분들이 최대한 많이 Controller로 내장되어 있는 CPU를 선정하는 것이 좋다.


마이크로 프로세서와 마이크로 컨트롤러의 차이

  • MPU: CPU Core가 CPU의 대부분을 차지할 정도로 소프트웨어 연산 처리 능력에 중점을 둔 CPU

  • MCU: CPU 주변 장치(디바이스)들을 제어할 회로 구성을 간단하게 하기 위해 내부에 포함한 CPU






2.2 소프트웨어로 하드웨어를 제어하는 방법

소프트웨어 관점에서 의 하드웨어 분류

> 하드웨어 내부에 메모리가 있다 / CPU, Ethernet MAC, … / 실행 주체: 능동 소자

> 하드웨어 내부에 메모리가 없다 / LED, Button, Switch, … / 실행 주체: 수동 소자

  *능동 소자: 자기 스스로 제어에 대한 판단 능력이 있는 부품


CPU, Ethernet MAC 같은 부품은 소프트웨어 개발자가 작성한 소프트웨어 실행 코드에 판단을 한다.

즉, 소프트웨어 실행 코드가 CPU Core에 의해 연산 되어 최종적으로는 제어하려는 해당 CPU Peripheral 내부에 있는 레지스터(Register)를 설정하게 됨으로써, 제어하게 된다.


수동 소자 들은 내부에 메모리가 없기 때문에, 능동 소자에 연결하여 간접적으로 제어할 수 있다.


메모리 구조는 TEXT,DATA,BSS,STACK 영역으로 나뉘어진다.

  • TEXT: C 언어 로 작성한 함수 저장

  • DATA: 전역 변수(global variable) 중 초기화되어 있는 전역 변수 저장

  • BSS: 전역 변수 중 초기화되지 않은 전역 변수 저장

  • STACK: 지역 변수(local variable)


메모리에 올라간 실행 코드들은 CPU로 읽혀지는데, 이 때 사용되는 레지스터가 PC(Program Counter)

이 PC가 현재 가리키고 있는 메모리 주소에 있는 실행 코드를 CPU는 CPU Core로 읽어오는데

이 과정을 “Fetch” 다.


읽어온 실행 코드는 Latch라고 불리는 곳에 잠시 저장되어 있으면서 해석되는데 이렇게 해석하는 과정

“Decode”


해석된 코드는 Latch 다음 단계에 있는 레지스터 뱅크(Register Bank)로 전달되었다가 최종적으로는 ALU에 의해 실행된다. 이 과정을 “Execute”


즉 CPU는 전원이 들어와서 나갈 때까지 Fetch -> Decode -> Execute를 무한 반복

CPU Core 내부에 있는 레지스터는 “범용 레지스터”(General Purpose Register) 라고 부른다.

*범용 레지스터 상반되는 개념 <-> SFR (Special Function Register)


소프트웨어로 하드웨어를 제어하는 임베디드 소프트웨어란

CPU Peripheral 내부에 있는 특정 레지스터들의 값을 설정하는 실행 코드



Comments