SlideShare a Scribd company logo
1 of 40
Download to read offline
펌웨어 구조 설계
Hancheol Cho
스파케티 코드 ?
“스파게티 코드는 컴퓨터 프로그램의
소스 코드가 복잡하게 얽힌 모습을
스파게티의 면발에 비유한 표현이다.
스파게티 코드는 작동은 정상적으로
하지만, 사람이 코드를 읽으면서 그
코드의 작동을 파악하기는 어렵다.”
출처
동작하는 코드를 만드는 것은
쉽다.
제대로 만드는것은 어렵다.
소프트웨어 수명
● Xilinx Vivado
“Replacing the 15 year old ISE with Vivado Design Suite took 1000
person-years and cost US $200 million”
Xilinx ISE Xilinx Vivado
소프트웨어 수명
● Palm OS
Palm OS 4 Palm OS 5 WebOS
소프트웨어 수명
● Windows Phone OS
Windows Mobile Windows Phone
소프트웨어 고려사항
재사용성
유지보수성
모듈화
사용 편의성
임베디드 환경이라면?
메모리
속도
아키텍처
● 임베디드 환경에서는 하드웨어 제약이 많음
펌웨어 고려 사항
● 임베디드라는 제약 사항을 고려하여 펌웨어 작성 필요
재사용성
유지보수성
모듈화
사용 편의성
메모리
속도
아키텍처
밸런스 필요
펌웨어 고려 사항
어떻게 밸런스를 맞추지?
재사용성도 유지하면서 속도도 빨라야 하고 ..
모듈화를 많이 하면서 메모리 사용량도 최소화 하고..
펌웨어 고려 사항
펌웨어 고려 사항
● 하드웨어가 다양함
● 각 하드웨어에 대한 깊은 이해를 하고 하드웨어에 최적화된 방법을 검토함
펌웨어 고려 사항
1. 하드웨어 특성을 잘 알고
2. 경험을 쌓고
3. 지속적인 고민을 하고
4. 공부를 게을리 하지
않는다.
펌웨어 고려 사항
● 칩 제조사의 어플리케이션 노트를 활용
- 칩활용에 대한 다양한 예제
- 다른 칩에도 활용 가능한 기술이 많음
펌웨어 고려 사항
● Errata Sheet를 반드시 확인
○ Revision에 따른 차이가 있을경우 회로 뿐만아니라 펌웨어도 각 리비전별로 호환성등에 대한
대책이 있어야함
펌웨어 구조 설계
● 펌웨어 전체 구조를 설계
○ H/W에서 부터 상위로 Layer를 만드는 계층 구조로 설계
○ Layer간 인터페이스 범위를 설정
○ Layer수는 상황에 맞게 적절히 설정
H/W
제조사 라이브러리
hwbsp
common
ap
펌웨어 구조 설계
● 폴더 구조도 설계한 구조를 반영하도록 구성함
H/W
제조사 라이브러리
hwbsp
common
ap
펌웨어 구조 설계
● 초기화 함수
○ 모듈별 초기화 함수를 기본으로 만들고 호출함
bspInit hwInit()
main
apInit()
ledInit() uartInit() usbtInit()
펌웨어 구조 설계
● 함수 호출 구조
○ 모듈 및 Layer간 함수 호출 관계를 일관되게 유지하여 의존성을 낮춤
H/W
제조사 라이브러리
hwbsp
common
ap
모듈화 설계
● 인터페이스 함수
○ 하나의 모듈을 .h/.c로 구성하고 .h에 다른 모듈과 인터페이스를 위한 함수들을 선언함
○ 내부에 사용할 함 수는 static으로 .c 에 정의 함으로써 다른 모듈에서 사용하지 못하도록 함
uart.h
다른 모듈과
인터페이스
uart.c
내부 사용 함수
모듈화 설계
● C++ Class와 비교
모듈화 설계
● 모듈을 만드는 기준
○ 모듈의 기능을 대표할 수 있을 정도로 추상화 시켜 모듈간 의존성 낮춤
○ 상위단에서는 최종으로 무엇이 사용되는지는 알 필요 없음
서울 부산
자동차
자동차
모듈
모듈화 설계
● 상위단 추상화에 의한 모듈간 의존성 제거
● 시리얼 통신 모듈 예
○ uart 모듈은 USB를 이용한 가상 시리얼과 하드웨어 UART로 구성되어 있고 사용하는
입장에서는 통신하는 채널이 USB인지 하드웨어 UART인지 구분할 필요 없음
uart
USB UART2 UART8
_DEF_UART1
_DEF_UART2
_DEF_UART3
USB 통신
UART2 통신
UART8 통신
모듈화 설계
모듈을 분리하여 다른곳에
사용할려고 할때?
모듈화 설계
● 코드 재사용성 증가
● Layer가 증가할 수록 코드 재사용성은 증가
○ 반대로 Layer증가시 함수호출 오버헤드가 증가하고 복잡도가 증가 할 수 있음
motor
pwmHw
pwm
A 프로젝트
motor
pwmSw
pwm
B 프로젝트
100% 사용
가능
일부 수정으로
사용 가능
코드 재사용
모듈화 설계
● 버전 관리 시스템을 이용하여 코드를 공유하여 중복 코드를 생성하지 않고
한번 개발하여 재사용성을 높임
A 프로젝트 B 프로젝트
motor
pwm
svn/git 등을 이용한 코드
공유
모듈화 설계 - OROCABOY
● driver Layer를 추가함
● fwsdk에 공용 API를 만들고, 각 프로젝트에 따라 driver를 구현함
ap
하드웨어
bsp
ap
hw driver
Common
hw
<fwsdk - 공용 모듈>
모듈화 설계 - OROCABOY
● 초기 개발시에는 하드웨어 모듈 구현 후 공용 모듈로 driver로 분리 구현
hw
encoder
hw
drvEncoder
hw
encoder
<fwsdk>
모듈화 설계 - OROCABOY
fwsdk/hw/led.c project_boot/hw/driverdrv_led.c
project_app/hw/driverdrv_led.c
모듈화 설계 - OROCABOY
● 버전 관리 시스템을 이용하여 코드를 공유하여 중복 코드를 생성하지 않고
한번 개발하여 재사용성을 높임
부트로더 펌웨어
fwsdk
git 을 이용한 코드 공유
Time to break
새로운 MCU로 프로젝트를
시작해야 한다면?
Time to break
● 사용하고자 하는 MCU와 유사한 개발보드를 선정
Time to break
● 칩 제조사 제공 예제와 라이브러리 활용
Time to break
● 기본 개발 환경을 구축하고 순서대로 구현해가면서 시험
기본 개발 환경
링커스크립트
스타트업코드
클럭 활성화
GPIO 활성화
타이머 클럭 속도 확인
타이머 인터럽트
UART
Delay 구현
디버깅 모듈 구현
디버깅 및 테스트
● Command 라인 방식의 디버깅 및 테스트 코드를 많이 사용함
● cmdif 모듈
○ 시리얼 통신 기반의 command 라인 방식 명령어 실행 모듈
○ 히스토리 기능으로 기존 실행한 이미지 사용 가능
cmdif
● 초기화
○ cmdifInit()
■ 초기화 기능 수행
○ cmdifBegin()
■ 사용하고자 하는 시리얼 통신으로 초기화
○ cmdifLoop()
■ 초기화된 시리얼 통신으로 부터 데이터를 수신하여 명령어 실행
cmdif
● 기능 추가 방법
○ cmdifAdd 함수를 사용하여 명령어를 추가함
○ 추가된 명령어가 command 라인에 입력 되었을때 실행될 함수를 구현
cmdif
● 명령어 파라메터
○ argc는 명령 파라메터 갯수
○ argv는 명령 파라메터 문자열 배열
>> led on 0
argv[0] argv[1] argv[2]
argc = 3
Mission
Eclipse에서 빈 프로젝트를 생성 후
예제 펌웨어를 복사하여 프로젝트
옵션을 설정 후 디버깅까지 진행

