Note - 동아대학교

Download Report

Transcript Note - 동아대학교

임베디드시스템
2012년도 가을학기
담당교수

조장우, 동아대학교 컴퓨터공학과, SF 619호

e-mail: [email protected]

www: http://web.donga.ac.kr/jwjo

phone: 200-7780
성적평가





중간
시험: 30%
기말
시험: 30%
실험 보고서: 20%
설계
과제: 10%
출
석: 10%
교재







PXA270을 이용한 임베디드 시스템구조 및 응용, 상
학당
X-Hyper270TKU 실습교재, 하이버스
입문자를 위한 임베디드시스템, 사이텍미디어
재미있는 임베디드시스템 디자인, CMPBooks
RTOS를 이용한 실시간 임베디드 시스템 디자인, 에이
콘
임베디드시스템을 위한 RTOS, 에이콘
…
임베디드 시스템이란?

특정한 기능을 수행하기 위하여 결합된 컴퓨터 시스
템

HW 로 구현한 기능과 비교

Computers Inside a Product (or a System)

다양한 목적으로 사용되는 PC와 달리, 한 가지 또는
몇 가지 특수한 작업을 수행

PDA와 같이 Embedded System에서도 점차 범용성을 띄어
가고 있다
임베디드 시스템 구현 방법

하드웨어구현 VS. 소프트웨어구현

부동소수점연산(80386과 이전의 프로세서)

모뎀, 랜카드

프린터


네트워크 기능이 추가되면?
논리곱(Logical and)


SW: bool a, b, c; c = a && b;
HW: AND gate
소프트웨어의 장점



일반적으로 소프트웨어 개발에서는 개발 도구를 염가로
갖출 수 있음
같은 CPU 보드라도 소프트웨어를 바꿔 넣음으로써 다른
처리를 하게 할 수 있고 메모리의 용량에 빈 곳이 있으면,
기능을 추가할 수도 있음
프로그램에 문제(버그)가 발견되면 즉석에서 수정할 수
있음
하드웨어의 단점




ASIC 등의 하드웨어 개발에서는 일반적으로 고가의 개발
도구를 필요로 함
개발에는 큰 투자와 시간이 필요
또 다른 처리를 하게 하거나 기능을 추가하려면, 그로 인
한 회로가 필요
또 회로에 잘못이 발견되었을 때에 그것을 수정하기 위해
서는 많은 수고와 비용 요구
소프트웨어의 단점

소프트웨어를 동작시키려면 “CPU+메모리”가 필요


하드웨어만으로 처리하는 경우와 소프트웨어로 처리하는 경
우를 비교하면, 일반적으로는 하드웨어로 처리하는 쪽이 고속
임



그러나 일부러 ASIC를 개발하는 것보다는 훨씬 싼 가격으로 CPU 보
드를 실현할 수 있음
사람이 버튼을 눌러 LED를 점등 시키는 것과 같은 그다지 고속이 아
닌 처리는 소프트웨어로도 충분히 처리할 수 있지만
ns급의 성능이 요구되는 처리는 하드웨어로 처리해야 함
소프트웨어에서의 처리 성능을 높이기 위해서는 한층 고속의
CPU를 사용해야 함


그러나 고성능의 CPU는 가격도 비싸고
그것이 제품 가격에 반영되므로 어느 정도 성능의 CPU를 채용해야
하는가 하는 것은 사실 매우 중요한 문제임
임베디드 시스템의 구성

임베디드 시스템 구성


임베디드 H/W
 프로세서/컨트롤러, 메모리, I/O 장치, 네트워크 장치, 센서,
구동기
임베디드 S/W
 운영체제, 시스템 S/W, 응용 S/W
H/W
S/W
Micro Processor
OS - Kernel
Memory
입출력 장치
네트워크 장치
시스템 소프트웨어
응용 소프트웨어
임베디드 시스템
범용컴퓨터와 비교

임베디드





마이크로 프로세서의 성능?
전체 제품의 일부
특정 기능 수행
필요한 주변장치
사용자의 개입 없이 동작

범용컴퓨터





