728x90

커널 이미지 구현

- 개발 도구 설치 : 툴체인 설치, 빌드 자동화 도구 이용

- 커널 포팅 준비 : 커널 소스 설치, 커널 패치

- 리눅스 커널 수정 및 구현 : 빌드 환경파일, cpu 아키텍처 소스, 커널 초기화 코드, 디바이스 드라이버, 커널 컴파일 코드 수정 혹은 구현

 

 

 

개발 환경

- 임베디드 시스템은 개발 환경과 타겟 시스템이 다름

- 호스트 시스템 : 개발 환경과 운용환경이 다를 경우 개발을 위한 환경. 여기서 루트파일 시스템, 어플리케이션 개발 -> 호스트 컴퓨터

- 크로스 컴파일 환경 : 임베디드 시스템을 위한 소프트웨어 개발하기 위해 호스트 시스템 구축하는 개발 환경

- 빌드 루트 : 툴체인과 RFS(root file system)를 보다 쉽게 구축할수 있도록 만든 것

 

 

 

커널 개발 방식

1. 커널을 타겟 보드에서 다운로드하여 직접 수정 사용

2. pc에서 크로스 컴파일러로 커널 이미지 생성 후 타겟에 이식

 

 

크로스 컴파일러 선택

- 타겟 프로세서에 맞는 것을 찾아 사용해야힘

- arm 프로세서를 대상으로 크로스 컴파일러 설치

 

 

 

라즈베리파이 3의 툴체인

- git clone https://github.com/raspberrypi/tools ~/tools

 

 

 

툴체인을 다운받으면 바로 사용할수있는가

- 경로 설정을 하면 어느 디렉토리에서나 사용 가능

1. $path 라는 환경변수에 크로스컴파일러의 경로 추가.

2. bashrc에 적용

 

 

 

커널 소스 컴파일 과정

- ncursesdv, build-essential 패키지 설치 apt 명령어

- 커널 소스 다운

 - kernel.org에서 표준 커널 소스 다운 후 타겟에 맞게 수정,

 * 패치 파일- 하드웨어 제조사에 해당 보드에 맞게 수정 없으면, 개발자가 직접 수정해야함

 

 

라즈베리파이의 리눅스 커널 소스

- git clone --depth=1 https://github.com/raspberrypi/linux.git 

 

 

라즈베리파이3을 위한 기본 설정

- cd linux

- KERNEL=kernel7(64비트 리눅스 커널 생성)

- make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

- bcm2709_defconfig

- make ARCH=arm menuconfig 추가 수정 시

- make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs -j4

- arch/arm/boot에 zImage 커널 파일 생성완료

 

 

 

zImage 분석

- readelf -S zImage

- 14개 색션의 헤더들이 있음

 - 시작 주소 0x3d922c

- bss : 커널에서 전역변수를 사용할때 사용하는 메모리

- stack : 지역변수나 함수들을 호출할때 사용하는 메모리

 

 

 

 

 

 

라즈베리파이 커널 부팅 로고 바꾸기

 

1. 라즈베리파이 커널 다운

- 툴체인 다운

 

- bashrc에 경로 추가

- soruce ~/.bashrc로 적용

 - ncurse-dev, build-essential

 

 

2. 라즈비안 커널 소스 다운

 

 

3. 라즈비안 부팅시 로고 변경

- find 명령어로 logo 파일 검색

- 로고 디렉토리로 사진 옮기기

 

-jpg파일을 ppm 파일로 변경

- ppm 이미지 색상을 변경

- 이미지 색상변경

 

4. 커널 이미지 생성

- KERNEL=kernel7

- 나머지는 디폴트로 커널 설정

- make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2789_defconfig

zImage 생성

- make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs -j4

 

zImage 파일을 kernel7.img로 변경

- mv zImage kernel7.img

-> 이후 sd 카드에 옮기기

 

 

부팅 결과

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

300x250
728x90

커널 소스 분석 환경 준비

커널

- 하드웨어 자원을 효율적으로 사용하게 해주는 소프트웨어

- 리눅스는 커널이 오픈소스로 무료로 사용 변경 수정 가능

- 리눅스 커널은 리눅스 재단에서 버전 관리

 

리눅스 커널 다운로드하는곳

- kernel.org

- tar.xz 압축 파일로 다운로드됨

 

커널 소스

- 압축 파일 안에 대부분 c언어로 작성. 일부는 어셈블리어

 

리눅스 커널 분석에 필요한 환경

- 소스에서 수정이 필요한곳을 찾아 수정해야함

- but 소스코드가 방대하여 함수, 변수, 기능 찾기가 힘듬

- 소스 코드 중 원하는 부분을 찾는 도구를 사용해야함.

- 이클립스의 ctags, cscope, taglist 등 도구 설치 or vim 에디터에 이 도구들 결합하여 사용

 

각 도구별 활용 방법

- 리눅스 터미널에서 vim에 cscope와 plugin 연동해 사용

- vim, cscope, ctags에 taglist.vim, the nerd tree, srcexpl.vim 추가해서 사용

- vim은 기본적인 에디터

- ctags : 프로그램 소스로부터 태그를 생성. 태그는 간단하게 인덱스라 생각하면됨. 함수나 변수, 클래스 맴버, 매크로등 요소들을 인덱스로 생성하여 디비로 만들고. db정보를 이용해 vim 에디터에서 쉽게 변수, 함수 검색

 

ctag 설치 과정

- sudo apt-get install ctags

 

스크립트 존재 확인

- ls -al ./scripts/tags.sh

- make tags ARCH=arm -> 아키텍처를 arm에 국한해서 태그 생성

 

tags 파일 생성 확인

- ls -alh tags

 

 

cscope

- 소스코드 심볼에 대한 인덱스 구성. 이 인덱스를 통해 심볼이 위치한 파일을 찾을 수 있음

- cscope는 ctags가 가진 제약사완 보완해서 같이 사용

 

cscope 설치

- sudo apt-get install cscope

 

arm용 cscope db 생성

- make cscope arch=arm

 

db 파일 생성 확인

- ls -alh cscope.*

 

vim-plug

- 커널 소스분석을 위한 심볼 데이터페이스 생성을 끝낸후 vim에서 쓰면되는데 직관적인 환경 구성을 도움

- vim과 플러그인들을 조합하고 ctag, cscope 연동

- source explorer, nerd tree, tag list 플러그인 등 설치 필요 -> www.vim.org

 

 

설치 방법

- mkdir .vim

- cp download/screxpl.vim .vim

- cp download/nerd_tree.zip .vim

- cp download/taglist_46.zip .vim

- cd .vim

- mkdir plugin

-mv scexpl.vim ./plugin

- unzip nerd_tree.zip

- unzip taglist_46.zip

