SlideShare uma empresa Scribd logo
1 de 40
Baixar para ler 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에서 빈 프로젝트를 생성 후
예제 펌웨어를 복사하여 프로젝트
옵션을 설정 후 디버깅까지 진행

Mais conteúdo relacionado

Mais procurados

[DockerCon 2023] Reproducible builds with BuildKit for software supply chain ...
[DockerCon 2023] Reproducible builds with BuildKit for software supply chain ...[DockerCon 2023] Reproducible builds with BuildKit for software supply chain ...
[DockerCon 2023] Reproducible builds with BuildKit for software supply chain ...Akihiro Suda
 
QEMU - Binary Translation
QEMU - Binary Translation QEMU - Binary Translation
QEMU - Binary Translation Jiann-Fuh Liaw
 
HKG15-505: Power Management interactions with OP-TEE and Trusted Firmware
HKG15-505: Power Management interactions with OP-TEE and Trusted FirmwareHKG15-505: Power Management interactions with OP-TEE and Trusted Firmware
HKG15-505: Power Management interactions with OP-TEE and Trusted FirmwareLinaro
 
Yocto Project introduction
Yocto Project introductionYocto Project introduction
Yocto Project introductionYi-Hsiu Hsu
 
U-boot and Android Verified Boot 2.0
U-boot and Android Verified Boot 2.0U-boot and Android Verified Boot 2.0
U-boot and Android Verified Boot 2.0GlobalLogic Ukraine
 
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들영욱 오
 
Secure Boot on ARM systems – Building a complete Chain of Trust upon existing...
Secure Boot on ARM systems – Building a complete Chain of Trust upon existing...Secure Boot on ARM systems – Building a complete Chain of Trust upon existing...
Secure Boot on ARM systems – Building a complete Chain of Trust upon existing...Linaro
 
Yocto: Training in English
Yocto: Training in EnglishYocto: Training in English
Yocto: Training in EnglishOtavio Salvador
 
BKK16-504 Running Linux in EL2 Virtualization
BKK16-504 Running Linux in EL2 VirtualizationBKK16-504 Running Linux in EL2 Virtualization
BKK16-504 Running Linux in EL2 VirtualizationLinaro
 
YoctoをつかったDistroの作り方とハマり方
YoctoをつかったDistroの作り方とハマり方YoctoをつかったDistroの作り方とハマり方
YoctoをつかったDistroの作り方とハマり方wata2ki
 
ビジュアルスクリプティングで始めるUnity入門2日目 ゴールとスコアの仕組み - Unityステーション
ビジュアルスクリプティングで始めるUnity入門2日目 ゴールとスコアの仕組み - Unityステーションビジュアルスクリプティングで始めるUnity入門2日目 ゴールとスコアの仕組み - Unityステーション
ビジュアルスクリプティングで始めるUnity入門2日目 ゴールとスコアの仕組み - UnityステーションUnity Technologies Japan K.K.
 
Booting Android: bootloaders, fastboot and boot images
Booting Android: bootloaders, fastboot and boot imagesBooting Android: bootloaders, fastboot and boot images
Booting Android: bootloaders, fastboot and boot imagesChris Simmonds
 
7. 게임 스트리밍 서비스를 위한 아키텍처 - 언리얼 엔진을 중심으로! [레벨 300] - 발표자: 하흥수, 솔루션즈 아키텍트, AWS :...
7.	게임 스트리밍 서비스를 위한 아키텍처 - 언리얼 엔진을 중심으로! [레벨 300] - 발표자: 하흥수, 솔루션즈 아키텍트, AWS :...7.	게임 스트리밍 서비스를 위한 아키텍처 - 언리얼 엔진을 중심으로! [레벨 300] - 발표자: 하흥수, 솔루션즈 아키텍트, AWS :...
7. 게임 스트리밍 서비스를 위한 아키텍처 - 언리얼 엔진을 중심으로! [레벨 300] - 발표자: 하흥수, 솔루션즈 아키텍트, AWS :...Amazon Web Services Korea
 
Bootloaders (U-Boot)
Bootloaders (U-Boot) Bootloaders (U-Boot)
Bootloaders (U-Boot) Omkar Rane
 
UEFIによるELFバイナリの起動
UEFIによるELFバイナリの起動UEFIによるELFバイナリの起動
UEFIによるELFバイナリの起動uchan_nos
 
from Binary to Binary: How Qemu Works
from Binary to Binary: How Qemu Worksfrom Binary to Binary: How Qemu Works
from Binary to Binary: How Qemu WorksZhen Wei
 

Mais procurados (20)

[DockerCon 2023] Reproducible builds with BuildKit for software supply chain ...
[DockerCon 2023] Reproducible builds with BuildKit for software supply chain ...[DockerCon 2023] Reproducible builds with BuildKit for software supply chain ...
[DockerCon 2023] Reproducible builds with BuildKit for software supply chain ...
 
QEMU - Binary Translation
QEMU - Binary Translation QEMU - Binary Translation
QEMU - Binary Translation
 
