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