- ls ./plugin (nerd_tree.vim , scexpl.vim, taglist_46.vim 확인

 

 

 

 

커널 소스 분석하기

커널 소스 다운로드 방법

- 라즈베리파이에 맞는 리눅스 커널 소스

git clone --depth=1 https://github.com/raspberrypi/linux

 

컴파일 방법

- make 명령어 사용

- makefile이라는 파일을 찾아 정의해놓은 소스를 빌드하기 위한 순서대로 수행

- 리눅스 소스 트리 루트에 컴파일러 설정 항목이 있음

- 크로스 컴파일러의 설치 위치가 다를수 있어 변경이 필요할수도 있음

- make 하기전, 아키텍처와 컴파일러 설정. 

export ARCH=arm

export CROSS_COMPILE=aarch64-linux-gnu-

 

 

커널의 부팅과정과 소스코드

- 부트로더에서 커널이 올라올 경우 zImage가 올라와서 압축이 해제됨

- zImage 앞부분 압축 해제 코드/ 뒷부분 :  압축된 커널 내용

 

 

zImage 압축 해제 순서

- 초기화 작업 후 zImage에 내장된 압축 해제 프로그램에서 진행

- piggy.gzip 같은 리눅스 커널을 메모리 상에 압축을 해제해서 올림 

 

압축 해재 후 실행 순서

 

커널의 계층적 구조

 

 

운영체제 커널 분석 - 리눅스 커널 소스 분석

1. 라즈베리파이 커널 소스 다운

- 이후 src 폴더에 옮김

 

2. 운영체제 소스 분석을 위한 도구 다운로드 및 설치

ctag

- 태그 데이터베이스를 만들어 코드에서 찾고자하는 함수가 있을때 함수가 정의된 곳으로 이동시켜줌

 

cscope

- ctags에서 지원하지 않는 함수들을 탐색이 가능

- 일바족으로 ctags, cscope 같이 사용

 

ctag 설치

- sudo apt-get install ctags 

 

 

테크 디비 생성

- 범위 지정 후 메이크

- make tags ARCH=arm

 

cscope 설치

- sudo apt-get install cscopes

 

cscope db 생성

- make scope ARCH=arm

 

vim 플러그인 이용하기

- www.vim.org 서 다운 가능

- source expolorer, nerd tree, taglist 다운

 

 

플러그인 설치

- .vim 디렉토리 생성하여 플러그인 복사

- unzip으로 해제해야함

 

vim과 플러그인 연동 - vim 설정 수정

- vi .vimrc

 

 

라즈베리파이 운영체제 소스 분석

- 커널 소스가 있는 폴더에서 vim 실행

 

- f7, f8, f9 클릭하여 플러그인 켜기

 

- ctrl + h,j,k,l 화면에서 커서 이동

 

커널의 시직 프로그램

init/main.c

 

start_kernel 찾기

- ex mode 진입 : esc + :

- start_kernel 검색

- 왼쪽이 소스 익스플로러, 중간이 소스 에디터, 우측이 함수 목록

 

 

start_kernel로 이동

- start_kernel 엔터

하단 창에 커서가 지정된 함수가 정의 된 곳이 나옴

setup_arch 함수로 이동

- start_kernel 함수 내 setup_arch 함수 위 커서 놓기

- 아래 창으로 이동 후 file path 에서 엔터

이전으로 이동하기

- space

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

300x250
728x90

부트로더 구현

부트로더

- 특정 cpu에서 운영체제나 프로그램 돌릴수있게 cpu 동작에 필요한 기초적인 부분이나 rom, ram, uart 등 기본적인 디바이스들이 동작할수있도록 만들어지는 프로그램

 

u-boot universal bootloader

- arm 기반 소프트웨어 개발시 가장 많이 사용하는 부트로더

 

 

u-boot 로 부트로더 구현시 필요한것

- 하드웨어 초기화로 cpu 클록, 인터럽트, uart, serial, gpio 등 초기화 코드가 있음

-> lolevel_init, board_init_f, board_init_r 등 세가지 루틴으로 할 수 있음

 

 

라즈베리파이 부트로더 구현 과정

- make 파일로 만들어서 제공

- 필요한 환경 설정 -> defconfig

1. 부트로더 소스 다운

 - 호스트에 깃 설치

 - 부트로더 클론

 - 클론한 폴더 확인

2. 부트로더 이미지 생성

 - 크로스 컴파일러 설치

 - 크로스 컴파일러 버전 확인

 - 크로스 컴파일러 환경변수 지정 - export CROSS_COMPILE=크로스 컴파일러 이름

 - 라즈베리파이 환경 설정 - configs 폴더의 rpi_3_defconfig 파일에 환경 설정 존재. 여기서 필요한 장치, 필요없는 파일 지정

 - 부트로더 컴파일

 - u-boot.bin 파일 생성 확인

 - 이미지로 변환

3. 생성된 이미지를 sd카드에 복사

4. sd카드를 라즈베리 파이에 삽입

 - 전원 공급 후 3초이내 스페이스바 클릭 -> uboot 프롬프트로 진입

 

 

펌웨어 구현 과정 실습

 

u-boot 소스코드 분석하여 라즈베리파이 부트로더 구현  - gpio에 연결된 led 기능 제어 실습

1. uboot 소스코드 다운

git clone git://git.denx.de/u-boot.git

2. cross compiler 설치 및 등록

- aarch64-linux-gnu

sudo apt-get install gcc-aarch64-linux-gnu

export 명령어로 교차 컴파일러 등록

- export CROSS_COMPILE=aarch64-linux-gnu-

 

3. uboot 소스코드 분석

find 명령어로 파이 소스 찾기 : find ./ -name *bcm*

find ./ -name *rpi*

rpi_3_defconfig 파일

- 부트로더명을 u-boot에서 ncs-em으로 변경

 

 

 

rpi.h 확인

 

 

rpi.c 확인

- 메모리맵을 확인해보면 물리적 주소가 0x3f00 0000

 

 

4. uboot 소스에 명령어 추가 - gpio 물리적 주소를 통한 led 제어

gpio를 통해 led 제어하는 hello.c 파일 작성

 

gpio 사용하는 방법

1. bootloader 함수 사용하는 방법

2. gpio의 물리적 주소를 사용하는 방법 -> 사용

* 주변장치 물리적 시작 주소 : 0x3f00 0000(데이터시트)

* gpio offset : 20 0000

=> gpio 물리적 시작 주소 : 0x3f20 0000(주변장치 물리적 시작 주소 + gpio offset)

 

 

물리적 주소로 gpio 제어 프로그램 작성 hello.c

- gpset0 : 전압을 가함

- gpclr0 : 전압을 가하지 않음

- 18번 핀 사용하므로 18번 시프트

 

kconfig 수정

- 메뉴컨피그 사용시 항목이 출력되도록 설정

 

 

makefile 수정

- menuconfig 설정시 같이 빌드되도록 hello.o 추가

 

u-boot 환경 설정

- defconfig파일 사용 -> 타겟명이 rpi3이므로 rpi_3_defconfig

make rpi_3_defconfig

menuconfig 설정

- hello 명령어 추가

 

5. uboot 소스에서 부트로더 이미지 생성

크로스 컴파일러 확인

컴파일

u-boot.bin 생성 완료

 

uboot.bin을 sd카드로 옮겨 raspberry pi 부팅

- 이름을  kernel8.img로 변경

 

부팅 후 3초 이내 키보드 입력하여 uboot 명령어 모드 진입

- config_sys_prompt 를 u-boot에서 ncs_em으로 바꿔 다음과 같이 출력

 

led 명령어 수행

 

 

 

 

 

300x250
728x90

펌웨어 설계 문서 분석

펌웨어 구현 개발 도구

- 소스 코드 및 컴파일을 호스트 PC에서 작성 하여 임베디드 보드에 다운로드 후 실행

- 호스트 시스템 : 프로그램 개발 PC환경

- 타겟 시스템 : 프로그램이 실행되는 임베디드 시스템

-> 호스트 시스템과 타겟 시스템 사이 통신, 디버그 정보를 얻기위해 추가적인 개발환경 필요 : 에디터, 컴파일러, 디버거, 링커 등

 

호스트와 타겟 시스템의 운영체제 제한

- 호스트 시스템 운영체제는 대중적인 OS 지원

- 타겟 시스템 : 펌웨어 상태서 하드웨어 스펙에 의존. 

 

운영체제 외 개발에 필요한 도구

- 컴파일 : 소스프로그램을 실행 파일로 변환하는 과정

 

컴파일 과정

1. 전처리 : 소스코드 전처리

2. 컴파일러 : 전처리 코드를 어셈블리 코드로 변환

3. 어셈블러 : 어셈블리 코드를 재배치 가능한 기계어 코드로 변환

4. 링커 : 외부 라이브러리와 기계어 코드를 합쳐 실행가능 기계어 코드 작성

5. 로더 : 메모리에 올려 실행

6. 메모리

- 툴체인 : 소스 파일을 실행파일로 만드는데 사용되는 도구들이 연결된것

 -> 타겟에 따라 다른 툴체인 설치

 

GNU

- gcc, binutill, gnu c library 등이 있으며 버전 의존성 존재

 

라즈베리파이 툴체인 설치 방법

- git에서 다운

 

 

 

 

하드웨어 데이터 시트 분석

펌웨어 구현시 데이터 시트

- 펌웨어는 하드웨어에 의존하는 프로그램

- 마이크로 프로세서 제조사나 평가 보드 제조사의 데이터 시트 기반으로  프로그램 작성

 

라즈베리파이3 예시

- bcm2837(arm cortex-a53 프로세서)의 gpio 

 

bcm2837arm 주변장치에 대한 데이터 시트 분석

- 회로도, 하드웨어 구성, 가이드 등 모든 내용 포함

 

 

 

 

arm 물리적 주소

- 물리적 주소 범위 : 0x3F00 0000 ~ 0x3FFFF FFFF

- 주변장치 버스 어드레스 범위 : 0x7E00 0000 ~

 

 

 

GPIO 레지스터 뷰

- 주변장치 베이스 가상 주소 0x7E00 0000

- GPIO 시작 가상 주소 0x7E20 0000

- GPIO Base offset 0x20 0000(0x7E20 0000 - 0x7E00 0000)

- GPIO 시작 실제 물리 주소 : 0x3F20 0000(0x3F00 0000 + offset)

 

 

개발환경 구축 실습

1. 부트로드 소스 컴파일을 위해 크로스컴파일러 설치

2. 부트로더에 새로운 명령어 추가

 

 

크로스 컴파일러

- 컴파일러가 실행되는 플랫폼이 아닌 다른 플랫폼에서 실행가능한 코드를 크로스 컴파일해주는 컴파일러

- 노트북 <- 크로스 컴파일 -> 라즈베리파이

- 라즈베리파이에서 실행가능하도록 크로스 컴파일

* 크로스 컴파일러 :  aarch64-linux-gnu 사용

 

1. 크로스 컴파일러 설치

2. 유부트 소스에서 라즈베리파이3 부트로더 이미지 생성

- 크로스컴파일러를 지정하는 환경변수 설정

필수 라이브러리 설치

- bison, flex



파이 보드에 맞게 설정 하기

-config 디렉토리 : rpi_3_defconfig폴더에서 지정

- make rpi_3_defconfig

 

부트로더 컴파일

-make

 

 

부트로더 확인

- ls로 컴파일 결과 확인 uboot.bin

 

 

3. 라즈비안 이미지 파일 받고 부트로더 이식하기

- win32diskimager

 

 

라즈비안 이미지 파일 분석

- 커널 이미지 : 부트로더는 커멀 이미지 숫자가 더큰걸 불러옴. kernel7.img

 

 

부트로더 넣기

- uboot.bin -> kernel8.img 로 이름 변경 후

 

 

부트로더 진입

- 부팅 시. 3초 이내 키보드 입력시 uboot 명령어 모드로 진입

- ? 로 명령어 확인

 

 

 

GPIO 명령어로 LED 제어

- 내장 LED는 GPIO29번과 연결

- help gpio로 확인

 

 

 

 

 

 

300x250
728x90

펌웨어 구조 설계하기

부트로더 기능 분류와 공통요소 추출 방법

- 유부트 기본으로 이해하면 쉽게 이해 가능

- 유 부트 디렉토리 구조는 리눅스 디렉토리 구조와유사

 

부트로더 디렉토리 구조

- 타겟에 맞게 수정해야함

- 최상위 유부트 : makefile, board.cfg 등 주요 파일로 모든 유부트 빌드 동작 실행

- arch : 아키텍처별로 서로다른 디렉토리를 구성, 각 프로세서 아키텍처에 따른 소스 구성하는 디렉토리

- board : 각 제조사별 보드 관련 소스를 구현하는 디렉토리

- common : 유부트에서 공통으로 사용하는 소스 구현한 디렉토리, 유부트 명령어, 환경변수등 소스 구현

- driver : gpio, i2c, pci, serial, sound, usb와 같이 외부장치의 드라이버 소스 제공

- fs : fat, yaffs2와 같이 u

 

 

개발 보드에 대한 환결설정 내용은?

라즈베리 파이의 경우

- 기본 환경 설정을 defconfig 파일로 제공 -> 원하는 설정 변경 가능

 

 

 

단위 sw 모듈 설계하기

오픈소스 부터로더에 기능 수정이나 추가 방법

- 원하는 기능에따라 수정 부분, 추가 부분이 상황에 따라 다름

 

 

특정 하드웨어 개발하는 경우

- 수정을 위한 하드웨어 동작 관련 디렉토리 위주로 보면

- 라즈베리파이는 브로드컴사의 bcm.

u-boot root directory

 

 

아키텍처 디렉토리와 소스

- 이에 대해 알아야함

- 아크 디렉토리의 암에 대해 살펴보자

arch directory

 

타겟보드 디렉토리

- 타겟에 따라 다르지만 공통적으로 가지는 걸보자

- 보드 디렉토리 > 제조사 디렉토리 > 보드명 디렉토리

target board directory

부트로더 명령어는 어디에?

- uboot 디렉토리 > cmd 디렉토리 > 부트로더 명령어

- 새 명령어 추가시 cmd 디렉토리에 추가

cmd 디렉토리

 

부트로더에서 하드웨어 제어 방법

1. 디바이스들의 물리적 주소로 직접 접근하여 제어

 - 물리적 주소를 알아야함 -> SoC에 대한 데이터 시트 참고

2. 부트로더에서 제공하는 함수들을 이용하여 제어

 - 어떤 함수가 있는지 알아야함

 

cmd 디렉토리서 hello.c 작성

- do_hello 함수 

- U_BOOT_CMD 정의하여 hello 가 입력시 do_hello 함수 호출하도록 정의

kconfig 파일 수정

- 메뉴 컨피그에서 사용여부 고를수 있도록 설정

 

 

makefile 수정

- 메뉴컨피그에서 사용 설정시 빌드 과정에서 포함하도록 hello.o 추가

 

부트로더에서 헬로 명령어 사용

 

 

1. 유부트 소스 코드를 파이에 맞게 설정

2. 부트로더에 새 명령어 추가

 

 

유부트 소스 코드 파이에 맞게 설정

1. 유부트 소스 받기

git clone git://git.denx.de/u-boot.git

 

2. uboot 소스에서 파이 관련 소스 분석

- 각 디렉토리는 고유한 목적 가짐. 각 디렉토리들을 타겟에 맞게 수정해야함

- makefile : 소프트웨어 빌드시. 컴파일 과정과 소스파일 관계 정의

- 타겟에 맞는 메이크파일을 찾아서 실행

- defconfig (default configuration) 찾기 : find ./ -name defconfig

 

- pi3의 defconfig

3. 유부트 소스에서 파이3 부트로더 관련 환경 설정

 

 

새 명령어 만들기

- cmd 디렉토리에 새 추가 할 명령어 작성

- hello 입력시 hello ncs 출력 함수

 

 

kconfig 파일 수정

-kconfig : 부트로더 컴파일시 설정할 항목들을 서술한 파일

 

makefile 수정

- menuconfig에서 빌드 가능하도록 설정하기

 

menuconfig로 명령어 추가

- make menuconfig 명령어로 kconfig에서 추가한 명령어 설정

- 커멘드 라인 인터페이스 > 헬로 펌웨어 커맨드 설정 후 저장

=> 부트로더에서 핼로 명령어 사용가능해짐

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

300x250
728x90

운영체제 기초 과정 분석 필요 지식

- 펌웨어와 부트로더 이해 필요

 

펌웨어

- 롬에 저장된 소프트웨어

 

임베디드 시스템 구성

1. 큰 임베디드 시스템

- 어플리케이션 소프트웨어

- 부트로더, 운영체제

- 하드웨어

-> 복잡한 기능, 규모가 큰 임베디드 시스템

2. 작은 임베디드 시스템

- 어플리케이션 소프트웨어

- 하드웨어

-> 단순한 기능, 규모가 작은 임베디드 시스템 구성

 

라즈베리파이3 구성

- 어플리케이션 소프트웨어

- 펌웨어(부트로더), 운영체제(리눅스)

- 하드웨어(라즈베리파이)

-> 일반 피씨와 유사한 다양한 어플리케이션 사용 가능

 

아두이노

- 펌웨어

- 하드웨어(아두이노)

-> atmega328 8비트 마이크로 컨트롤러 사용 -> 규모가 작은 임베디드 시스템

 

펌웨어 개발자란?

- 운영체제 없이 마이크로컨트롤러 제어 소프트웨어 개발자

 

부트로더의 역활과 종류

- 운영체제가 시스템에 로드되어 잘 동작하기 위한 사전 작업 준비

1. 하드웨어 초기화

2. 운영체제 동작 환경 구성

3. 운영체제를 메모리로 로드

 

부트로더 특징

- 시스템 하드웨어 의존성이 강함

- 프로세서 구조, 특징, 사용법 이해 필요

- 어셈블리어로 작성. 프로세서에 따른 명령어 사용법 이해 필요

- 크기가 작야아함

- 오픈소스 소프트웨어가 많아 활용하기 용이함

 

 

오픈소스 부트로더 종류

- 모든 하드웨어를 지원하는 부트로더는 없으나 많이 지원하는 오픈소스 부트로더들이 있음

- grub 그럽 : PC 및 서버에서 사용

- u-boot : arm 기반에서 주로 사용

 

운영체제 부트로더 흐름

1. 전원 인가

2. 하드웨어 초기화

3. 커널 부팅

4. 커널 로딩

 

 

exynos-8890 부팅 과정

- exynos-8890 : 최신 프로세서, 작은용량의 롬과 메모리 가짐. 128kb irom, 320 iram 포함

- rom에는 부트 로더가 있어 ram으로 로드함

1. irom에 있는 부트 코드가 실행. om 핀을 확인 하여 어떤 디바이스로 부팅할지 결정

2. bl1코드를 읽어 internal sram에 복사하여 실행 - 하드웨어 초기화 수행

3. b1의 나머지를 dram으로 복사하여 실행

4. 적재된 커널은 부팅 시작

 

 

 

 

라즈베리 파이 부팅 과정

- 라즈비안 2개의 파티션 가짐 :

 1. 부트 파티션

 - 60mb fat32 포멧 필요

 - gpu 초기화에 필요한 코드와 데이터 포함

 - os 커널을 메모리로 가져와 실행하는 역활

 2. 루트 파티션

 - 나머지 os와 모든 파일

 - ext4 리눅스 파일 시스템으로 구성

 

라즈비안 이미지 파일에 무엇이 있는가?

- dtb device tree block :  하드웨어 컴포넌트 데이터베이스 파일. 

- boot code  : 부트로더 파일 

 - cmdline, config : 환경 설정 텍스트 파일

 - kernel.imz, kearnel7.img : 커널

 

 

 

 

 

펌웨어 요구사항 도출하기

임베디드 시스템부팅시 필요한 주변장치

- uart : 병렬 데이터를 직렬 형태로 보내는 장치

- 이더넷 : 네트워크 간 컴퓨터들이 고유의 맥주소를 가지고 주고받을수 있음

- usb : 직렬,병렬 포트등 기존의 연결방식을 대체하기 위해 만들어짐

- gpio : 마이크로프로세서가 주변 장치와 통신을 위해 범용으로 사용하는 비출력 포트(PORTx, DDRx, PINx)

- HDMI : 영상과 음향을 통합한 단자 구격

 

부트로더가 지원해야하는 명령과 동작

- 하드웨어 초기화

- 메모리 복사

- 명령어 복사

 

부트로더 기능과 동작

- 하드웨어 초기화 : 메모리 설정, cpu 클럭 설정, gpio 설정, 시리얼 설정, 네트워크 설정 

- 메모리 복사 : 커널 이미지 램디스크 이미지, 부트로더 자신을 플래시 롬에서 sdram으로 복사

- 커널 부팅 : 커널 이미지를 메모리로 복사 후 압축을 풀고 실행 -> 부트로더는 끝나고, 커널이 제어권 가짐

- 명령어 지원 : 사용자가 부트로더 기능 사용 가능

- 디버깅 모드 : 부트로더 동작 상태를 보면서 에러 부분을 찾을 수 있음

 

 

시스템 부팅 정차에 따른 하드웨어 초기화 과정

1. dram에서 u-boot 실행

2. 보드 초기화 board_init

3. malloc 초기화

4. 플래시 메모리 장치 초기화

5. nand및 oneram 초기화

6. mmc 초기화

7. 환경변수 초기화

8. ip주소 초기화

9. 표준입출력장치 초기화

10. 기타아키텍처 및 보드 관련 초기화

11. 인터럽트 초기화 및 enable

12. 네트워크 디바이스 초기화

13. 메인 루프 실행 common/main.c

 

 

 

u-boot로 부트로더 구조 분석

- u-boot : 암 계열의 부트로더

 

부트로더 3단계

- bl0, bl1 :  칩 벤더에서 제작 및 릴리스하는 코드 영역, 수정 불가

- bl 2 : 일반적으로 사용하는 부트로더

 

u-boot 소스 코드 다운

- 윈도우나 리눅스에서 가능

- 리눅스에서 깃업으로 소스 받음

- git clone git:://git.denx.de/u-boot.git

u-boot 구조 분석

- arch : 각각의 아키텍처에 의존적인 라이브러리 가짐

- board: 보드 관련 소스 제공. 라즈베리파이도 여기있음

 

- driver : uart, gpio 등 외부 장치 관련 드라이버 제공

 

 

 

라즈베리파이3 소스 분석

- find로 bcm 검색

- find ./ -name *bcm*.*

 

- rpi 관련 검색

- find ./-name *rpi*

 

 

오픈소스 부트로더인 uboot 디렉토리 구조와 라즈베리파이 관련 소스 분석 

- 타겟 하드웨어에 맞는 부트로더 개발을 위해 하드웨어 이해와 부트로더 소스 이해 중요

- 구글링으로 정보 검색과 분석 필요

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

300x250
728x90

- 하드웨어 기능 분석

- 요구사항 도출

- 하드웨어 분석 결과 문서화

 

 

 

 

하드웨어 기능 분석

하드웨어 이해가 얼마나 필요할까

- 많이 알수록 좋음

- 하드웨어 개발자가 아니라 소프트웨어 개발자라면 프로그래밍을 위한 하드웨어 구성요소, 회로도, 데이터 시트 이해할수있는 정도

 

하드웨어 구성요소

- 목적에 따라 프로세스, 메모리, 입출력장치, 주변장치들이 결정

- 하나의 보드에서 연결되서 구성

 

라즈베리파이3의 기능 위주로 구성 요소 살펴본다면

- 크기 : 85 mm x 56 mm

- 1GB LPDDR2

- 40개 GPIO Pin 헤더

- 멀티미디어(카메라, 비디오, 사운드) 기능 지원

- sd카드 슬롯

- 전원 공급을 위한 5V 2.5 암페어 dc 마이크로 usb 커넥터로 전원 공급

라즈베리파이3 구성도

 

라즈베리파이의 프로세서

- 하드웨어에서 프로세서/마이크로 컨트롤러 이해가 매우 중요

- 브로드컴사의 BCM2837 SoC 탑재

 

SoC System on Chip

- 전자 시스템 주요 구성요소가 하나의 칩에 결합된 집적회로 IC

 

 

라즈베리파이의 ARM SoC 

- 중앙처리 장치 CPU

- 그래픽 처리장치 GPU

- 메모리

- 타이머

- GPIO

- USB

- I2C

- SPI

- UART

- 주변장치 입출력 회로가 모두 내장됨

 

 

Cortex

- ARM의 최신 프로세서들은 cortex 이름으로 명명됨

- Cortex-A Application : 스마트폰 등 운영체제가 필요한 큰 규모 장치에 사용

- Cortex-M Microcontroller: 소형, 저가, 저전력에 필요한 어플리케이션에 사용

- Cortex-R  Realtime: 자동차, 산업용 제어장치등 실시간 임베디드 서비스에 사용

-> 라즈베리파이는 Cortex A

 

 

메모리

- 라즈베리파이3 : 메모리 1GB LPDDR2 SDRAM

- 회로도에 안보이던데 -> 라즈베리파이3의 메모리 위치. Soc위에 적층형태로 부착(BGA Package)

 

 

전원

- 휴대폰과 같은 마이크로 usb

- 주변장치가 많을수록 전원이 많이 필요

 

주변 장치 전력 소모량

- gpio : 50mA

- 개별 gpio : 16mA

- hdmi 포트 : 50mA

- 카메라 모듈 : 250mA

- 키보드/마우스 : 100mA or 1000mA 이상

 

라즈베리파이3과 일반 PC와의 차이

- 외부 장치들을 연결하여 제어가능한 GPIO핀이 외부 노출

 

임베디드 시스템 규모에 따라 부팅

- 작은 규모 : 마이크로 컨트롤러 이용 -> 이 내부에 플래시 메모리 내장

- 큰 규모 : 외부 플래시 메모리 이용

- 라즈베리파이 : 마이크로 sd 슬롯 이용

 

 

회로도 이해

- 전자공학, 마이크로프로세서 컴퓨터 구조 이해 필요

 

 

시험 요구사항 도출하기

1. 기능요소 정의

2. 시험절차 수립

3. 기능 요소별 동작 기준 수립

 

 

 

하드웨어 기능 단위 및 장치 분류

- CPU와 GPU

-통신 및 네트워크 장치

- 영상 장치

- 음향 장치

- 제어 장치

- 저장 장치

- 사용자 입력 장치나 테스트 장치

- 전원 장치

 

시험 절차 수립

- 장치 구동 순서 분석

- 하드웨어 시험 환경 구성

- 루프백 시험

-> 기능 요소 동잡 기준 수립 필요

 

기능 요소

- 전원인가, 전원 단락, 전원 대기, 프로그램 실행이나 정보 송수신, 영상/음향 입출력

 

 

단계별 시험절차 수립 수행 순서

1. 시험 단계 정의

2. 시험 절차 정의

3. 단계별 테스트 케이스 작성 : 테스트 항목, 사전 조건, 시험 절차

4. 예상 결과 단계 : 전기적 기능, 프로그램 실행, 제어 기능, 정보 교환기능, 미디어 기능

 

 

 

 

하드웨어 분석 결과 문서화

- 기술문서 작성 원칙과 하드웨어 분석 기술 문서 내용 이해 필요

- 기술문서 정의, 특징, 기본원칙 이해 

 

기술문서 작성 원칙

- 대상 고려하여 작성

- 작성된 문서 동료와 함께 검토

- 쉽고 간결하며 깔끔하게 작성

- 사실에 입각, 체계적, 논리적 작성

- 단어나 문장, 그림, 수식 등에서 일관성 유지

- 내용 중복 주의

 

하드웨어 분석기술 작성에 필요한 지식

- 하드웨어 기본 동작 방법

- CPU 명세

- 제어회로 명세

- 저장장치 명세

- 통신인터페이스 명세

- GPIO 명세

 

 

 

하드웨어 분석결과 문서화를 위해 할일

- 하드웨어 구성요소 명세 기술

- 하드웨어 분석 보고서 작성

 

하드웨어 구성요소 명세서 작성 과정

- 하드웨어 레이아웃, 사진 바탕으로 각 부분 명칭 기재

- 하드웨어 기본 성능 및 기능 사항 요약 기술

- 하드웨어 동작을 위한 기본 조건과 환경 기술

- 하드웨어 기본 동작방법 기술

- 마이크로 컨트롤러 기능과 성능 사항 요약 기술

- 시동 프로그램에서 응용프로그램 읽는 경로 기술

- GPIO 핀 배치 및 기능 사항 요약 정리

- 프로그램 실행에 필요한 메모리 맵 등 작성

 

 

 

하드웨어 분석 보고서 

- 하드웨어 분석 결과를 바탕으로 작성

 

하드웨어 분석 결과서 양식 도출

- 분석 결과서 양식에 포함될 항목 식별

- 하드웨어 분석 보고서의 기술 순서 정의

 

하드웨어 분석 결과 보고서 작성 과정

- 모든 내용 포괄하여 분석 결과 보고서 작성

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

300x250
728x90

임베디드 시스템

임베디드 시스템

- 단일 제품이 아닌 시스템에 내장된 부분 시스템

- 전자회로로 구성하면 업그레이드 하기 힘듬 -> 소프트웨어로 구현

-> 마이크로 프로세서에 특정 기능 수행하는 소프트웨어를 저장 => 임베디드 소프트웨어

- 임베디드 시스템 : 컴퓨터 하드웨어와 소프트웨어가 조합하여 특정 목적을 수행하는 시스템

 

 

임베디드 시스템 적용 사례

- 버스, 전철 출입문 단말기 -> 임베디드 시스템 내장

- 모든 사물에 임베디드 시스템이 내장되어 통신하는 Iot 시대

 

임베디드 시스템 특징 case of 스마트폰, 휴대폰

- 폰이 너무 크다면, 비싸면, 베터리가 빨리 준다면 불편

-> 임베디드 시스템 특징 : 더 작고, 가볍고, 오래가는 베터리, 안정적 동작과 개발 노력

 

임베디드 시스템

1. 경량화, 최적화

2. 실시간성

3. 저전력화

4. 멀티미디어 지원

5. 신뢰성

6. 네트워크 지원

 

 

임베디드 시스템 구성

- Hardware + software

- hw : 마이크로 프로세서, 마이크로 컨트롤러, 메모리, 센서, 구동기

- sw : 운영체제, 디바이스 드라이버, 어플리케이션 프로그램, 네트워크 응용

 

 

임베디드 시스템 개발 구조

- 임베디드 소프트웨어(3,4), 임베디드 하드웨어 개발(1,2)로 나누어 진행

1. 하드웨어 개발

2. 펌웨어 개발

3. OS 포팅(이식)/ 디바이스 드라이버 개발

4. 임베디드 어플리케이션 개발

 

 

 

 

임베디드 시스템 개발 과정

1. 설계

2. 시스템 용도 분석

              HW                                                          SW

3. 하드웨어 사양 결정                               소프트웨어 사양 결정

4. 프로세서, 메모리 및 주변장치 선정       OS 사용 여부 및 OS 선정

5. 회로도 설계                                         개발 환경 선정

6. PCB 설계                                            시스템 소프트웨어 설계

7. 하드웨어 조립                                      디바이스 드라이버 설계

8. 하드웨어 시험                                      어플리케이션 설계

9. 시스템 통합

10. 종료

=> 하드웨어 개발, 소프트웨어 개발 팀 긴밀한 협력 필요

 

 

 

 

하드웨어 자료 수집하기

오픈소스 자료 수집 수행 순서

1. 오픈소스 하드웨어 플랫폼 선정

2. 하드웨어 구성도 입수

3. 회로도 입수

4. 부품 리스트 및 데이터 시트 입수

5. 하드웨어 관련 표준 문서 수집

6. 하드웨어 샘플 입수

7. 입수 자료에 대한 형상 관리

 

플랫폼이란?

- 버스 승강장, 기차역에 타고 내리는것을 의미

- IT분야에서 플랫폼, 기능 제공측과 기능 사용측이 만나는 장소

 

 

임베디드 플랫폼

- 원하는 기능을 쉽게 구현해 전자 제어 장치를 개발할수 있도록 제공되는 하드웨어 보드와 소프트웨어 개발 환경

- 특정 기능을 제공하는 완제품이 아니라 누구나 원하는 기능을 쉽게 구현하도록하는 기반

 

대표적인 오픈소스 플랫폼

- 일반 시중 : 아두이노, 라즈베리파이

- 산업 현장에서 주로 사용 : ST 

 

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

1. 마이크로 프로세서 MPU Micro Processor Unit

- CPU ( 연산, 제어장치, 레지스터)를 단일 칩으로 만든 반도체

- 마이크로 프로세서만으로 사용불가 -> 주변 장치 필요

- PC 등 범용 컴퓨터에서 주로 사용

 

2. 마이크로 컨트롤러 MCU Micro Controller Unit

- CPU(마이크로 프로세서) + 메모리(ROM, RAM) + 주변장치 인터페이스 ( 통신, ADC/DAC, Timer 등)

- 싱글 칩 마이크로 컴퓨터

- 임베디드 시스템

- 특정 목적의 기기 제어용으로 주로 사용

=> 최근 임베디드 시스템은 마이크로 컨트롤러를 사용하는것이 보편 적임

* ARM 계열 마이크로 프로세서와 마이크로 컨트롤러를 많이 사용

 

 

ARM 계열이란

- ARM Advanced RISC Machine

- RISC 구조를 가지는 32비트, 64비트 프로세서 군을 부르는 용어

 

ARM 프로세서 특징

- 동작 속도가 빠름

- 내장된 주변장치가 많아 고성능

- 전력 소비가 작다

 

ARM

- 마이크로 프로세서를 만드는 회사 ? no

- 프로세서 코어를 설계해서 다른 제조사에 설계 내용을 지적재산권 IP 형태로 판매

-> 차에 비유하자면 엔진을 설계하는 회사가 있고, 그 설계도로 엔진을 만드는 회사가 따로 있음. ARM은 엔진을 설계하는 회사

 

ARM 계열 프로세서 발전 과정

- 아키텍처 발전과, 성능의 발전과전으로 볼수있음

- 아키텍처는 V4/V4T -> V5

- 최신 암계열은 Cortex라는 이름으로 출시

- 부 이름으로 A(Application), R(Realtime), M(Micro Controller) 의미

- 뒤의 숫자는 성능

ARM 계열 프로세서 발전 과정

 

시중의 마이크로 컨트롤러

- 여러 회사들이 ARM 계열 마이크로 프로세서를 주변 장치(Uart, 입출력 포트, 인터럽트, AD변환기, 타이머) 등을 하나의 칩(마이크로 컨트롤러)로 만들어 판매

- Cortex-M3 마이크로 프로세서 주변에 주변장치를 붙여 Cortex-M3마이크로 컨트롤러가 많이 사용하여 임베디드 소프트웨어 개발

 

ARM 계열 이외 계열

- Atmel 사의 AVR 시리즈 -> 대표적으로 Atmega 128

 

오픈소스 플랫폼 특징

- 아두이노 : 오픈소스 중 가장 대중적인 보드. ATmega328 마이크로 컨트롤러 사용. 매우 저렴. 다양한 자료 제공

- 라즈베리 파이 : 초소형, 초저가 임베디드 보드. 교육용 일환으로 개발. 아두이노와 함께 가장 대중적. 리눅스, 윈도우10 포팅가능

 

 

 

하드웨어 플랫폼 선정후 준비사항

- 하드웨어 구성도 입수해야함

- 입수 경로 : 인터넷 검색, 제작사 제공

 

회로도 입수 다음 과정

- 데이터 시트와 부품 리스트

- 부품 스펙. 용량, 크기를 정해야함

- 데이터 시트 : 부품, 하부시스템(전원 공급장치 등), 소프트웨어 성능, 특성등을 정리한 문서

-> 하드웨어 관련 표준문서 수집

-> 하드웨어 샘플 입수

-> 입수 자료에 대한 형상관리

 

 

 

 

실습

1. 사용자 요구사항

- 소수 관리인이 CCTV 관리가 힘듬

- 사람을 도와 사물을 인식하는 인공지능 CCTV 필요

 

2. 하드웨어 스펙 선정

- 플랫폼 예시 :아두이노, STM, 라즈베리파이

-> 라즈베리 파이 사용

 

3. 운영체제 필요성 파악

- 윈도우, 맥, 리눅스

- 파이에 적합한 라즈비안 사용

- 소프트웨어 : 구글 비전 API

 

4. 개발환경 설정

4.1 운영체제 설치

 - 깃헙에서 라즈비안 소스 다운

 - 소스코드 디렉토리서 make 명령어로 컴파일

 - sd 카드에 이미지 플래시. 에처 주로 사용

 4.2 구글 비전 API 키 발급받기

 - 구글 클라우드 플랫폼 검색, 접속

 - 프로젝트를 생성하고, 클라우드 비전 API서 서비스 계정 키 발급

 

5. 라즈베리파이에 모듈 연결

 - 모니터, 파이카메라 연결

 

6. 임베디드 어플리케이션 설계 및 구현

6.1 VNC를 통한 원격 접속

6.2 관리자 권한 사용 - sudo su

 

300x250
728x90

1) CPU 메모리맵