HKG15-505: Power Management interactions with OP-TEE and Trusted Firmware
HKG15-505: Power Management interactions with OP-TEE and Trusted FirmwareHKG15-505: Power Management interactions with OP-TEE and Trusted Firmware
HKG15-505: Power Management interactions with OP-TEE and Trusted Firmware
 
Yocto Project introduction
Yocto Project introductionYocto Project introduction
Yocto Project introduction
 
U-boot and Android Verified Boot 2.0
U-boot and Android Verified Boot 2.0U-boot and Android Verified Boot 2.0
U-boot and Android Verified Boot 2.0
 
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
 
Secure Boot on ARM systems – Building a complete Chain of Trust upon existing...
Secure Boot on ARM systems – Building a complete Chain of Trust upon existing...Secure Boot on ARM systems – Building a complete Chain of Trust upon existing...
Secure Boot on ARM systems – Building a complete Chain of Trust upon existing...
 
Embedded Linux on ARM
Embedded Linux on ARMEmbedded Linux on ARM
Embedded Linux on ARM
 
Yocto: Training in English
Yocto: Training in EnglishYocto: Training in English
Yocto: Training in English
 
Yocto project
Yocto projectYocto project
Yocto project
 
BKK16-504 Running Linux in EL2 Virtualization
BKK16-504 Running Linux in EL2 VirtualizationBKK16-504 Running Linux in EL2 Virtualization
BKK16-504 Running Linux in EL2 Virtualization
 
YoctoをつかったDistroの作り方とハマり方
YoctoをつかったDistroの作り方とハマり方YoctoをつかったDistroの作り方とハマり方
YoctoをつかったDistroの作り方とハマり方
 
[CEDEC2018] UE4アニメーションシステム総おさらい
[CEDEC2018] UE4アニメーションシステム総おさらい[CEDEC2018] UE4アニメーションシステム総おさらい
[CEDEC2018] UE4アニメーションシステム総おさらい
 
Qemu JIT Code Generator and System Emulation
Qemu JIT Code Generator and System EmulationQemu JIT Code Generator and System Emulation
Qemu JIT Code Generator and System Emulation
 
ビジュアルスクリプティングで始めるUnity入門2日目 ゴールとスコアの仕組み - Unityステーション
ビジュアルスクリプティングで始めるUnity入門2日目 ゴールとスコアの仕組み - Unityステーションビジュアルスクリプティングで始めるUnity入門2日目 ゴールとスコアの仕組み - Unityステーション
ビジュアルスクリプティングで始めるUnity入門2日目 ゴールとスコアの仕組み - Unityステーション
 
Booting Android: bootloaders, fastboot and boot images
Booting Android: bootloaders, fastboot and boot imagesBooting Android: bootloaders, fastboot and boot images
Booting Android: bootloaders, fastboot and boot images
 
7. 게임 스트리밍 서비스를 위한 아키텍처 - 언리얼 엔진을 중심으로! [레벨 300] - 발표자: 하흥수, 솔루션즈 아키텍트, AWS :...
7.	게임 스트리밍 서비스를 위한 아키텍처 - 언리얼 엔진을 중심으로! [레벨 300] - 발표자: 하흥수, 솔루션즈 아키텍트, AWS :...7.	게임 스트리밍 서비스를 위한 아키텍처 - 언리얼 엔진을 중심으로! [레벨 300] - 발표자: 하흥수, 솔루션즈 아키텍트, AWS :...
7. 게임 스트리밍 서비스를 위한 아키텍처 - 언리얼 엔진을 중심으로! [레벨 300] - 발표자: 하흥수, 솔루션즈 아키텍트, AWS :...
 
Bootloaders (U-Boot)
Bootloaders (U-Boot) Bootloaders (U-Boot)
Bootloaders (U-Boot)
 
UEFIによるELFバイナリの起動
UEFIによるELFバイナリの起動UEFIによるELFバイナリの起動
UEFIによるELFバイナリの起動
 
from Binary to Binary: How Qemu Works
from Binary to Binary: How Qemu Worksfrom Binary to Binary: How Qemu Works
from Binary to Binary: How Qemu Works
 

Semelhante a 강좌 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
 
XECon2015 :: [2-1] 정광섭 - 처음 시작하는 laravel
XECon2015 :: [2-1] 정광섭 - 처음 시작하는 laravelXECon2015 :: [2-1] 정광섭 - 처음 시작하는 laravel
XECon2015 :: [2-1] 정광섭 - 처음 시작하는 laravelXpressEngine
 
처음 시작하는 라라벨
처음 시작하는 라라벨처음 시작하는 라라벨
처음 시작하는 라라벨KwangSeob Jeong
 
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
 

Semelhante a 강좌 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
 

Mais de 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
 

Mais de 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
 

Último

Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Wonjun Hwang
 
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Kim Daeun
 
Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Wonjun Hwang
 
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionKim Daeun
 
A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)Tae Young Lee
 
캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스
 

Último (6)

Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)
 
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
 
Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)
 
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
 
A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)
 
캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차
 

강좌 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에서 빈 프로젝트를 생성 후 예제 펌웨어를 복사하여 프로젝트 옵션을 설정 후 디버깅까지 진행