More Related Content

What's hot

katagaitaictf11_misc_ysk
katagaitaictf11_misc_yskkatagaitaictf11_misc_ysk
katagaitaictf11_misc_yskysk256
 
50分でわかるブループリントについて
50分でわかるブループリントについて50分でわかるブループリントについて
50分でわかるブループリントについてMasahiko Nakamura
 
Ndc2012 최지호 텍스쳐 압축 기법 소개
Ndc2012 최지호 텍스쳐 압축 기법 소개Ndc2012 최지호 텍스쳐 압축 기법 소개
Ndc2012 최지호 텍스쳐 압축 기법 소개Jiho Choi
 
오픈소스 기반 비행제어컴퓨터 PX4 소개
오픈소스 기반 비행제어컴퓨터 PX4 소개오픈소스 기반 비행제어컴퓨터 PX4 소개
오픈소스 기반 비행제어컴퓨터 PX4 소개SungTae Moon
 
The Linux Kernel Scheduler (For Beginners) - SFO17-421
The Linux Kernel Scheduler (For Beginners) - SFO17-421The Linux Kernel Scheduler (For Beginners) - SFO17-421
The Linux Kernel Scheduler (For Beginners) - SFO17-421Linaro
 
Pythonではじめるソフトウェア無線
Pythonではじめるソフトウェア無線Pythonではじめるソフトウェア無線
Pythonではじめるソフトウェア無線Taisuke Yamada
 