메모리맵

- 메모리의 주소에 대한 정보

- 메모리 : RAM, ROM, 레지스터

 

레지스터

- CPU에 장착된 디바이스 제어용으로 만든 하드웨어

- 주소가지며, 바이트단위 접근, RW속성을 가져 메모리와 거의 동일

- 데이터 저장이아닌 디바이스 제어용

- 펌웨어 코드는 관련 레지스터 제어로 가능

 

LED 켜고 끄기

- GPIO로 제어

- LED가 연결된 핀을 찾아 해당 핀을 GPIO 관련 레지스터를 출력으로 바꿈

- 출력값을 결정하는 레지스터를 찾아 low로 할지 high 할지 결정

ex) 입출력 설정 레지스터 : 0x2000

    출력 값 레지스터 : 0x2001

*(0x2000) = 0b00000001;

*(0x2001) = 0b00000001;

 

메모리맵

- 레지스터를 통해 디바이스 제어시 반드시 필요

메모리 맵 예시

 

 

프로그램 메모리

-실행 코드가 저장된 메모리

- 128KB 크기의 플래시 메모리

- 16비트 단위 어드레싱 구조 -> 주소값 1개에 16비트 데이터를 저장하고 읽을수 있음

- $ : 16진수/ 0000 : 주소값 -> 16진수 0000부터 FFFF까지 주소값(=64K)을 가지고 한 주소마다 16비트(2byte)가 저장

