nesC

Embeded : 2007. 10. 17. 12:43
반응형

유비쿼터스에 나름 관심을 가지고 이쪽 분야로 밥먹고 살려고 직업학교를 들어갔는데
거기서 nesC라는 과목이 있었다. nesC?? 이건 뭐야??
선생님의 말씀에 의하면 센서에 들어가는 아주 작은 규모의 C언어란다...
음...아주 작은 C라...그럼 C만 열심히 하면 되겠군..ㅎㅎㅎ
이때까지만 해도 난 기존의 C언어로 열심히 코딩을 해서 프로그래을 짜면
nesC로 만들기 위해 전용 컴파일러나 컴버터가 있는 줄 알았다...
그래서 나름 마음을 놓고 있었는데 이건 순전 나의 엄청난 착각이었다...
그리고 그러한 방심에 제대로 얻어맞고 말았다...

 

처음 일주일간 경험한 nesC.....
한마디로 쉣이었다...
아니 이건 C가 아니잖아?? 뭐가 C라는거야??
아니 이건 언어잖아?? 근데 어떻게 생겨먹은 개념이지??

configuration, module, interface, wiring, component, event, task, 등등의 생소한 용어들...
그리고 개념들.. 도무지 머리에 정리가 되지 않았다...
아니 프로그램이 어떻게 실행이 되며 어떤 식으로 동작하는지 감도 잡기 힘들었다...
선생님은 일부러 그러는 건지 잘 알려주지도 않았다...
물어보면 그걸 뭘 알라고 그래..그냥 가져다 쓰는거야...
지금 이렇게 알려고 하는게 당연한 거지만 나중에는 다 카피 복사다...이런 말씀만 하셨다...

 

아니..카피 복사라는 것도 알고 복사해야지 모르고 그냥 복사하나??
이런 말을 하고 싶었지만 그냥 꾹 참았다...
그래 오냐...내가 너를 까발려 주마...

 

일단 레퍼런스를 찾아 봤다....
전부......영어였다......젠장.....ㅡㅡ;;
만든 넘들이 버클리 아그들이란다...어쩔 수 없다...
번역을 시작했다...번역본이 있었지만 직역수준이라 해독 불능이었다...

마침 좋은 사이트가 있었다...
MSP430 MCU 임베디드 TINYOS 네이버 카페이다...
http://cafe.naver.com/bluegio 주소이다. 원하시는 분들이 있다면 가보시길...
시샵이 지오라는 닉네임의 분이 운영하시는 곳인데 정말 많은 자료가 있었다..

많은 분들이 자신의 공부한 지식을 아낌없이 올려 주셨다...
그래서 어렴풋이나마 개념을 잡을 수 있었다...

 

nesC를 접한지 어언 한달이 되어간다...
어느 정도 윤곽도 잡혀간다...
그리고 내 머리속에 있는 디죽박죽인 내용을 정리해야 할 필요성을 느꼈다...

시간이 날 때마다 하나씩 내가 생각하는 nesC를 올려볼까 한다...

http://blog.naver.com/samepaul/100042446753






컴포넌트 사양서

 

컴포넌트 사양서를 우리나라 말로 적절하게 바꾸면 뭐가 있을지 곰곰히 생각해 봤습니다. 그냥 쉽게 자동차나 제품의 스팩을 생각하시면 좋을 것 같습니다. 컴포넌트라는 제품 설명서정도는 어떨까요?? 실제로 컴포넌트 파일의 내용을 보면 이 컴포넌트가 어떤 컴포넌트로 조립이 되어 있고 어떤 인터페이스를 사용하며 제공하는지를 알 수 있습니다.

컴포넌트 스팩정도로 부르면 좋겠군요. 이제부터 그렇게 부르도록 하겠습니다.

 

nesC의 컴포넌트는 module파일과 configuration파일로 구성되어 있습니다.

만약 Blink라는 nesC 프로그램이 있다고 한다면 다음과 같습니다.

 

Blink.nc -> configuration 파일(BlinkC.nc라고 표현할 수 있습니다. C를 생략할 수 있습니다.)

BlinkM.nc -> module 파일