ARM Trusted FirmwareのBL31を単体で使う!
ARM Trusted FirmwareのBL31を単体で使う!ARM Trusted FirmwareのBL31を単体で使う!
ARM Trusted FirmwareのBL31を単体で使う!Mr. Vengineer
 
OPTEE on QEMU - Build Tutorial
OPTEE on QEMU - Build TutorialOPTEE on QEMU - Build Tutorial
OPTEE on QEMU - Build TutorialDalton Valadares
 
Marco Cavallini - Yocto Project, an automatic generator of embedded Linux dis...
Marco Cavallini - Yocto Project, an automatic generator of embedded Linux dis...Marco Cavallini - Yocto Project, an automatic generator of embedded Linux dis...
Marco Cavallini - Yocto Project, an automatic generator of embedded Linux dis...linuxlab_conf
 
UEFIによるELFバイナリの起動
UEFIによるELFバイナリの起動UEFIによるELFバイナリの起動
UEFIによるELFバイナリの起動uchan_nos
 
runC概要と使い方
runC概要と使い方runC概要と使い方
runC概要と使い方Yuji Oshima
 
취미로 엔진 만들기
취미로 엔진 만들기취미로 엔진 만들기
취미로 엔진 만들기Jiho Choi
 
C#とILとネイティブと
C#とILとネイティブとC#とILとネイティブと
C#とILとネイティブと信之 岩永
 
BHyVeってなんや
BHyVeってなんやBHyVeってなんや
BHyVeってなんやTakuya ASADA
 
Stagefright入門
Stagefright入門Stagefright入門
Stagefright入門l_b__
 

What's hot (20)

katagaitaictf11_misc_ysk
katagaitaictf11_misc_yskkatagaitaictf11_misc_ysk
katagaitaictf11_misc_ysk
 
50分でわかるブループリントについて
50分でわかるブループリントについて50分でわかるブループリントについて
50分でわかるブループリントについて
 
Ndc2012 최지호 텍스쳐 압축 기법 소개
Ndc2012 최지호 텍스쳐 압축 기법 소개Ndc2012 최지호 텍스쳐 압축 기법 소개
Ndc2012 최지호 텍스쳐 압축 기법 소개
 
오픈소스 기반 비행제어컴퓨터 PX4 소개
오픈소스 기반 비행제어컴퓨터 PX4 소개오픈소스 기반 비행제어컴퓨터 PX4 소개
오픈소스 기반 비행제어컴퓨터 PX4 소개
 
The Linux Kernel Scheduler (For Beginners) - SFO17-421
The Linux Kernel Scheduler (For Beginners) - SFO17-421The Linux Kernel Scheduler (For Beginners) - SFO17-421
The Linux Kernel Scheduler (For Beginners) - SFO17-421
 
Pythonではじめるソフトウェア無線
Pythonではじめるソフトウェア無線Pythonではじめるソフトウェア無線
Pythonではじめるソフトウェア無線
 
はじめてアンリアルエンジンで海戦をつくってみたときのお話
はじめてアンリアルエンジンで海戦をつくってみたときのお話はじめてアンリアルエンジンで海戦をつくってみたときのお話
はじめてアンリアルエンジンで海戦をつくってみたときのお話
 
