Transcript BlinkC

TinyOS 기초 프로그래밍
 프로그램 컴파일 및 mote 설치
 nesc 프로그래밍 환경 설명
 Blink 코드 분석 및 실습
프로그램 컴파일
 Application 컴파일 (프로그램 디렉토리로 이동 후)
 #make telosb (Telosb 계열 mote)
 #make micaz (Micaz 계열 mote)
2
프로그램 다운로드
 컴파일된 바이너리를 mote로 다운로드
 시스템에 mote가 장착된 상태에서 수행해야 함
 컴파일된 바이너리를 mote로 다운로드 하고, mote의 주소(ID)
를 1번으로 설정
 #make telosb reinstall.1
3
컴파일 & 다운로드 동시 수행
 #make telosb install.1
4
TinyOS 커널 동작 방식
Infinite Loop
HardWare
& Kernel
Initialization
Run All Tasks
(in the Task Queue)
Application
Initialization
Sleep Mode
(Low Power)
Wait for Interrupt
Run To Completion
TinyOS Kernel Scheduler
Task Queue
Interrupt
Vectors
Task 1
Task 2
Task 3
Timer
Task 4
ADC
Task 5
Wireless
Task 6
UART
Task 7
ISR
Task 8
Task exists
Task
Queue
Empty
?
Interrupt
occurs
Event
Handler
SLEEP
5
Run Task
Command/Task .vs. Event


Command/Task (Bottom direction)

Non-time critical

Long running operations

Cannot preempt & can be preempted

Background computation
Events (Top direction)

Time critical

Small running operations

Cannot be preempted

Able to interrupt running Tasks
6
nesC 프로그래밍 개요
 nesC의 개요




nesC는 센서 네트워클 위한 새로운 방식의 프로그래밍 언어
라이브러리의 재사용
컴포넌트들로 구성, 컨피그레이션과 모듈로 나뉜다.
동적인 메모리 할당 및 함수 포인터 사용 불허
7
nesC 프로그램 구성 요소
 Module
 (oooC.nc)
 Code file (Implementation)
 Configuration
 (oooAppC.nc)
 Wiring of components
 Define wiring of Modules
 Interfaces(함수들의 prototypes 집합)
 ooo.nc
 Contains only definition
 Commands/Events
8
command/event 구성
 인터페이스의 함수는 command와 event로 구분
 컴포넌트들은 인터페이스를 통해 상호작용하는 프로그래밍 모델
 Run-To-Completion태스크와 인터럽트 핸들러 이벤트 기반의 동
시성 모델
- Split-phase Operation -
9
Blink 프로그램
 /opt/tinyos-2.1.2/apps/Blink/
 기능: 시간 경과 시마다 정해진 LED 값이 토글됨
 BlinkApp.nc, BlinkC.nc 두 개의 파일로 구현
10
BlinkAppC.nc
 Configuration 파일
Components: MainC, BlinkC, LedsC, Timer0, Timer1, Timer2
Interfaces: Timer0, Timer1, Timer2, Leds
11
인터페이스 파일들 1
 Leds 인터페이스
 Leds.nc (/opt/tinyos-2.x/tos/interfaces)
12
인터페이스 파일들 2
 Timers 인터페이스
 Timers.nc
13
BlinckC.nc (Module 코드)
14
14
BlinckAppC.nc (Configuration 코드) 1
 Components: MainC, ~ Timer2 까지 모두 6개의 컨포넌트 사
용
 6개 컨포넌트 중 BlinkC만 내가 작성한 컨포넌트
 따라서 구현 모듈인 BlinkC.nc 파일이 따로 존재해야 함.
 new TimerMilliC(): 동적 컨포넌트, 다중 인스턴스화 가능
 new X as Y: 별명(alias) 부여(이제 X를 나는 Y라고 부르겠다.)
15
15
BlinckAppC.nc (Configuration 코드) 2
 상, 하위 컨포넌트 간의 연결(인터페이스에 의한)
 형식: 컨포넌트A.인터페이스x -> 컨포넌트B.인터페이스x
 컨포넌트A가 사용하는 인터페이스x는 컨포넌트B가 제공하는 것이