프로그램 메모리

 

데이터 메모리

- 0000 ~ 001F는 32개 일반 레지스터

- 0020부터 005F 까지는 64개의 IO 레지스터

- 0060부터 10FF까지 160개의 확장 IO 레지스터

- 0100부터 10FF까지 4KB 크기의 내부 SRAM

- 8비트 단위 어드레싱 구조를 가지고 있어 한 주소값에 8비트 저장

 

데이터 메모리

EEPROM

- 0000 ~ 0FFF 주소값 가짐 -> 4KB

EPPROM

 

레지스터 맵

1. 일반 레지스터(32개) 

   - 주소값 : 0000 ~ 001F

   - ALU에 연결되어 산술/논리 연산에 사용됨

2. IO 레지스터(64개)

   - 주소값 : 0020~005F

   - CPU 내부 디바이스 제어

3. 확장 IO 레지스터(160개)

   - 주소값 : 0060 ~ 00FF

   - CPU 내부 디바이스 제어

 

레지스터 서머리

- 레지스터 주소 중 괄호 안 주소값이 유효한 값

- 모든 레지스터는 8비트 크기 가짐.

레지스터 주소

 

300x250
728x90

SoC

- System On Chip

- 하나의 집적회로에 집적된 컴퓨터나 전자 시스템 부품

 

