그럼  Lesson 2 시~~작

Lesson 2. Modules and the TinyOS execution Model
TinyOS에 실행에 있어 중요한것은 Module,command,task 입니다. 기억 하세요.

*이제 편하게 애기하듯이 할 예정입니다.

TinyOS를 컴파일 하면 한개의 바이너리 파일이 나오며, 모트는 한번에 한개의 TinyOS 이미지를 실행 실킬 수 있습니다. 이미지 생성시에는 여러개의 컴포넌트를 필요로 합니다.  대부분의 모트들이 하드웨어적으로 메모리 보호를 할 수 없으며 더구나 하나의 주소맵을 모든 컴포넌트들이 공유 합니다. 그래서 컴포넌트들은 개인적이 변수를 가지게 해야 하며 포인터를 전달 하는건 피해야 합니다. 메모리충돌을 방지하기위해서는 메모리 공유를 피하시길 바랍니다.

1장에서 보다 시피 컴포넌트는 하나 이상의 제공받는 또는 제공 하는 인터페이스를 가지며 이건 두가지 컴포넌트 타입 모듈과 구성에 똑같이 적용 됩니다. 단지 구성 파일은 지가 구현 하는게 아니고 다른 모듈을 통해서 그기능을 제공 하며, 모듈은 실제적인 기능을 가지고 있습니다.(이런이유는 뭐 LED를 가지고 설명하면,, 모트에 따라 LED를 제어 하는 실제적인 모듈은 다를 것입니다만.. 구성파일을 래퍼로 앞세워 똑같은 컴포넌트 이름,인터페이스로 기능을 제공 할 수 있게 되는 것입니다.)

모듈에 선언되는 변수는 모두 공유 될수 없는 private 변수들이며 다른 컴포넌트는 절대 그 변수 이름으로 접근 할 수 없습니다. 단지 인터페이스를 통해 접근 가능 합니다.(여기서 문제,, 전역 변수는 어떻게 하느냐.. 어렵습니다. ㅡ.ㅡ;죄송 근데 전역 변수 설정이 되면.. 쓰기도 뭐 합니다. 제 경험상 크리티컬 세션 이 잘 작동 안합니다. atomic 이죠.);

apps Blink를 다시 `~~ 분석 하죠.

module BlinkC{
  uses interface Timer<TMilli> as Timer0;
  uses interface Timer<TMilli> as Timer1;
  uses interface Timer<TMilli> as Timer2;
  uses interface Leds;
  uses interface Boot;
}
implementation{
event void Boot.booted()
{
  call Timer0.startPeriodic(250);
  call Timer1.startPeriodic(500);
  call Timer2.startPeriodic(1000);
}

event void Timer0.fired(){
  call Leds.led0Toggle();

}

-----------------------------------중    략-----------------------------------------

보시다 시피 BlinkC는 어떻한 변수도 선언 안합니다.. 여기서 잠깐 실습 Blink를 BlinkSingle로 복사하세요.

cp -R Blink BlinkSingle 명령어 사용( tinyos-2.x/app 위치에서)

그리고 다음 과 같이 수정 합니다.

event void Timer1.fired()
  {
    // call Leds.led1Toggle();
  }
 
  event void Timer2.fired()
  {
    // call Leds.led2Toggle();
  }
일단 타이머는 한개만 사용 할 예정 입니다.

그리고 변수 하나를 선언하고 사용합니다. 선언하고 쓰는 요령은 C와 같습니다.

uint8_t counter=0;
  event void Boot.booted()
  {
    call Timer0.startPeriodic( 250 );
    //call Timer1.startPeriodic( 500 );
    //call Timer2.startPeriodic( 1000 );
  }

(아!! 전 걍 저렇게 첨부터 타이머를 막았습니다.^^;;)

그리고 다른건 C와 비슷하게 쓰더라도 자료형은 다음과 같은 규칙에 의거해서 사용할것을 추천 합니다.물론 걍 C자료형 써도 무방하지만 메모리가 부족한 관계로 필요한 만큼 쓰는게 좋은겁니다.물론 float,bool다 지원 합니다.

사용자 삽입 이미지
이제 다시 BlinkC로 와서, 우리가 선언한 counter는 모트가 켜지면서 0으로 초기화 됩니다.
그리고 Timer가 터질때 counter를 증가 시켜 counter에 따라 모트를 제어 합니다.

event void Timer0.fired()
  {
    counter++;
    if (counter & 0x1) {
      call Leds.led0On();
    }
    else {
      call Leds.led0Off();
    }
    if (counter & 0x2) {
      call Leds.led2On();
    }
    else {
      call Leds.led2Off();
    }
    if (counter & 0x4) {
      call Leds.led2On();
    }
    else {
      call Leds.led2Off();
    }
  }

이와 같이 수정 합니다. 대충 알고리즘은 걍 카운터 입니다. ^^;

그리고 좀더 쉬운 방법으로 ^^ set command를 사용 하는 겁니다.

event void Timer0.fired()
  {
    counter++;
    call Leds.set(counter);
  }
결과는 똑같은 겁니다. 왜냐.. LedC 컴포넌트 소스 따라가면 위에꺼 똑같이 쳐져 있을겁니다.(1.x에서는 그랬습니다. ㅎㅎ ^^);
 실행 시켜 보시면 똑같이 동작 하게 될겁니다.

이제 Timer는 하나만 사용 하고 있습니다. 타이머도 역시 리소스를 먹으므로 이제 두개타이머는 제거 하도록 합니다.

module BlinkC {
  uses interface Timer<TMilli> as Timer0;
  uses interface Leds;
  users interface Boot;
}
implementation
{
  uint8_t counter = 0;

  event void Boot.booted()
  {
    call Timer0.startPeriodic( 250 );
  }

  event void Timer0.fired()
  {
    counter++;
    call Leds.set(counter);
  }
 
}

다음과 같이 적고 컴파일 하면 ?? 당연 에러 납니다. 구성파일에서 와이어링 해놓은 게 있기때문에 에러 나게 됩니다. BlinkAppC에서 타이머와 와이어링을 제거 하고 다시 컴파일 하면 에러 안나게 될것입니다.


configuration BlinkAppC
{
}
implementation
{
  components MainC, BlinkC, LedsC;
  components new TimerMilliC() as Timer0;
 

  BlinkC -> MainC.Boot;

  BlinkC.Timer0 -> Timer0;
  BlinkC.Leds -> LedsC;
}
이렇게 수정 하시면 됩니다.
그라면 다음에 계속..

, .