ARM Trusted FirmwareのBL31を単体で使う!
ARM Trusted FirmwareのBL31を単体で使う!ARM Trusted FirmwareのBL31を単体で使う!
ARM Trusted FirmwareのBL31を単体で使う!
 
OPTEE on QEMU - Build Tutorial
OPTEE on QEMU - Build TutorialOPTEE on QEMU - Build Tutorial
OPTEE on QEMU - Build Tutorial
 
Marco Cavallini - Yocto Project, an automatic generator of embedded Linux dis...
Marco Cavallini - Yocto Project, an automatic generator of embedded Linux dis...Marco Cavallini - Yocto Project, an automatic generator of embedded Linux dis...
Marco Cavallini - Yocto Project, an automatic generator of embedded Linux dis...
 
UEFIによるELFバイナリの起動
UEFIによるELFバイナリの起動UEFIによるELFバイナリの起動
UEFIによるELFバイナリの起動
 
runC概要と使い方
runC概要と使い方runC概要と使い方
runC概要と使い方
 
취미로 엔진 만들기
취미로 엔진 만들기취미로 엔진 만들기
취미로 엔진 만들기
 
C#とILとネイティブと
C#とILとネイティブとC#とILとネイティブと
C#とILとネイティブと
 
[CEDEC2018] UE4アニメーションシステム総おさらい
[CEDEC2018] UE4アニメーションシステム総おさらい[CEDEC2018] UE4アニメーションシステム総おさらい
[CEDEC2018] UE4アニメーションシステム総おさらい
 
What is Bootloader???
What is Bootloader???What is Bootloader???
What is Bootloader???
 
BHyVeってなんや
BHyVeってなんやBHyVeってなんや
BHyVeってなんや
 
Stagefright入門
Stagefright入門Stagefright入門
Stagefright入門
 
猫でも分かるUMG
猫でも分かるUMG猫でも分かるUMG
猫でも分かるUMG
 
Editor Utility Widget Petit Deep Dive
Editor Utility Widget Petit Deep DiveEditor Utility Widget Petit Deep Dive
Editor Utility Widget Petit Deep Dive
 

Similar to 강좌 04 펌웨어 구조 설계

개발 방식을 바꾸는 15가지 기술
개발 방식을 바꾸는 15가지 기술개발 방식을 바꾸는 15가지 기술
개발 방식을 바꾸는 15가지 기술중선 곽
 
[170403 2주차]C언어 A반
[170403 2주차]C언어 A반[170403 2주차]C언어 A반
[170403 2주차]C언어 A반arundine
 
SOSCON 2017 - Backend.AI
SOSCON 2017 - Backend.AISOSCON 2017 - Backend.AI
SOSCON 2017 - Backend.AIJoongi Kim
 
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍Chris Ohk
 
[17.01.19] docker introduction (Korean Version)
[17.01.19] docker introduction (Korean Version)[17.01.19] docker introduction (Korean Version)
[17.01.19] docker introduction (Korean Version)Ildoo Kim
 
(게임개발을위한) printf("Hello World!"); 그 이상의 콘솔 프로그래밍
(게임개발을위한) printf("Hello World!"); 그 이상의 콘솔 프로그래밍(게임개발을위한) printf("Hello World!"); 그 이상의 콘솔 프로그래밍
(게임개발을위한) printf("Hello World!"); 그 이상의 콘솔 프로그래밍NDOORS
 
Spring3 발표자료 - 김연수
Spring3 발표자료 - 김연수Spring3 발표자료 - 김연수
Spring3 발표자료 - 김연수Yeon Soo Kim
 
처음 시작하는 라라벨
처음 시작하는 라라벨처음 시작하는 라라벨
처음 시작하는 라라벨KwangSeob Jeong
 
XECon2015 :: [2-1] 정광섭 - 처음 시작하는 laravel
XECon2015 :: [2-1] 정광섭 - 처음 시작하는 laravelXECon2015 :: [2-1] 정광섭 - 처음 시작하는 laravel
XECon2015 :: [2-1] 정광섭 - 처음 시작하는 laravelXpressEngine
 
Upgrade VCL! 오래된 프로그램, 최신 버전으로 탈바꿈하기
Upgrade VCL! 오래된 프로그램, 최신 버전으로 탈바꿈하기Upgrade VCL! 오래된 프로그램, 최신 버전으로 탈바꿈하기
Upgrade VCL! 오래된 프로그램, 최신 버전으로 탈바꿈하기Devgear
 