SoC 구성

- 1개 이상 마이크로 컨트롤러 또는 마이크로 프로세서 코어 포함

- 디지털, 아날로그, RF 기능 등이 단일 칩에 구현

- 각 모듈을 IP(Intellectual Property)로 별개 블록을 조립하여 하나의 Chip으로 구성

- System on Board : 보드상에 구현

- 구성 블록 : GPIO, ADC, RTC, Serial port, ARM Core, Timer, RAM, USB, JTAG

 

어플리케이션 프로세서

- 각종 어플리케이션에 사용되는 칩으로 스마트폰, 태블릿 PC에 이용

- CPU, GPU 장착으로 그래픽 연산 가능

 

CISC

- Complex Instruction Set Computer

- 복잡한 명령체계를 가진 CPU

- CPU Core 개발자들이 필요에 따라 명령어를 계속 추가

- 명령어 길이와 개수가 길어져 해석하고 실행하는데 오랜 시간이 걸림

 

RISC

- Reduced Instruction Set Computer

- 실제 쓰이는 명령어는 얼마되지 않아 적은 수의 명령어만으로 구성한 집합

- 복잡한 명령어보다 간단한 명령어의 조합이 유리

- 간단한 하드웨어 구조로 저전력 구현에 유리

 

CISC 방식 CPU

