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)
!! 비상 경보를 울린다;
}
}