[오픈소스컨설팅] OpenShift PaaS Platform How-to
[오픈소스컨설팅] OpenShift PaaS Platform How-to[오픈소스컨설팅] OpenShift PaaS Platform How-to
[오픈소스컨설팅] OpenShift PaaS Platform How-toJi-Woong Choi
 
[D2 COMMUNITY] Open Container Seoul Meetup - 마이크로 서비스 아키텍쳐와 Docker kubernetes
[D2 COMMUNITY] Open Container Seoul Meetup -  마이크로 서비스 아키텍쳐와 Docker kubernetes[D2 COMMUNITY] Open Container Seoul Meetup -  마이크로 서비스 아키텍쳐와 Docker kubernetes
[D2 COMMUNITY] Open Container Seoul Meetup - 마이크로 서비스 아키텍쳐와 Docker kubernetesNAVER D2
 
올챙이로 살펴보는 Eclipse개발
올챙이로 살펴보는 Eclipse개발올챙이로 살펴보는 Eclipse개발
올챙이로 살펴보는 Eclipse개발cho hyun jong
 
생산성을 높여주는 iOS 개발 방법들.pdf
생산성을 높여주는 iOS 개발 방법들.pdf생산성을 높여주는 iOS 개발 방법들.pdf
생산성을 높여주는 iOS 개발 방법들.pdfssuserb942d2
 
PHPStorm - tool for php
PHPStorm - tool for phpPHPStorm - tool for php
PHPStorm - tool for phpSungbum Hong
 
Backend.AI: 오픈소스 머신러닝 인프라 프레임워크
Backend.AI: 오픈소스 머신러닝 인프라 프레임워크Backend.AI: 오픈소스 머신러닝 인프라 프레임워크
Backend.AI: 오픈소스 머신러닝 인프라 프레임워크Jeongkyu Shin
 
OpenStack Horizon AWS Plugin For Hybrid Cloud
OpenStack Horizon AWS Plugin For Hybrid CloudOpenStack Horizon AWS Plugin For Hybrid Cloud
OpenStack Horizon AWS Plugin For Hybrid CloudDennis Hong
 

Similar to 강좌 04 펌웨어 구조 설계 (20)

개발 방식을 바꾸는 15가지 기술
개발 방식을 바꾸는 15가지 기술개발 방식을 바꾸는 15가지 기술
개발 방식을 바꾸는 15가지 기술
 
[170403 2주차]C언어 A반
[170403 2주차]C언어 A반[170403 2주차]C언어 A반
[170403 2주차]C언어 A반
 
SOSCON 2017 - Backend.AI
SOSCON 2017 - Backend.AISOSCON 2017 - Backend.AI
SOSCON 2017 - Backend.AI
 
Ninja
NinjaNinja
Ninja
 
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
 
[17.01.19] docker introduction (Korean Version)
[17.01.19] docker introduction (Korean Version)[17.01.19] docker introduction (Korean Version)
[17.01.19] docker introduction (Korean Version)
 
(게임개발을위한) printf("Hello World!"); 그 이상의 콘솔 프로그래밍
(게임개발을위한) printf("Hello World!"); 그 이상의 콘솔 프로그래밍(게임개발을위한) printf("Hello World!"); 그 이상의 콘솔 프로그래밍
(게임개발을위한) printf("Hello World!"); 그 이상의 콘솔 프로그래밍
 
피니엔진
피니엔진피니엔진
피니엔진
 
Spring3 발표자료 - 김연수
Spring3 발표자료 - 김연수Spring3 발표자료 - 김연수
Spring3 발표자료 - 김연수
 
처음 시작하는 라라벨
처음 시작하는 라라벨처음 시작하는 라라벨
처음 시작하는 라라벨
 
XECon2015 :: [2-1] 정광섭 - 처음 시작하는 laravel
XECon2015 :: [2-1] 정광섭 - 처음 시작하는 laravelXECon2015 :: [2-1] 정광섭 - 처음 시작하는 laravel
XECon2015 :: [2-1] 정광섭 - 처음 시작하는 laravel
 