- 인텔 x86

 

RISC 방식 CPU

- AVR, ARM, MIPS 등 대부분 임베디드 CPU

 

AVR 패밀리

- AVR은 Atmel 사의 CPU 시리즈

AVR 시리즈

MegaAVR과 TinyAVR

- ATmega8 : 작은 크기 프로그램에 적합

- ATmega128 : 범용적으로 가장 많이 사용

- AT90CAN128 : CAN 통신 분야에 사용

- AT90PWM38 : PWM 신호 사용시 활용

 

ATMega128

1) Core 특징

- RISC 타입의 하버드 구조

- 133개 명령어

- 1클럭 사이클에 1개 명령어 실행

- 16MHz 최대 동작주파수 => 16 MIPS(Million Instruction Per Second)

- 32개의 범용 레지스터와 주변 장치 제어 레지스터

 

2) AVR 코어

- ALU : 산술/논리연산 담당

- 32개의 8비트 범용 레지스터가 연결

- ALU와 범용 레지스터 -> 1클럭 1사이클로 1개 명령어 실행

- 32개 범용 레지스터 중 6개는 간접 주소 어드레스 용으로 사용

 -> 8비트 레지스터 2개 합쳐 16비트 레지스터로 간주

 -> 이 레지스터 조합을 어드레스로 간주. -> 각각 X/Y/Z 포인터 레지스터라 함