마이크로 프로세서
제품 자체
범용 기능 수행
필요할 수 있는 주변장치
사용자와 대화형으로 동작
프로세서
Where Has CS Focused?
Interactive
Computers
200M
per Year
In Vehicles
Where Are the Processors?
Direct
2%
Robots Vehicles
6%
12%
8.5B Parts
per Year
Servers,
etc.
EmbeddedIn Robots
Source: DARPA/Intel (Tennenhouse)
임베디드 소프트웨어 구조
입문자를 위한 임베디드시스템
5장
라운드 로빈 구조의 예
void main (void)
{
while (TRUE)
{
if (!! I/O 장치 A가 서비스가 필요하다면)
{
!! I/O 장치 A에 대해 필요한 것을
처리한다.
!! 데이터를 I/O 장치 A에 넘겨주거나
가져온다.
}
if (!! I/O 장치 B가 서비스가 필요하다면)
{
!! I/O 장치 B에 대해 필요한 것을
처리한다.
!! 데이터를 I/O 장치 B에 넘겨주거나
가져온다.
}
.생략표시
.
if (!! I/O 장치 Z가 서비스가 필요하다면)
{
!! I/O 장치 Z에 대해 필요한
것을 처리한다.
!! 데이터를 I/O 장치 Z에
넘겨주거나 가져온다.
}
}
}
What is the worst wait?
14
인터럽트 라운드로빈 구조의 예
void interrupt vHandleDeviceB (void)
BOOL fDeviceA = FALSE;
BOOL fDeviceB = FASLSE;
.
.
BOOL fDeviceZ = FALSE;
{
!! I/O 장치 B를 처리한다
fDeviceB = TRUE;
}
.
.
void interrupt vHandleDeviceA (void)
{
!! I/O 장치 A를 처리한다
fDeviceA = TRUE;
}
.
void interrupt vHandleDeviceZ (void)
{
!! I/O 장치 Z를 처리한다
fDeviceZ = TRUE;
}
15
인터럽트 라운드로빈 구조의 예 (Cont’d)
void main (void)
{
while (TRUE)
{
if (fDeviceA) {
fDeviceA = FALSE;
!! I/O 장치 A로 데이터를
넘겨 주거나 가져 온다
}
if (fDeviceB) {
...
if (fDeviceZ) {
fDeviceZ = FALSE;
!! I/O 장치 Z로 데이터를 넘겨
주거나 가져 온다
}
}
}
fDeviceB = FALSE;
!! I/O 장치 B로 데이터를 넘겨
주거나 가져 온다
What is the worst wait?
}
16
펑션큐스케줄링 구조의 예
!! 함수 포인터들의 큐;
void interrupt vHandleDeviceA (void)
{
!! I/O 장치 A에 대해 필요한
것을 처리
!! function_A 에 대한 함수
포인터를 함수 포인터들의
큐에 삽입
}
void interrupt vHandeDeviceB (void)
{
!! I/O 장치 B에 대해 필요한 일을 처리
!! function_B 에 대한 함수 포인터를
함수 포인터들의 큐에 삽입
}
void main (void)
{
while (TRUE)
{
while (!!함수 포인터들의 큐가 비어 있다
면 기다림)
…
!! 큐에 있는 첫 번째
함수 호출
}
}
void function_A (void)
{
!! 장치 A 에게 필요한 일을 처리
}
void function_B (void)
{
What is the worst wait?
17
}
!! 장치 B 에게 필요한 일을 처리
5.4 RTOS 구조의 예
void interrupt vHandleDeviceA (void)
{
!! I/O 장치 A에 대해 필요한 일을 처리한다
!! 시그널 X를 설정한다
}
void interrupt vHandleDeviceB (void)
{
!! I/O 장치 B에 대해 필요한 일을 처리한다
!! 시그널 Y를 설정한다
}
.
.
.
void Task1 (void)
{
while (TRUE)
{
!! 시그널 X를 기다린다
준다
!! I/O 장치 A로부터 데이터를 받거나
}
}
void Task2 (void)
{
while (TRUE)
{
!! 시그널 Y를 기다린다
준다
}
}
18
!! I/O 장치 B로부터 데이터를 받거나
The Shared-Data Problem
입문자를 위한 임베디드시스템
4.3
Classic shared-data problem
static int iTemperature[2];
void interrupt vReadTemperatures (void)
{
iTemperatures[0] = !! 하드웨어로부터 값을 읽음
iTemperatures[1] = !! 하드웨어로부터 값을 읽음
}
void main (void)
{
int iTemp0, iTemp1;
while (TRUE)
{
iTemp0 = iTemperatures[0];
iTemp1 = iTemperatures[1];
if (iTemp0 != iTemp1)
!! 비상 경보를 울린다;
}
}
Classic shared-data problem
static int iTemperature[2];
void main (void)
{
int iTemp0, iTemp1;
while (TRUE)
{
//
iTemp0 = iTemperatures[0];
//
iTemp1 = iTemperatures[1];
//
if (iTemp0 != iTemp1)
if (iTemperatures[0] != iTemperatures[1])
!! 비상 경보를 울린다;
}
}
Classic shared-data problem
static int iTemperature[2];
void main (void)
{
int iTemp0, iTemp1;
while (TRUE)
{
iTemp0 = iTemperatures[0];
iTemp1 = iTemperatures[1];
if (iTemp0 != iTemp1)
!! 비상 경보를 울린다;
}
}
Classic shared-data problem
static int iTemperature[2];
void main (void)
{
int iTemp0, iTemp1;
while (TRUE)
{
disable();
iTemp0 = iTemperatures[0];
iTemp1 = iTemperatures[1];
enable();
if (iTemp0 != iTemp1)
!! 비상 경보를 울린다;
}
}