Upgrade VCL! 오래된 프로그램, 최신 버전으로 탈바꿈하기
Upgrade VCL! 오래된 프로그램, 최신 버전으로 탈바꿈하기Upgrade VCL! 오래된 프로그램, 최신 버전으로 탈바꿈하기
Upgrade VCL! 오래된 프로그램, 최신 버전으로 탈바꿈하기
 
Docker Container
Docker ContainerDocker Container
Docker Container
 
[오픈소스컨설팅] OpenShift PaaS Platform How-to
[오픈소스컨설팅] OpenShift PaaS Platform How-to[오픈소스컨설팅] OpenShift PaaS Platform How-to
[오픈소스컨설팅] OpenShift PaaS Platform How-to
 
[D2 COMMUNITY] Open Container Seoul Meetup - 마이크로 서비스 아키텍쳐와 Docker kubernetes
[D2 COMMUNITY] Open Container Seoul Meetup -  마이크로 서비스 아키텍쳐와 Docker kubernetes[D2 COMMUNITY] Open Container Seoul Meetup -  마이크로 서비스 아키텍쳐와 Docker kubernetes
[D2 COMMUNITY] Open Container Seoul Meetup - 마이크로 서비스 아키텍쳐와 Docker kubernetes
 
올챙이로 살펴보는 Eclipse개발
올챙이로 살펴보는 Eclipse개발올챙이로 살펴보는 Eclipse개발
올챙이로 살펴보는 Eclipse개발
 
생산성을 높여주는 iOS 개발 방법들.pdf
생산성을 높여주는 iOS 개발 방법들.pdf생산성을 높여주는 iOS 개발 방법들.pdf
생산성을 높여주는 iOS 개발 방법들.pdf
 
PHPStorm - tool for php
PHPStorm - tool for phpPHPStorm - tool for php
PHPStorm - tool for php
 
Backend.AI: 오픈소스 머신러닝 인프라 프레임워크
Backend.AI: 오픈소스 머신러닝 인프라 프레임워크Backend.AI: 오픈소스 머신러닝 인프라 프레임워크
Backend.AI: 오픈소스 머신러닝 인프라 프레임워크
 
OpenStack Horizon AWS Plugin For Hybrid Cloud
OpenStack Horizon AWS Plugin For Hybrid CloudOpenStack Horizon AWS Plugin For Hybrid Cloud
OpenStack Horizon AWS Plugin For Hybrid Cloud
 

More from chcbaram

OROCABOY3 제작기
OROCABOY3 제작기OROCABOY3 제작기
OROCABOY3 제작기chcbaram
 
OpenCR tutorial_icra2017
OpenCR tutorial_icra2017 OpenCR tutorial_icra2017
OpenCR tutorial_icra2017 chcbaram
 
OpenCR 아두이노 펌웨어개발
OpenCR 아두이노 펌웨어개발OpenCR 아두이노 펌웨어개발
OpenCR 아두이노 펌웨어개발chcbaram
 
아두이노와 Fpga를 이용한 로봇제작
아두이노와 Fpga를 이용한 로봇제작아두이노와 Fpga를 이용한 로봇제작
아두이노와 Fpga를 이용한 로봇제작chcbaram
 
컵드론 멀티콥터 펌웨어 분석 2015. 3.28.
컵드론 멀티콥터 펌웨어 분석 2015. 3.28.컵드론 멀티콥터 펌웨어 분석 2015. 3.28.
컵드론 멀티콥터 펌웨어 분석 2015. 3.28.chcbaram
 
SkyRover Firmware
SkyRover FirmwareSkyRover Firmware
SkyRover Firmwarechcbaram
 

More from chcbaram (6)

OROCABOY3 제작기
OROCABOY3 제작기OROCABOY3 제작기
OROCABOY3 제작기
 
OpenCR tutorial_icra2017
OpenCR tutorial_icra2017 OpenCR tutorial_icra2017
OpenCR tutorial_icra2017
 
OpenCR 아두이노 펌웨어개발
OpenCR 아두이노 펌웨어개발OpenCR 아두이노 펌웨어개발
OpenCR 아두이노 펌웨어개발
 
아두이노와 Fpga를 이용한 로봇제작
아두이노와 Fpga를 이용한 로봇제작아두이노와 Fpga를 이용한 로봇제작
아두이노와 Fpga를 이용한 로봇제작
 