- 프로그램 카운터 PC

 현재 수행할 메모리 위치를 갖고있는 레지스터. PC 확인하면 현재 어떤 레지스터가 실행되고 있는지 확인가능

 

ATmega128 Core 구조

 

플래시 프로그램 메모리

- 비휘발성 -> 전원이 없어도 저장 값이 변경되지 않음

- 소스 코드 컴파일 하여 나온 바이너리를 ISP나 JTAG으로 프로그램을 다운로드

  * ISP는 SPI 인터페이스를 이용

- 크기는 128KB으로 약 10,000회 읽고 쓰기 가능

 

ISP

- In System Programming

- Atmel에서 설계한 방식

- 간단한 ISP 다운로더를 이용한 인터페이스

- SPI 인터페이스는 대표적인 직렬 인터페이스로 칩간 통신에서 자주 사용됨.

 

3) 메모리 구조

1. 프로그램 메모리(명령어) - 플래쉬 메모리(128KB)

2. 데이터 메모리(SRAM) - 변수, 상수값

  -> 내부 SRAM, 외부 SRAM, EEPROM

 

(2) ATmega128 주변장치 종류

1) 주변 장치 종류

주변 장치

- 2개의 8비트 타이머/카운터

- 2개 16비트 타이머/카운터

- 실시간 타이머 카운터