각 파일의 이름이 컴포넌트의 이름이 됩니다. 이 이름 역시 인터페이스 이름과 마찬가지로 전역 범위를 가지고 있고 namespace(이름부여규칙)을 따릅니다. 두 개의 컴포넌트 configuration과 module부분를 소개하면 다음과 같습니다. C의 전역 부분(global scope)을 포함하는 스팩 범위와 이 스팩 범위를 구현한 구현 범위로 설명할 수 있습니다.
컴포넌트는 include를 통하여 선택적으로 C파일을 포함할 수 있습니다. 스펙에는 컴포넌트가 사용하고(user) 제공하는(provide) 스팩 요소인 인터페이스 인스턴스, command, event들이 목록화 되어 있습니다.

따라서 컴포넌트가 인터페이스를 제공했다면 반드시 command로써 구현을 해야 되고 사용했다면 event로 구현을 해야만 합니다. 더불어 제공된 command나 event는 반드시 실행되야 합니다.

 

nesC 어플리케이션을 최상위의 어플리케이션 컴포넌트으로부터 하드웨어 컴포넌트까지 컴포넌트를 그래프로써 도식화 했다고 가정한다면 보편적으로 command는 하드웨어 컴포넌트 쪽으로 "call down"하고 event는 어플리케이션 컴포넌트 쪽으로 "call up" 합니다. 제어 스레드는 오직 스펙 요소에 따라 컴포넌트들을 제어합니다.

 

스펙 요소에는 인터페이스 인스턴스, command, event 등의 이름을 가질 수 있고 이 이름들은 컴포넌트 스펙 범위 내에서 namespace을 따릅니다.

 

컴포넌트 스펙에는 여러개의 uses와 provides 지시어를 사용할 수 있습니다. 여러개의 uses, provides 지시어는 또 다시 하나의 uses, provides 지시어로 묶을 수 있습니다.

 

여러개의 지시어 사용히기

 하나의 지시어 사용하기

 

    module A1 {

        uses interface X;

        uses interface Y;

    }

 

 

    module A1 {

        uses {

              interface X;

              interface Y;

        }

    }

 

 

인터페이스 인스턴스 선언을 interfaec X as Y로 했다면 인스턴스의 이름을 Y로 특별하게 재정의한 것입니다. 이것은 C++의 네임 스페이스와 비슷하다는 생각입니다. 즉, 각각의 컴포넌트에서 같은 인터페이스를 사용할 때 오는 혼란과 충돌을 방지하기 위해서라고 볼 수 있습니다. 따라서 interface X 구문은 interface X as X을 축약한 것이라고 볼 수 있습니다. 인터페이스 매개변수를 가지는 인터페이스와 매개변수를 가지지 않는 인터페이스가 있습니다.

매개변수를 가지지 않는 인터페이스인 interface X as Y는 이 컴포넌트에서 하나의 인터페이스로 대응되는 단일 인터페이스 인스턴스를 의미하고 매개변수를 가지는 인터페이스는 여러개의 인터페이스로 대응되는 인터페이스 인스턴스를 의미합니다. 예를 들어 interface SendMsg S[uint8_t id]로 표현된다면 SendMsg 타입의 256가지 인터페이스를 선언한 것을 의미합니다. 이 때 매개변수의 타입은 반드시 정수이어야 한다.(enums는 여기서 허락하지 않습니다.)

인터페이스 매개변수가 없이 스펙에 정의가 됐다면 단일 command와 event로 대응되고 매개변수가 있다면 매개변수 command와 event로 대응됩니다. 인터페이스 매개변수는 다음의 코드처럼 함수의 매개변수 전에 위치합니다.

 

command void send[uint8_t id](int x)

 

인터페이스 매개변수는 인터페이스 타입이 아닌 컴포넌트 스펙내에 있는 command와 event를 따릅니다.

다음의 예를 보겠습니다.

 

configuration GenericComm {
    provides {
       interface StdControl as Control;
       interface SendVarLenPacket;

       // The interface are parameterised by the active message id
       interface SendMsg[uint8_t id];
       interface ReceiveMsg[uint8_t id];
    }
    uses{
       //signaled after every send completion for components which wish to
       //retry failed sends
       event result_t sendDone();
    }
}

 

이 예제에서 GenericComm은 :
    Control으로 이름이 다시 정의 된 Stdcontrol 형식의 단일 인터페이스 인스턴스을 제공합니다.
    SendVarLenPacket 형식의 단일 인터페이스 인스턴스인 SendVarLenPacket를 제공합니다.
    매개변수를 가지는 SendMsg와 ReceiveMsg 인터페이스 형식의 인터페이스 인스턴스를 제공합니다.




반응형
Posted by Real_G

댓글을 달아 주세요