임베디드 개발(before)/IoT 임베디드 SW 개발자 양성과정

[11일차] 임베디드 시스템의 이해

주운녕 2020. 7. 27. 23:00

저번 주 부로 C언어 강의를 마친 뒤, 이번 주부터 임베디드 시스템에 관해 배우기 시작했다.

강의 내용을 거의 날것 그대로 기록하였는데, 앞으로는 수업을 들으면서 새롭게 알게 된 사실이나, 중요하다 생각되는 내용 위주로 기록해야겠다.

오늘은 전반적으로 새로운 책과 함께 개념적인 부분을 공부하였다. 오후에는 실습키트를 시리얼로 PC와 연결해보았다. cygwin을 설치하여 리눅스 환경에서 소스파일을 작성해보고 컴파일도 해보았다. 그리고 ROM에 저장된 파일이 어떻게 RAM으로 이동되어 MCU에서 구동되는지 직접 메모리의 주소를 찾아가며 낱낱이 알아보았다. 컴파일의 과정에 대해 더 자세히 알 수 있었다.

 

임베디드 시스템의 이

1. 임베디드 시스템의 정의

- 특정 역할을 하는 컴퓨터 시스템

- 임베디드 시스템 하드웨어 구성

2. SMP vs AMP

- SMP : (Symmetric MultiProcessing) 대칭형 다중처리. 두 개 이상의 동일한 프로세서가 하나의 메모리, I/O 디바이스, 인터럽트 등의 자원을 공유하여 단일 시스템 버스를 통해, 각각의 프로세서는 다른 프로그램을 실행하고 다른 데이터를 처리하는 시스템. 두 개 이상의 프로세서가 하나의 컴퓨터 시스템 아키텍처를 공유하도록 연결되어 있는 것.

 

- AMP : (Asymmetric Multi-Processing). 두 개 이상의 각각의 프로세서가 자신만의 다른 특정 기능을 수행하는 컴퓨터 아키텍처. 예를 들어, 하나의 프로세서가 메인 운영체제를 실행, 다른 프로세서가 I/O 오퍼레이션 기능을 전용으로 수행.

 

 

3. SIMD : Single Instruction Multiple Data. 병렬 프로세서. ARM 시리즈. 하나의 명령어로 다량의 데이터를 처리하는 것. (실수 연산이 빨라짐)

 

4. 개발 환경 요소

- Host : 개발용 컴퓨터

- Target : 임베디드 보드(개발대상)

- Tool Chain : 컴퓨터에 설치하여 사용하는 개발 프로그램. Target용 실행파일을 생성할 수 있는 컴파일러, 어셈블러, 링커 등을 칭한다. (windriver DIAB compiler, GNUARM Cross toolchain)

- IDE : IAR 같은 통합개발 환경 (ARM-MDK, KEIL 등)

- Debugger : 디버거. (Trace32)

 

5. 실시간 시스템

- 외부 이벤트를 일정한 시간 내에 처리해야 하는 시스템

- 경성(hard) 실시간 시스템 : 시간 제약을 반드시 지켜야 하는 시스템

- 연성(soft) 실시간 시스템 : 시간 제약이 가급적 지켜져야 하는 시스템

 

6. 실시간 운영체제 (RTOS)

- 실시간 시스템을 구현할 수 있는 운영체제

- 우선순위 기반 스케줄링(다수의 인터럽트 레벨)

(ex : VxWorks, FreeRTOS, Neos(mds사 개발), uC/OS II/III, Nucleus 등)

 

7. 임베디드 시스템 개발환경

- PC

1) 런타임 환경에 대해 크게 신경 쓰지 않고,

2) PC용 개발 툴 사용(비주얼 스튜디오)

2) main() 함수부터 코드 작성 시작.

3) 생성 결과물은 호스트(컴퓨터)와 동일한 타겟(개발 대상). 즉, PC에서 실행된다.

- Embedded System 용 Application

1) 런타임 환경에 대해 자세히 알고 있어야 하고, (.text, .bss, .data 등)

2) 타겟 전용 개발 툴 (ex Code Composer Studio)을 사용

3) startup code부터 코드 작성을 시작.

4) 생성되는 결과물은 대개 호스트와 다른 타겟(ARM 등)에서 실행된다.

 

8. 개발환경 구축하기

- 압축파일을 공유받아 이것저것 설치하였다.

1) Cygwin (시그윈) : 윈도우에서 리눅스 환경을 쓸 수 있게 하는 에뮬레이터. make와 gcc-pc용을 사용할 수 있다.

2) GNU-gcc 4.4.1 : ARM보드를 컴파일 하기 위한 컴파일러. 무료이지만 실수형 포인터 사용 불가.(구매해야 함)

 

9. Toolchain을 사용한 실행 파일 생성 과정

- 전부터 명확히 몰랐던 부분, 그림 한 장으로 요약!

 

10. GCC 컴파일러의 각 단계별 작업 옵션 (arm-none-eabi은 arm용 컴파일러)

1) gcc -E : 전처리 작업 (전처리 파일 .cc 생성)

2) gcc -S : 리스트 작업

3) gcc -c : 컴파일 작업

4) gcc -o : 링크 출력 작업

 

11. 실행 파일이 아직 ROM에 있는 상태 Load View(LMA)에서는 heap과 stack 생성되지 않은 상태. RAM(FLASH)에 올라간 뒤(Virtual View(VMA)) 부터 .heap과 stack이 생긴다.

- 아래에서 text, rodata, ARM.exidx는 (LMA)실행 전 (VMA)실행 후 의 주소가 동일하게 ROM에 위치하지만 .data .bss 등 부터는 RAM으로 이동하면서 주소가 바뀌게 된다.

objdump -h imagine : VMA와 LMA 상태의 주소를 확인할 수 있다.

 

12. 로케이터(Linker)

- 컴파일러는 각 소스 코드를 section (.text, .data, .bss) 단위로 나누어 구분시켜 object (*.o)를 생성한다.

- 로케이터(Linker)는 각 object 내의 section을 모아 독립적으로 메모리에 위치시키고 (Locate)

- 링커가 이를 다시 하나로 모아(link) 실행파일 (*.ELF)을 생성한다.

- 생성된 실행파일은 저장 위치인 NV Memory(Non-Volatile memory(비휘발성 메모리)) 에 위치하나, 

- 실행할 때 RAM 영역으로 이동된다. 9번, 11번 글 다시 참조.

 

13. 타겟 모델 구성하기 1 - 가장 기본 유형

- .text와 .c는 ROM(NV memory)에서도 실행가능

- ROM에서 .bss와 .DATA는 실행 시 RAM으로 복사되어 실행되며, 이때 주소도 변경된다. (.bss는 0으로 초기화되면서 복사 이동됨. 따라서 ROM내에서는 최소한의 정보만 저장하여 거의 메모리 차지를 안 한다.)

 

14. RAM

- 오늘날 .text와 .c도 RAM으로 복사되어 실행된다. -> 속도, 용량 면에서 RAM이 매우 발전되었기 때문에 최적화 관점에서 합당. (그러나, 임베디드는 다를 수 있다.)

 

15. ROM

- ROM -> PROM -> EPROM -> EEPROM -> FLASH(NOR FLASH)

 


* 개인적인 학습 목적으로 작성한 글이기에 내용에 잘못된 정보가 있을 수 있습니다.