- 6개 PWM 채널

- 출력 비교 모듈레이터 및 아날로그 비교기

- 10비트 AD 변환기

- TWI(Two-Wire Serial Interface) 직렬 인터페이스

- 2개 USART

- SPI 직렬 인터페이스

- 와치독 타이머(CPU가 동작하는지 검사하는)

 

2) GPIO

- General Purpose Input Output Port

- 범용 목적 입력,출력 핀(포트)

- 입력 : 외부 장치가 high or low 신호를 출력하면 그 핀에 해당하는 레지스터를 읽어 그 신호 레벨을 CPU가인지가능

- 출력 : 외부 장치가 해당 핀으로 연결 시 High나 Low 출력해서 보내기 가능

- 내부 레지스터 값을 조정하여 부가 기능 사용 가능

 

3) 기타 주변장치

1. 타이머/카운터

- 타이머 : 스탑워치. 시간 설정시 CPU 입력되는 기본 클럭 신호로 일정하게 알림. 최대 16MHz 클럭 신호 입력가능

- 카운터 : 숫자 세는 용도

- 프리스케일러 : 여러 클럭을 세팅하여 긴 시간을 잴 수 있음

- 2개 8비트 타이머/카운터 : 짧은 시간 체크

- 2개 16비트 타이머/카운터 : 긴 시간 체크

- 실시간 타이머/카운터 : 초단위 시간 체크

 

2. AD컨버터

- 아날로그 신호를 디지털로 바꿔주는 변환기

- 10비트 AD 컨버터는 아날로그 신호를 10비트 짜리 디지털 값(0~1023)로 변환 가능

AD 컨버터

 

3. 인터럽트 컨트롤러

- 인터럽트 : 중간에 끼어들기. 특정 조건에 의해 중간에 다른 일 수행하는것

 ex) CPU가 1초마다 LED on,off 하다가 버튼이 눌렸을때 인터럽트를 통해 버튼이 눌린것을 인지할수있음.

- 인트럽트 컨트롤러 : 인터럽트를 수행하게하는 하드웨어 모듈

- 폴링 : 인터럽트 반대 개념으로 계속 감시하는 방법. 비효율적임

- ATmega128은 35개의 인터럽트 기능 가짐

 

4. TWI 직렬 인터페이스

- TWI Two-wire Serial Interface

- 2개 선으로 칩과 칩 통신에 많이 사용됨

- I2C(inter-integrated Circuit)과 동일 개념

- Protocol이 간편하며 여러 칩 연결시 2개의 선으로 인터페이스 가능

- 주로 제어용으로 사용되며 저속이기 때문에 전용 HW없이 일반 GPIO로 구현가능

- 기본 100kbs, 400kbps Fast mode, 1Mbps Fast Mode Plus

 

ex) TWI 예시

- 마스터 : 마이크로 프로세서, 슬레이브 : ADC, DAC, 마이크로 프로세서

- SDA : 데이터 라인, SCL : 클럭라인

 

5. UART

- Uniersal Asynchronous Serial Receiver And Transmitter

- 범용 비동기 직렬 통신 컨트롤러

- 컴퓨터의 COM1, COM2, COM3, COM4와 연관된 통신 컨트롤러(포트)

- 많은 CPU와 PC 등에 기본 장착.

- UART 포트는 총 9개 신호선가짐

COM(UART) 포트

 

- TxD, RxD, GND 만 연결하면 통신 가능

- 외부 장치와 통신시 전압을 -12v ~ 12V까지 올려야함 -> MAX232 사용

<-> 같은 보드 내 장치와 통신시는 필요없음

ATmega128과 외부 UART 장치 간 비동기 모드 시리얼 통신

 

300x250

+ Recent posts