컵드론 멀티콥터 펌웨어 분석 2015. 3.28.
컵드론 멀티콥터 펌웨어 분석 2015. 3.28.컵드론 멀티콥터 펌웨어 분석 2015. 3.28.
컵드론 멀티콥터 펌웨어 분석 2015. 3.28.
 
SkyRover Firmware
SkyRover FirmwareSkyRover Firmware
SkyRover Firmware
 

강좌 04 펌웨어 구조 설계

  • 2. 스파케티 코드 ? “스파게티 코드는 컴퓨터 프로그램의 소스 코드가 복잡하게 얽힌 모습을 스파게티의 면발에 비유한 표현이다. 스파게티 코드는 작동은 정상적으로 하지만, 사람이 코드를 읽으면서 그 코드의 작동을 파악하기는 어렵다.” 출처
  • 5. 소프트웨어 수명 ● Xilinx Vivado “Replacing the 15 year old ISE with Vivado Design Suite took 1000 person-years and cost US $200 million” Xilinx ISE Xilinx Vivado
  • 6. 소프트웨어 수명 ● Palm OS Palm OS 4 Palm OS 5 WebOS
  • 7. 소프트웨어 수명 ● Windows Phone OS Windows Mobile Windows Phone
  • 10. 펌웨어 고려 사항 ● 임베디드라는 제약 사항을 고려하여 펌웨어 작성 필요 재사용성 유지보수성 모듈화 사용 편의성 메모리 속도 아키텍처 밸런스 필요
  • 11. 펌웨어 고려 사항 어떻게 밸런스를 맞추지? 재사용성도 유지하면서 속도도 빨라야 하고 .. 모듈화를 많이 하면서 메모리 사용량도 최소화 하고..
  • 13. 펌웨어 고려 사항 ● 하드웨어가 다양함 ● 각 하드웨어에 대한 깊은 이해를 하고 하드웨어에 최적화된 방법을 검토함
  • 14. 펌웨어 고려 사항 1. 하드웨어 특성을 잘 알고 2. 경험을 쌓고 3. 지속적인 고민을 하고 4. 공부를 게을리 하지 않는다.
  • 15. 펌웨어 고려 사항 ● 칩 제조사의 어플리케이션 노트를 활용 - 칩활용에 대한 다양한 예제 - 다른 칩에도 활용 가능한 기술이 많음
  • 16. 펌웨어 고려 사항 ● Errata Sheet를 반드시 확인 ○ Revision에 따른 차이가 있을경우 회로 뿐만아니라 펌웨어도 각 리비전별로 호환성등에 대한 대책이 있어야함
  • 17. 펌웨어 구조 설계 ● 펌웨어 전체 구조를 설계 ○ H/W에서 부터 상위로 Layer를 만드는 계층 구조로 설계 ○ Layer간 인터페이스 범위를 설정 ○ Layer수는 상황에 맞게 적절히 설정 H/W 제조사 라이브러리 hwbsp common ap
  • 18. 펌웨어 구조 설계 ● 폴더 구조도 설계한 구조를 반영하도록 구성함 H/W 제조사 라이브러리 hwbsp common ap
  • 19. 펌웨어 구조 설계 ● 초기화 함수 ○ 모듈별 초기화 함수를 기본으로 만들고 호출함 bspInit hwInit() main apInit() ledInit() uartInit() usbtInit()
  • 20. 펌웨어 구조 설계 ● 함수 호출 구조 ○ 모듈 및 Layer간 함수 호출 관계를 일관되게 유지하여 의존성을 낮춤 H/W 제조사 라이브러리 hwbsp common ap
  • 21. 모듈화 설계 ● 인터페이스 함수 ○ 하나의 모듈을 .h/.c로 구성하고 .h에 다른 모듈과 인터페이스를 위한 함수들을 선언함 ○ 내부에 사용할 함 수는 static으로 .c 에 정의 함으로써 다른 모듈에서 사용하지 못하도록 함 uart.h 다른 모듈과 인터페이스 uart.c 내부 사용 함수
  • 22. 모듈화 설계 ● C++ Class와 비교
  • 23. 모듈화 설계 ● 모듈을 만드는 기준 ○ 모듈의 기능을 대표할 수 있을 정도로 추상화 시켜 모듈간 의존성 낮춤 ○ 상위단에서는 최종으로 무엇이 사용되는지는 알 필요 없음 서울 부산 자동차 자동차 모듈
  • 24. 모듈화 설계 ● 상위단 추상화에 의한 모듈간 의존성 제거 ● 시리얼 통신 모듈 예 ○ uart 모듈은 USB를 이용한 가상 시리얼과 하드웨어 UART로 구성되어 있고 사용하는 입장에서는 통신하는 채널이 USB인지 하드웨어 UART인지 구분할 필요 없음 uart USB UART2 UART8 _DEF_UART1 _DEF_UART2 _DEF_UART3 USB 통신 UART2 통신 UART8 통신
  • 25. 모듈화 설계 모듈을 분리하여 다른곳에 사용할려고 할때?
  • 26. 모듈화 설계 ● 코드 재사용성 증가 ● Layer가 증가할 수록 코드 재사용성은 증가 ○ 반대로 Layer증가시 함수호출 오버헤드가 증가하고 복잡도가 증가 할 수 있음 motor pwmHw pwm A 프로젝트 motor pwmSw pwm B 프로젝트 100% 사용 가능 일부 수정으로 사용 가능 코드 재사용
  • 27. 모듈화 설계 ● 버전 관리 시스템을 이용하여 코드를 공유하여 중복 코드를 생성하지 않고 한번 개발하여 재사용성을 높임 A 프로젝트 B 프로젝트 motor pwm svn/git 등을 이용한 코드 공유
  • 28. 모듈화 설계 - OROCABOY ● driver Layer를 추가함 ● fwsdk에 공용 API를 만들고, 각 프로젝트에 따라 driver를 구현함 ap 하드웨어 bsp ap hw driver Common hw <fwsdk - 공용 모듈>
  • 29. 모듈화 설계 - OROCABOY ● 초기 개발시에는 하드웨어 모듈 구현 후 공용 모듈로 driver로 분리 구현 hw encoder hw drvEncoder hw encoder <fwsdk>
  • 30. 모듈화 설계 - OROCABOY fwsdk/hw/led.c project_boot/hw/driverdrv_led.c project_app/hw/driverdrv_led.c
  • 31. 모듈화 설계 - OROCABOY ● 버전 관리 시스템을 이용하여 코드를 공유하여 중복 코드를 생성하지 않고 한번 개발하여 재사용성을 높임 부트로더 펌웨어 fwsdk git 을 이용한 코드 공유
  • 32. Time to break 새로운 MCU로 프로젝트를 시작해야 한다면?
  • 33. Time to break ● 사용하고자 하는 MCU와 유사한 개발보드를 선정
  • 34. Time to break ● 칩 제조사 제공 예제와 라이브러리 활용
  • 35. Time to break ● 기본 개발 환경을 구축하고 순서대로 구현해가면서 시험 기본 개발 환경 링커스크립트 스타트업코드 클럭 활성화 GPIO 활성화 타이머 클럭 속도 확인 타이머 인터럽트 UART Delay 구현 디버깅 모듈 구현
  • 36. 디버깅 및 테스트 ● Command 라인 방식의 디버깅 및 테스트 코드를 많이 사용함 ● cmdif 모듈 ○ 시리얼 통신 기반의 command 라인 방식 명령어 실행 모듈 ○ 히스토리 기능으로 기존 실행한 이미지 사용 가능
  • 37. cmdif ● 초기화 ○ cmdifInit() ■ 초기화 기능 수행 ○ cmdifBegin() ■ 사용하고자 하는 시리얼 통신으로 초기화 ○ cmdifLoop() ■ 초기화된 시리얼 통신으로 부터 데이터를 수신하여 명령어 실행
  • 38. cmdif ● 기능 추가 방법 ○ cmdifAdd 함수를 사용하여 명령어를 추가함 ○ 추가된 명령어가 command 라인에 입력 되었을때 실행될 함수를 구현
  • 39. cmdif ● 명령어 파라메터 ○ argc는 명령 파라메터 갯수 ○ argv는 명령 파라메터 문자열 배열 >> led on 0 argv[0] argv[1] argv[2] argc = 3
  • 40. Mission Eclipse에서 빈 프로젝트를 생성 후 예제 펌웨어를 복사하여 프로젝트 옵션을 설정 후 디버깅까지 진행