다.
 컨포넌트A, B 중의 인터페이스X 하나는 생략 가능
 BlinkC -> MainC.Boot == BlinkC.Boot -> MainC.Boot
 BlinkC.Timer0 -> Timer0
16
16
Blink 구성
 Blink 프로그램 Configuration
BlinkC
Boot
: Event
Leds Timer0 Timer1 Timer2
Boot
Leds
Timer0
Timer1
Timer2
MainC
LedsC
Timer0
Timer1
Timer2
…
17
: Command
…
…
…
17
…
BlinkC 분석 (모듈 코드) – uses 절
 uses 절: BlinkC 컨포넌트가 사용하는 인터페이스를 선언
 X as Y: X 라는 인터페이스를 사용하는데, 나는 X를 Y로 부르겠다.
 uses interface Timer<TMilli> as Timer0;
 ms 단위의 Timer 인터페이스를 사용하는데, Timer0로 별명
 uses interface Leds;
 provides 절: BlinkC 컨포넌트가 제공하는 인터페이스를 선언
 현재 BlinkC 컨포넌트는 다른 컨포넌트에 인터페이스를 제공하지 않으므
로 사용하지 않음
18
18
BlinkC 분석 (모듈 코드) - implementations
 네 가지 인터페이스의 event 함수 코드 정의
 인터페이스 중에서 event 함수는 상위 컨포넌트에서 코드를 정의해야함
 일종의 callback 함수
 event void Boot.booted(): Boot:인터페이스명, booted: 함수명
 사용 인터페이스의 command 함수 호출 시에는 call를 사용
 call Leds.led0Toggle(): led0(RED led)를 토글시킴
19
19
Configuration 복습
 Component
 Configuration
 사용 컨포넌트 선언
 컴포넌트들 간의 (사용/제공) 인터페이스 연결
 Module
 Provides 절: 어떤 인터페이스를 제공하는 가를 선언
 Uses 절: 어떤 인터페이스를 사용하는 가를 선언
 implementation 절: 실제 구현 코드 작성
 Interface (상/하위 컴포넌트를 연결)
 Commands (하위 컨포넌트가 제공, 상위 컨포넌트가 사용)
 Events (상위 컨포넌트가 제공, 하위 컴포넌트가 사용)
20
20
프로그래밍 관련 사항 (1)
 일반적인 변수/함수 사용은 기존 C 언어와 동일함
21
프로그래밍 관련 사항 (2)
 nesC에서 주로 사용하는 데이터 형
 uint8_t : 8비트 unsigned int
 uint16_t : 16비트 unsigned int
 uint32_t : 32비트 unsigned int
 사용 예
 uint16_t i;
22
프로그래밍 실습
 Timer 컨포넌트 하나만 사용해서 Blink와 동일한 기능 수행시
키기
 앞으로 실습 시에는 아래와 같이, Blink 디렉토리를 통째로
BlinkTest1으로 복사한 후, BlinkTest1에서 실습할 것.
23
23
Task
 일반적인 함수와 비슷한 형식과 호출 방법을 가지지만,
 즉시 호출되지 않고, Task queue에 제출만 하고,
 처리해야 할 이벤트 등이 없을 경우에만, Task queue에 제출
된 함수를 차례대로 수행한다.
 즉 asynchronous 함수 호출을 지원하는 것이 Task 함수이다.
 응용 프로그램에서 “background” 형태로 처리를 수행
 “지금 즉시 수행하지 말고, 시간이 남을 때 처리해”
24
Task 형식
 Task 함수 정의
task void taskname()
{
………
}
 Task 호출
post taskname()
 Task 함수는 리턴도 void, 인수도 void 형이다.
25
BlinkTask (1)
 위치: /opt/tinyos-2.1.2/apps/tutorials/BinkTask
 BlinkTaskAppC.nc
26
BlinkTask (2)
 BlinkTaskC.nc
27