WSN을 연구한 2년

Internet of Things 2011.01.05 09:55 Posted by 몽백작

무선 센서 네트워크(Wireless Sensor Networks)라는 분야를 선택하고 공부한지 어느 덧 2년. 시간이 흘러 졸업과 새로운 시작을 동시에 앞둔 지금 2년전 내 선택에 대해서 다시 한번 생각해보게 된다. 나는 무엇을 했는가? WSN은 유망하리라던 내 예상은 옳았는가? 나는 후회하지 않는가? 등등 정리를 하고 넘어가야 새로운 시작을 잘 할 수 있을 것 같다.

WSN은 현재 진행형이다. 더 이상 새롭게 촉망받는 기술도 아니지만 그렇다고 다 죽은, 끝장난 기술도 아니다. 학계 동향이 그동안 어떻게 변해갔는지 간략히 정리해보면 다음과 같다.
  • 2000년 전후, WSN 등장과 함께 전 학계의 관심이 폭발적으로 증가
  • 이후 2006~2007년까지는 MAC 및 라우팅 프로토콜에 집중
  • 2008년 이후 상호운용성(interoperability) 중요성 대두로 IPv6 관심
  • 2009, 2010년 에너지 문제에 USN 적용 시도(스마트그리드) 중
나의 경우 무선 통신과 관련한 연구 주제가 거의 바닥을 보인 2009년에 석사생활을 시작했으니 사실 너무 늦은 시기에 시작하였다. 문제는 내공이 부족한 탓에 너무 늦었다는 것도 너무 늦게 알아버렸다는 점이다. 그래서 조금 고생을 했다. 연구할 주제가 없는 대학원생은 힘들고 서글프다는 점도 알게 되었다.

이런 상태에서 획기적인 전환점이 있었으니, 2009년 늦가을 WSN 분야의 메이저급 학회인 SenSys에 참가할 기회가 생긴 것이다. 그 학회에 다녀온 이후 어설프게 새로운 MAC, 라우팅 프로토콜을 만들어 봐야 완전 획기적이지 않은 이상 아무도 봐주지 않는 쓰잘데기 없는 일이란 걸 알게 되었다.

그래서 그쪽을 포기하고 무엇을 할지 고민고민하다가 손에 붙잡은 것이 IPv6 표준문서이다. 사실 USN에서 IP를 적용해보자는 큰 논의는 2008년 SenSys에서 있었다. 그 여파로 2009년 SenSys와 연합하여 열린 1회 BuildSys 워크샵에서 두어개 논문이 발표되었다. 나의 경우는 거꾸로 BuildSys의 논문 두 편을 보고 2008년 SenSys에서 발표된 Jonathan Hui의 'IP is Dead, Long-Live IP for Wireless Sensor Networks'를 접하게 되었다.

그의 논문의 주 내용은 그 동안 WSN 분야의 틀에 박힌 첫번째 가정인 'severe resource-constrained nodes(몹시 자원이 제한적인 노드들)'에서 IPv6를 가능하도록 만들었다는 것이다. 그의 논문은 단순한 구현 논문 수준에서 벗어나 IPv6 표준을 구현하되 그 동안 학계에서 제안되어 온 WSN 관련 기술들을 함께 적용했다는 데 의미가 있다고 할 수 있다. 또한 타당한 근거들과 함께 '이제 우리 다같이 IPv6를 하자'라고 말하는 듯한 느낌이 있었다. 그 전만 해도 나 역시도 IPv6를 8비트 마이크로컨트롤러에 구현하는 것은 미친 짓이라 여겼다. 설상 가능하다 하더라도 왜 해야 하는지에 대해 이유가 부족했다. 하지만 그 논문이 내 생각을 바꿔 놓았다. IPv6를 하는 이유는 충분했다. 그것은 바로 사람들이 쓰게 하기 위해서 였다.

어차피 딱히 할 일도 없었으니 나도 한번 해보기로 했다. 구현할 운영체제로는 당연히 NanoQplus를 선택했다. 이럴 때 직접 만들 수 있는 운영체제가 있다는 점은 참 행복한 일이다. 만약 직접 다루는 운영체제가 없다면 함부로 구현해야 겠다는 생각을 못했을 것이다. 그런 면에서 대학원으로 UST를 택한 것과 ETRI의 지금 팀에 들어온 것은 참 잘한 일인 것 같다.

의욕에 넘쳐서 덤벼들어서 6LoWPAN 적응 계층과 IPv6, ICMPv6, UDP 까지 작성해서 간단한 1홉 에코 서버, 클라이언트, 그리고 핑 프로그램 등 예제 프로그램을 만들기까지 거의 한 달이 걸렸다. 하지만 그것으로 끝이 아니었다. 인터넷 표준이라는 것은 시시각각 변하기 때문에 IETF의 메일링 리스트를 구독하여 그들의 주고 받는 대화를 항상 따라가야 했다. 새롭게 구현하고, 다듬고, 수정하는 과정을 수없이 반복해야 했다. 한번은 6LoWPAN용 이웃 탐색과 관련하여 IETF 표준화 회의 전후로 방향이 전면 수정되는 일도 있었다. 안타깝게도 거의다 구현을 완료했었는데 눈물을 머금고 갈아 엎어야 했던 기억도 있다.

쉽지 않은 시간이었지만 그 과정에서 국내 학회논문 2편과 해외 학회논문 1편이 나왔다. 나름 괜찮은 소득이었다. 마침내 한 학기가 남은 시점, 학위 논문의 주제는 그 동안 삽질해온 NanoQplus위에 IPv6, 6LoWPAN, 그리고 RPL 등 구현으로 택했다. 여기에 실험과 검증, 개선 등 과정을 통하여 결과를 낼 수 있었고 논문심사를 통과할 수 있었다. 석사 생활 2년중 방황으로 1년, 미친듯 코딩으로 1년을 보냈으니 나름 괜찮게 보낸 것이라 생각이 된다. 따라서 후회가 되진 않는다. 물론 절반을 방황하긴 했지만 그 방황의 시간이 있었기에 괜찮은 주제가 눈에 띄지 않았을까 싶다.

앞으로는 WSN이 어떻게 될까? 외국에서는 아직 발전 가능성이 있다고 하지만 국내에서는 시장이 없다고, 한심한 SI라고 지적한다. 시장은 어떤 기술이 정말 '쓸만해야' 열릴 수 있는 것 아닐까? 그런 면에서 WSN은 아직도 멀었다. 아직 쓸만하지 않다는 이야기다. 쓸만하지 않으니까 정부에서 진행한 시범 사업의 결과가 그저 '시범'의 수준에 머무르는 것이 아닐까? 시범의 수준에만 머무르니 수요가 없고, 수요가 없으니 하드웨어 장비는 비싸기만 하다. 그러니 어디 한 곳에 적용할라 치면 엄청난 비용이 필요하다. 이런 악순환을 깨야 시장이 열리지 않을까?

난 IPv6의 적용이 WSN을 쓸만한 기술로 만드는데 일조한다고 생각한다. 그런 면에서 내가 만든 구현체가 우수한지 우수하지 않은지를 떠나 나름 뿌듯하기는 하다. 다행히 제작년 이후 주목받은 스마트 그리드에서 WSN에 IPv6를 적용하는 것을 기본으로 정의하고 있으니 시간 낭비는 아니었다는 생각이 든다. 그리고 이 일을 한번 끝까지 진행해보고 싶다. 지금 이 생각이 단순히 욕심일까? 글쎄...ㅋ

신고


신고

'NanoQplus' 카테고리의 다른 글

車 전자제어장치용 국내OS 확보 ‘쾌거’  (0) 2009.06.11
NanoQPlus v2.4.0 Release  (0) 2009.04.01
Nano Qplus 2.3.6 Release  (0) 2009.01.19
Nano MAC 3가지 수신 방법  (0) 2008.08.16
Nano MAC 초기화 - mac_init()  (0) 2008.08.15
Nano Q Plus 2.3.3 설치  (0) 2008.08.13

NanoQPlus v2.4.0 Release

NanoQplus 2009.04.01 19:27 Posted by 몽백작

http://www.qplus.or.kr/EMT/?ref=board/board.emt&bbs_table=m4_02&menu_table=m4_00&page=1&eb_idx=69

=====================================================================
2009.03.12 version 2.4.0
=====================================================================
 1. Configuration of NanoQplus
   - Need to export $CYGWIN_HOME (bash ex: export $CYGWIN_HOME=/cygdrive/c/cygwin)
   - You can install cygwin anywhere now.
 2. UART module for MSP430
   - The periodic fast calibration was removed. It makes a problem when many interrupts are occurred.
   - It was added at v2.3.6
 3. NanoMAC for ZigbeX
   - There was a bug that ZigbeX was halted when mac_init() is called because RX interrupt configuration was wrong. Fixed now.
 4. RENO routing protocol
   - Bug fixed.
 5. UBee430(Hanback corp.), a new platform was added.
   - with luminance, temperature, humidity, human detect and door open check sensors.
 6. Lots of sensor modules were added.

신고

'NanoQplus' 카테고리의 다른 글

車 전자제어장치용 국내OS 확보 ‘쾌거’  (0) 2009.06.11
NanoQPlus v2.4.0 Release  (0) 2009.04.01
Nano Qplus 2.3.6 Release  (0) 2009.01.19
Nano MAC 3가지 수신 방법  (0) 2008.08.16
Nano MAC 초기화 - mac_init()  (0) 2008.08.15
Nano Q Plus 2.3.3 설치  (0) 2008.08.13

Nano Qplus 2.3.6 Release

NanoQplus 2009.01.19 00:26 Posted by 몽백작

2009년 1월 13일자로 릴리즈되었네요.

ETRI 융합소프트웨어연구본부

다음은 게시글에 있던 내용입니다.



Click above file for NanoQplus download.
You can see the download link after sign-in.
 
안녕하세요. 센서네트워크플랫폼연구팀에 김해용입니다.
NanoQplus OS v2.3.6 이 새롭게 릴리즈 되었습니다.
 
본 공개 버전에서는 다음 두 가지 프로세서를 지원하며,
1. AVR Atmega128(L) (8비트) / avr-gcc 컴파일러 (공개) 사용
2. Msp430f1611 (16비트) / msp-gcc 컴파일러 (공개) 사용
 
비공개 버전에서는 아래의 프로세서를 추가로 지원합니다.
3. TI CC2430 (8051기반 8비트) / IAR 컴파일러 (상용) 사용
4. Radiopulse mg2455-f48 (망고, 8051기반 8비트) / Keil 컴파일러 (상용) 사용
5. ARM 프로세서 arm-tdms-s (32비트) / arm-gcc 컴파일러 (공개) 사용
6. MC9S12XDP512 통합 보드 S12X (16비트, 자동차 ECU용) / CodeWarrior 컴파일러 (상용) 사용 
 
 
오랜 기간에 걸쳐 보고된 다양한 버그가 수정되었으며,
특히 RENO 알고리즘은 완전히 새로 코딩되어, 안정성이 높아졌습니다.
상당한 차이가 있으므로, 기존 버전 사용자들은 꼭 새로운 버전으로 업데이트 하시기 바랍니다.
 
현재 이전에 약속했었던
- NanoESTO와의 호환
- UART PPP통신
기능은 추가되지 않았습니다.
참고하시기 바랍니다.
 
=====================================================================
2009.01.12 version 2.3.6
=====================================================================
 1.  EEPROM module for ATMEGA128
   - This module was substituted by WinAVR library.
 2. Semaphore
  - A bug was fixed.
 3. Message Queue
   3.1 Non-blocking TX/RX API names are changed.
     - msgq_isend() --> msgq_send_nb()
     - msgq_irecv() --> msgq_recv_nb()
 4.  Automatic stack size configuring module (BETA) was removed.
 5. Kconfigs and Makefiles were changed.
 6. Non-commercial platforms was removed.
   - ETRI-SSN, ISN-400n, SKY-z200
 7. "Manual numbering for thread ID (Deprecated)" option will not be supported anymore.
   - The old thread_create() function must be changed.
 8. Routing module (TENO, RENO)
   - init() arguments were changed. Callback function must be assigned when init() is called.
   8.1 RENO routing module
     - Whole new code.
     - Queue for RX msg has been removed. Must use callback function.
     - TX FIFO queue has been added.
     - This module will use one of USER THREAD. Therefore user can use threads up to 4. ( 5(max) - 1 = 4 )
     - Support 16bit address
 9. Nano MAC
   - nmac_tx() will be substituted by nmac_tx_noack() if the destination is 0xFFFF.
   9.1 STATIC MAC INFO Module for ATMEGA128 has been added
     - Only for Nano24 or Ziebex platform
     - You can give different mac info (short addr, pan addr, channel) with the same apllication (rom file).
     - Try "$make mac_info ch=[channel] pan=[pan_address] short=[short_address] port=[your_platform_port]" after fusing a rom file.
     - MAC infomation will be deleted if a new rom file is written on a FLASH.
   9.2 nmac_csma_ca_tx_trail() has chaged into nmac_unslotted_csma_ca()
     - stabler version.
 10. ADC module for MSP430
   - The sampling time duration has been shortened. (clock source was changed.)
 11. UART module for MSP430
   - tolerant of temperature change. Very fast calibration will be run every 31.25ms
 
 
=====================================================================
2008.02.20 version 2.3.4
=====================================================================
 - Known bug : nos_eeprom_write_byte() function (eeprom module) for ATmega128 has a bug if compiled with -O or -O1 switch.
 1.TENO routing module.
  - little performance update
2. Makefile
  - Useless memory usage by '__clz_tab' has been removed using '-lm' switch. You can save about 260 bytes RAM now!
3. UART module
 - uart_printf32 has been added. You can print out 32 bit variables.
 - uart_puti, uart_putu also supports 32 bit variables.
4. General Library
 - lltoa(), ultoa() has been added. These are used by uart_put..() functions.
5. ADC module for MSP430
 - There is a bug that NanoOS does not support multi-channel usage for ADC.
  Now you can use several ADC channel at the same time.
 

요새 여행이다 뭐다 해서 하나도 못보고 있었는데 여행 갔다온 다음부터 하나 둘 파헤쳐봐야겠네요.^^
저작자 표시
신고

'NanoQplus' 카테고리의 다른 글

車 전자제어장치용 국내OS 확보 ‘쾌거’  (0) 2009.06.11
NanoQPlus v2.4.0 Release  (0) 2009.04.01
Nano Qplus 2.3.6 Release  (0) 2009.01.19
Nano MAC 3가지 수신 방법  (0) 2008.08.16
Nano MAC 초기화 - mac_init()  (0) 2008.08.15
Nano Q Plus 2.3.3 설치  (0) 2008.08.13

UST-ETRI 면접 보다.

살아가면서... 2008.11.14 10:57 Posted by 몽백작

드디어 면접!!
떨리는 마음에 7시 40분경 집을 출발..
배포자료에 스테플을 박지 않아서 작업실 들러서 스테플 박고,

네비에서 한국전자통신연구원을 찍었더니 전자통신우체국이 나온다.;;;
위치가 거기서 거기겠지 하는 마음에 출발!!

ETRI...
모든 전자, 전기, 정보통신 공대생들의 로망...
입구에서부터 압도되었다.

면접 대기실 가서 발표할 자료 읽어보면서 기다리고 있는데,
떨리는 마음 어떻게 안되나보다.
우황청심환 하나 들이키고 났더니 좀 나아졌다.

접수를 일찍해서 면접도 첫번째로 봤다.
들어가니 면접관 박사님들이 ㄷ자 형태로 앉아계셨다.

처음 나온 말이 "석사니까 해봤던 프로젝트 경험 위주로 10분내로 합시다."
대학원입학준비위원회 에서 읽었던 후기와 같은 시나리오였다.
미리 예상을 했었고, 아예 발표자료도 그런식으로 준비했기 때문에 자신있게 "예!!" 하고 대답했다.

첫번째 면접이라 그런지 면접관들이 집중하고 지켜봐주셨다.
특히, 졸업작품 관련하여 ETRI에서 만든 Nano Qplus를 사용했기에 센서네트워크 플랫폼 연구부쪽 박사님의 질문이 중간중간에 있었다.

질문 내용을 대충 정리하자면...
1. 학업 계획도 중요하지만 열정도 중요하다. Nano Qplus를 사용해보면서 풀리지 않을 때 우리쪽 연구원들과 접촉한 적이 있나?
2. ARM7TDMI를 사용했다했는데, 코어 이름 말고 칩은 어떤 걸로 사용했나?
3. 가장 길게 짠 코드 라인 수가 몇 라인 정도 되나?
4. 졸업 작품은 몇명이서 한조였나? 각각 무슨 일을 맡았고, 그쪽은 어떤 부분을 주로 했나?
5. 하드웨어 칩의 사양을 파악하기 위한 데이터 시트는 보는 편인가? 볼줄 아나?
6. xx 프로젝트를 할때 주로 무슨 일을 했었나?
7. TO문제로 원하는 곳으로 못가도 상관없나?

기타 다른 질문은 기억이 나질 않는다.(아무래도 내가 내가 아니었던 모양ㅋㅋ)

마지막에 "감사합니다. 잘 부탁드립니다." 했더니 모두 웃으셨다. ;;; (난 진심으로 간절하게 이야기한건데...)
아무튼 긍정적인 느낌이다. 물론 결과는 나와봐야겠지만...

큰 산을 하나 넘었다.
운명이 갈리는 순간은 3주 후 12월 5일...
아... 정말 꼭 가고 싶다.

이제 마음을 비우고, 졸업작품과 논문의 마무리에 전념해야겠다. ^^
신고

'살아가면서...' 카테고리의 다른 글

댓글달기 무서운 세상  (0) 2009.01.21
간만에 휴식기  (0) 2008.12.14
UST-ETRI 면접 보다.  (0) 2008.11.14
UST 면접 D-1  (0) 2008.11.13
UST 면접 D-2  (0) 2008.11.12
R.P.G Shine - W&Whale  (0) 2008.11.08

Nano MAC 3가지 수신 방법

NanoQplus 2008.08.16 10:41 Posted by 몽백작

Nano Q Plus의 Nano MAC은 수신을 3가지 방법으로 수행할 수 있다. /nos-2.3.3/test-apps/net-test/를 들어가보면 4개의 하위 디렉토리가 존재하는데, tx 하나와 rx 3가지 이다.

  • tx : 데이터 전송
  • rx-direct-callback : 수신시 바로 콜백 함수로 이동
  • rx-non-callback : 콜백 함수 없이 쓰레드를 하나 만들어 메시지 수신 여부를 계속 폴링
  • rx-taskq-callback : 메시지 수신시 콜백함수에서 메시지 처리 함수를 태스크 큐에 등록하고, 태스크 큐에서 순차적으로 메시지 처리

이들 3가지 수신 방법은 Nano Q Plus를 이용하여 RF 통신을 하려는 개발자들에게 좋은 예제가 될 수 있다.


(1) Tx

메시지 전송 프로그램은 무한 루프를 돌면서 메시지를 계속해서 송신하는 것이다. Nano MAC의 기본적인 RF 전송 방법이다.

//===================================================================
//
// Max payload, Extream data flow Test
// tx.c (@shert, @haekim)
//
//===================================================================
// Copyright 2004-2010, ETRI
//===================================================================

#include "nos.h"

NMAC_TX_INFO tx_info;    // Simple mac Tx information
UINT8 tx_payload[NMAC_MAX_PAYLOAD_SIZE];    // Simple mac max payload : 115 byte

int main (void)
{
    UINT8 n;
   
    nos_init();
    led_on(1);
    uart_puts("\n\r*** Nano OS ***\n\r");

    tx_info.dest_addr = 0x5678; // destination node id = 0x5678 (B)
    tx_info.payload_length     = NMAC_MAX_PAYLOAD_SIZE; //116
    tx_info.payload_ptr = tx_payload;

    // Write dummy data to tx_payload[1]~[115].
    for (n = 0; n < NMAC_MAX_PAYLOAD_SIZE; n++)
    {
        tx_payload[n] = n;
    }

    mac_init(0x1a, 0x2420, 0x1234);   
    // channel=26, PAN id = 0x2420, source node id = 0x1234 (A)

   
    while (TRUE)
    {
        led_toggle(2);       

        ++tx_payload[0];
        // Sends packet. Requests autoack
        if (mac_tx(&tx_info))
        {
            uart_printf("\nTX (success): %u", n);
            led_blink(3);
        }
        else
        {
            uart_printf("\n\tTX (fail) : %u", n);
        }

        //delay_ms(1000);
        ++tx_payload[0];
        // Sends same packet but do not request autoack.
        mac_tx_noack(&tx_info);
        uart_printf("\n\t\tTX without ACK : %u", n);
        //delay_ms(1000);
    }
   
    return 0;

}
소스 코드를 보면 프레임에 바이트 순서 (0x00, 0x01, 0x02, 0x03 ..... 0x74)를 채워놓고, 첫번째 바이트를 증가시켜가면서 전송한다. 전송은 2가지 모드로 수행하는데, 처음에는 Autoack, 그 다음에는 ACK 없이 전송한다. 이 둘의 차이는 나중에 차차 알아보기로 한다.


(2) Rx-direct-callback

메시지 수신시 하던 일을 잠시 멈추고, 바로 콜백 함수로 이동하여 메시지 처리를 수행한다.

//===================================================================
//
// rx-direct-callback.c (@haekim)
//
//===================================================================
// Copyright 2004-2010, ETRI
//===================================================================

#include "nos.h"

NMAC_RX_INFO rx_info;
UINT8 rx_payload[NMAC_MAX_PAYLOAD_SIZE];

void read_frame(void)
{
    UINT8 payload_first;
    while ( mac_rx(&rx_info) )
    {
        led_toggle(3);   
        payload_first = ((UINT8 *)(rx_info.payload_ptr))[0];
        uart_printf("RX : %u, \tRSSI(%d),\tCorr(%d)\n", payload_first, rx_info.rssi, rx_info.corr );
    }
 }

int main (void)
{
    nos_init();
    led_on(1);
    uart_puts("\n\r*** Nano OS ***\n\r");

    rx_info.payload_ptr = rx_payload;

    mac_init(0x1A, 0x2420, 0x5678);
    // channel=26, PAN id = 0x2420, node id = 0x5678 (B)

    nos_uart_init(STDOUT);
    mac_set_rx_cb( read_frame );   
    // default : NULL, sets a callback function for RX interrupt

   
    while (TRUE)
    {
        delay_us(100);    // do nothing
    }
    return 0;
}
마치 인터럽트 처리를 하는 것처럼 수신한 메시지를 처리할 콜백 함수를 등록하고, 메시지 수신시 등록한 콜백함수로 이동하여 즉시 처리하도록 하는 방식이다. 메시지의 내용이 길고, 수신 주기가 매우 빠른 경우에도 위와 같은 간단한 루틴으로 처리가 가능하다. 하지만, 멀티쓰레딩 등 모트 프로그램이 복잡해질 경우, 하나의 메시지 처리가 완료되기 전에 다른 메시지가 들어와 콜백이 수행될 경우가 발생할 수도 있을 것 같다.


(3) Rx-non-callback

메시지 수신 콜백함수가 따로 존재하지 않는다. 대신 쓰레드를 하나 만들어 메시지 수신 여부를 계속해서 폴링하는 방식이다.

//===================================================================
//
// rx-non-callback.c (@haekim)
//
//===================================================================
// Copyright 2004-2010, ETRI
//===================================================================

#include "nos.h"

NMAC_RX_INFO rx_info;
UINT8 rx_payload[NMAC_MAX_PAYLOAD_SIZE];


void task1(void *args)
{
    while (TRUE)
    {
        if( mac_rx(&rx_info) )
        {
            led_toggle(3);
            uart_printf("RX : %u, \tRSSI(%d),\tCorr(%d)\n",((UINT8*)(rx_info.payload_ptr))[0], rx_info.rssi, rx_info.corr );
        }
    }
}


int main (void)
{
    nos_init();
    led_on(1);
    uart_puts("\n\r*** Nano OS ***\n\r");

    rx_info.payload_ptr = rx_payload;

    mac_init(0x1A, 0x2420, 0x5678); // channel=26, PAN id = 0x2420, node id = 0x5678 (B)
    //mac_set_tx_power(31); //default
    //mac_set_rx_range(0x0000, 0xffff);
   
    thread_create(task1, NULL, 0, PRIORITY_NORMAL);
    sched_start();
   
    return 0;
}
메시지 수신여부만 계속 관찰하는 쓰레드를 동작시키다 보니 쓰레드의 우선순위가 메시지 처리 성능의 관건이 될 듯 싶다. 쓰레드의 우선순위가 메시지 처리를 소화할 정도보다 낮거나, 쓰레드가 하는 일이 많은 경우, 프레임을 놓치는 경우도 발생할 듯 싶다.


(4) Rx-taskq-callback

메시지 수신시 콜백함수로 이동하여 태스크큐(할일을 쌓아놓은 큐)에 메시지 처리 함수를 등록한다. 커널 내부에서 태스크큐에 쌓인 함수들을 순차적으로 처리한다.

//===================================================================
//
// rx-taskq-callback.c (@haekim)
//
//===================================================================
// Copyright 2004-2010, ETRI
//===================================================================

#include "nos.h"

NMAC_RX_INFO rx_info;
UINT8 rx_payload[NMAC_MAX_PAYLOAD_SIZE];

void read_frame(void)
{
    if( mac_rx(&rx_info) )
    {
        led_toggle(3);       
        uart_printf("RX : %u, \tRSSI(%d),\tCorr(%d)\n",((UINT8*)(rx_info.payload_ptr))[0], rx_info.rssi, rx_info.corr );
    }
 }

void mac_rx_callback(void)
{
    nos_taskq_reg( read_frame );
}

void task1(void *args)
{
    while (TRUE)
    {
        led_toggle(2);
        delay_ms(500);   
    }
}


int main (void)
{
    nos_init();
    led_on(1);
    uart_puts("\n\r*** Nano OS ***\n\r");

    rx_info.payload_ptr = rx_payload;

    mac_init(0x1A, 0x2420, 0x5678); // channel=26, PAN id = 0x2420, node id = 0x5678 (B)
    mac_set_rx_cb( mac_rx_callback );    // default : NULL, sets a callback function for RX interrupt
    //mac_set_tx_power(31);
    //mac_set_rx_range(0x0000, 0xffff);

    thread_create(task1, NULL, 0, PRIORITY_NORMAL);
    sched_start();
   
    return 0;
}
가장 안전한 방법이라 생각된다. 태스크큐에 쌓인 함수들을 커널 내부에서 순차적으로 수행하게 하므로, 메시지 처리중에 메시지 수신을 놓치지 않을 것이다. 기본적으로 태스크큐에는 5개까지 넣을 수 있다.

신고

'NanoQplus' 카테고리의 다른 글

NanoQPlus v2.4.0 Release  (0) 2009.04.01
Nano Qplus 2.3.6 Release  (0) 2009.01.19
Nano MAC 3가지 수신 방법  (0) 2008.08.16
Nano MAC 초기화 - mac_init()  (0) 2008.08.15
Nano Q Plus 2.3.3 설치  (0) 2008.08.13
아날로그-디지털 변환 - ADC12  (0) 2008.07.29

Nano MAC 초기화 - mac_init()

NanoQplus 2008.08.15 22:31 Posted by 몽백작

Nano Q Plus에서는 IEEE 802.15.4 LRPAN 표준을 따르지만, ZigBee Layer가 포함되어 있지 않다. 대신 Nano MAC이라는 간단한 MAC 프로토콜을 사용한다. Nano MAC을 사용하기 위해서는 초기화가 필요하다.

#define mac_init(channel, panaddr, myaddr) nos_mac_init(channel, panaddr, myaddr)

* Parameters
- channel : RF 주파수 채널
- panaddr : PAN(Personal Area Network) 주소
- myaddr : 모트 주소

* return : 없음

※ Kmote와 USB인터페이스 보드를 사용하는 경우, 일부 특별한 경우, 초기화 직후부터 UART 통신이 불가능해진다. mac_init() 매크로는 nmac_init() 이라는 함수로 대체되는데, 이 함수 내에서 CC2420 초기화 및 RF ON을 통해 RF 통신을 가능하도록 한다. 특히, CC2420을 수신 모드로 바꾸고 송수신 큐들을 flush 하는 과정이 끝나면 UART가 불가능해지는데, 정확한 이유를 모르겠다. 지금까지 발견한 바로는 FT232를 사용하는 모트의 USB 인터페이스 보드를 사용하면 안되지만, MAX232같은 RS-232 칩을 사용할 경우, UART가 동작한다는 점이다. 아무래도 인터페이스 보드가 좀 이상한 것 같은데, CC2420과 FT232간 연관 관계가 있는 것도 아니고, Nano Q Plus 문제도 아닌듯 싶다. 뭔지 모를 하드웨어 문제인듯...
신고

'NanoQplus' 카테고리의 다른 글

Nano Qplus 2.3.6 Release  (0) 2009.01.19
Nano MAC 3가지 수신 방법  (0) 2008.08.16
Nano MAC 초기화 - mac_init()  (0) 2008.08.15
Nano Q Plus 2.3.3 설치  (0) 2008.08.13
아날로그-디지털 변환 - ADC12  (0) 2008.07.29
자원 동시 접근 제어 - Semaphore  (0) 2008.07.28

Nano Q Plus 2.3.3 설치

NanoQplus 2008.08.13 11:08 Posted by 몽백작

나노 큐 플러스를 다시 설치할 일이 생겼다. 이참에 글로 한번 남겨보고자 한다.

나노 큐 플러스의 경우 개발 환경이 크게 둘로 나뉜다. 첫째는 리눅스 에뮬레이터인 cygwin을 이용한 방법과 두번째는 Eclipse 기반의 Esto 개발툴을 이용한 방법이다. Esto는 ETRI에서 텍스트 위주의 리눅스에서의 개발이 익숙치 않은 개발자들을 위해 나왔다고는 하지만, 개인적으로 수차례 시도했지만 제대로 성공한 적이 없다. 더군다나 내가 사용하는 mote의 MCU가 MSP430인데, AVR계열의 MCU를 사용하는 mote들만을 위해서 나온듯 싶다. 차라리 cygwin을 사용하는 편을 추천하는 편이다. 리눅스에서 개발 경험이 없다 하더라도 몇가지 명령어만 알면 금방 익숙해 질 수 있고, Source Insight라든지 UltraEdit, Beyond compare 등등 소스 작성에 유리한 툴들과 함께 사용하면 불편함 없이 너무 편하게 사용할 수 있다.

먼저 ETRI 융합소프트웨어 연구본부에서 Nano Q Plus와 Nano Q Plus Tool Package를 다운받아야 한다. 회원 가입후, 소스 자료실에서 다운받을 수 있다.

사용자 삽입 이미지

Nano Q Plus Tool Package는 Nano Q Plus를 사용하기 위한 cygwin과 컴파일러인 WinAVR 또는 MSP430-gcc, PonyProg 같은 퓨징 프로그램, USB-to-RS232(FTDI) Driver 등이 포함되어 있는 패키지이다.

Tool Package를 루트(C:\)에 압축을 푼다. 필자의 경우 C:\nano_qplus_tool_package-071008 에 압축을 풀었다.

사용자 삽입 이미지

이제 Cygwin을 설치하자. 툴 패키지의 Cygwin 디렉토리에 있는 setup.exe를 실행시킨다.

사용자 삽입 이미지

다음과 같은 화면이 나타난다.

사용자 삽입 이미지
 다음을 클릭한다.

사용자 삽입 이미지

3번째 Install from Local Directory를 선택한다. 툴 패키지 내에 이미 나노 큐 플러스를 사용하기 위한 패키지가 모두 포함되어 있으므로 Instal from Internet을 선택해서 설치할 패키지를 고민할 필요가 없다.

사용자 삽입 이미지

Cygwin 에뮬레이터에서 사용할 루트 디렉토리는 디폴트로 하여 다음을 클릭한다.

사용자 삽입 이미지

Cygwin 패키지가 있는 경로를 선택한다. Install From Local Directory를 선택했으므로 로컬 디렉토리에서 Cygwin 패키지를 선택해야 하는데, 툴 패키지에 포함되어 있으므로, 그대로 다음을 클릭하면 된다.

사용자 삽입 이미지

패키지를 선택할 수 있는 화면인데, 나노 큐 플러스에 필요한 패키지가 디폴트로 설정되어 있으므로 다음을 클릭하면 된다.

사용자 삽입 이미지

설치가 진행된다.

사용자 삽입 이미지

설치가 종료되면 바탕화면에 아이콘을 만들것인지, 시작메뉴에 아이콘을 만들것인지 선택하게 된다. 각자 취향대로 선택하시고 마침을 클릭하면 Cygwin 설치가 종료된다.

이제 컴파일러를 설치해보자. 나노 큐플러스는 수가지의 상용화된 mote들을 지원하는데, 모두 MICAz 기반의 AVR의 Atmega128L 아니면 Telos 기반의 TI의 MSP430f1611이다. 필자는 국내 업체인 아이앤테크라는 곳에서 나온 Kmote를 사용하는데, Telos 기반의 Tmote-Sky와 compatible 하므로, MSP430-gcc를 설치한다. MICAz 계열을 사용하는 분들은 WinAVR과 PonyProg를 설치하면 된다.

사용자 삽입 이미지

툴 패키지의 Compiler에 보면 2가지 컴파일러가 있는데, 필자는 mspgcc를 설치한다.

사용자 삽입 이미지

mspgcc의 경우, 설치에 특별한 것이 없으므로 Next만 클릭해주면 된다.
mspgcc를 Cygwin에서 사용하기 위해서는 cygwin의 버전을 맞춰줘야 한다고 한다. 이를 위해 C:\cygwin\bin\cygwin1.dll 파일을 mspgcc가 설치된 C:\mspgcc\bin 에 덮어 써야 한다.

사용자 삽입 이미지

사용자 삽입 이미지

또 한가지 고려 사항은 환경 변수 설정이다. 바탕화면의 내컴퓨터에 오른쪽 버튼을 클릭하여 속성을 클릭한 후, 고급 탭의 환경 변수를 클릭한다.

사용자 삽입 이미지

사용자 삽입 이미지

사용자 삽입 이미지

시스템 변수의 Path 를 더블클릭하여 c:\mspgcc\bin이 있는지 살펴보자. 없으면 위와 같이 가장 뒤에 세미콜론을 붙이고 추가한다. 이는 어떤 경로에서든 mspgcc를 실행하기 위함이다.

이제 Cygwin을 실행하여 나노 큐 플러스의 개발 환경을 설정해 보자. 바탕화면의 Cygwin을 더블클릭하여 cygwin을 실행한다.
사용자 삽입 이미지

사용자 삽입 이미지

실행해 보면 딱딱한 콘솔만 나온다. 리눅스를 접해보지 않은 개발자들을 위해서 몇가지 간단한 리눅스 명령어를 DOS 명령어와 비교해 소개하자면 다음과 같다.

ls : 디렉토리의 파일 목록 출력. dir
cd <경로>: 디렉토리 변경. cd <경로>
md : 디렉토리 생성. mkdir
pwd : 현재 디렉토리 경로 출력. cd
rm <대상파일> : 파일 삭제. del <대상파일>
rmdir <경로> : 디렉토리 삭제. rd <경로>
cp <원본> <대상> : 파일 복사. copy <원본> <대상>
mv <원본> <대상> : 파일 이동. move <원본> <대상>
mv <대상> <변경할 파일명> : 파일명 변경. ren <대상> <변경할 파일명>
cat <대상> : 파일 내용 출력. type <대상>

이정도만 알아둬도 가슴치며 답답한 상황은 나오지 않을 것이다.
이제 본격적으로 환경 설정에 들어가 보자.

사용자 삽입 이미지

콘솔에서 위와 같이 cd /cygdrive/c/nano_qplus_tool_package-071008 이라고 치면 툴 패키지의 경로로 이동한다. cygwin은 리눅스 에뮬레이터이기 때문에 처음 설치시에 루트 디렉토리를 설정해둔 사실을 기억해보자. cygwin에서는 루트 (/)가 c:\cygwin에 해당한다. 즉, cd / 명령어는 루트로 디렉토리를 이동하라는 명령이고, 루트에 있는 cygdrive는 Windows의 드라이브(a, c, d ....)를 폴더로 인식하도록 해주는 역할을 한다. 정리해보면, cd /cygdrive/c/nano_qplus_tool_package-071008 이라는 명령어는 c:\nano_qplus_tool_package-071008 로 디렉토리를 변경하라는 뜻이다. ls를 쳐보면 디렉토리에 있는 파일들이 출력된다.

이제 sh 1_qplusn.sh 를 쳐보자. 이는 cygwin에서 나노 큐 플러스에 맞도록 경로 등을 설정하는 부분이다. 아래에 맞춰 입력하자.

사용자 삽입 이미지

주의할 점은 두번째 질문은 나노 큐 플러스가 설치될 곳(c:\cygwin\nos-2.3.3)을 cygwin식 경로로 입력해줘야 한다는 것이다. 또 한가지는 마지막에 nos-2.3.0을 입력한 경로로 복사하겠느냐는 것인데, 2.3.0 버전을 기준으로 되어 있으므로 이 부분은 n을 선택하고 직접 복사해주면 된다.

처음에 다운받았던 나노 큐플러스 2.3.3 버전을 c:\cygwin\nos-2.3.3에 복사하자.
사용자 삽입 이미지
복사는 예전처럼 탐색기에서 직접 하면 된다.

다시 cygwin으로 돌아와서 sh 2_env.sh 를 입력하자.
사용자 삽입 이미지
이는 딱딱한 콘솔화면을 그나마 조금 보기 쉽게 만들어 주기 위함이다. 모두 y 를 입력하고 cygwin을 종료하고, 다시 시작하자.

사용자 삽입 이미지

많이 밝아졌다. ㅋ

이제 nos 라고 입력해보자. 그러면 자동으로 나노 큐플러스가 설치된 디렉토리로 이동할 것이다.

사용자 삽입 이미지

설치가 최종적으로 잘 되었는지 확인하기 위해 sh Check.sh 를 입력하면 다음과 같이 출력될 것이다.
사용자 삽입 이미지

여기서 신경써서 봐줄 부분은 바로 컴파일러 부분이다. WinAVR이나 mspgcc를 설치했다면 해당 컴파일러의 경로가 출력되어야 한다. 만약 설치를 했는데 나타나지 않는다면 환경변수 쪽을 의심해봐야할 필요가 있다.

모든 설치가 완료되었다.
이제 제대로 컴파일 및 다운로드가 되는지 확인해보자.

사용자 삽입 이미지

nos 위치에서 cd test-apps/platform-test/tmote-sky/led/ 를 입력하여 LED 깜빡이기 테스트 프로그램으로 이동해 컴파일 및 다운로드해보자.

먼저 수행할 명령어는 make menuconfig 이다.
사용자 삽입 이미지
만약 위와 같은 에러메시지가 나타난다면 당황해 하지 말자. (살짝 나도 당황했다는...;;;) 밑에서 세번째 줄을 보면 화면이 너무 작다고 징징대는 것을 알 수 있다. 창 사이즈를 좀 늘리고 (80*19 이상) 실행해보면 다음과 같은 menuconfig 프로그램이 나타난다.

사용자 삽입 이미지

이는 나노 큐 플러스를 해당 플랫폼에 맞게 설정하는 부분이다. 첫번째는 플랫폼, 두번째는 UART 통신 속도, 세번째는 사용할 기능들, 네번째는 사용할 커널 기능들, 다섯번째는 네트워크 관련 기능들을 설정할 수 있다.

모두 맞게 설정한 후 좌우 화살표를 이용하여 Exit에 커서를 옮기고 엔터를 치면 모두 저장된다.

여기서 설정한 부분들은 kconf.h 파일에 자동으로 입력된다. 따라서 kconf.h는 직접 수정할 필요 없이 make menuconfig 프로그램으로 수정하면 된다.

이제 본격적인 빌드를 위해 콘솔에서 make를 쳐보자.

사용자 삽입 이미지

뭔가 후다다닥 엄청난 양이 지나가고 나서 'led.rom' has been created 가 출력되었다면 성공한 것이다. 이제 모트를 꽂아보자.
만약 FTDI를 사용한 적이 없다면 새 하드웨어 마법사가 나타날 것이다.

목록 또는 특정 위치에서 설치를 선택한후, 다음과 같이 툴 패키지에 포함된 USB to Serial Driver 경로를 입력하자.

C:\nano_qplus_tool_package-071008\Platform Driver\USBtoSerial

사용자 삽입 이미지

사용자 삽입 이미지

이렇게 한번 더 마법사가 나타나는데 똑같은 경로로 설치하면 된다. 드라이버 설치가 완료되었으면 다시 콘솔로 가보자.

make motelist를 입력하여 연결된 mote의 시리얼 포트 번호를 알아내자.
사용자 삽입 이미지

COM3라고 출력됨을 알 수 있다.

굽기 위해서는 make burn port=com3 이런식으로 입력하면 된다.
사용자 삽입 이미지

다운로드가 완료되었다. 이 순간 모트를 바라보면 led를 번갈아 깜빡이고 있을 것이다.
신고

'NanoQplus' 카테고리의 다른 글

Nano MAC 3가지 수신 방법  (0) 2008.08.16
Nano MAC 초기화 - mac_init()  (0) 2008.08.15
Nano Q Plus 2.3.3 설치  (0) 2008.08.13
아날로그-디지털 변환 - ADC12  (0) 2008.07.29
자원 동시 접근 제어 - Semaphore  (0) 2008.07.28
thread 사용의 시작  (0) 2008.07.27

아날로그-디지털 변환 - ADC12

NanoQplus 2008.07.29 09:16 Posted by 몽백작

Kmote같은 Telos기반 모트는 MPU로 TI의 MSP430f1611을 사용한다. DSP로 유명한 TI MPU인 만큼 ADC도 12비트 분해능을 가진 ADC12와 10비트 분해능을 가진 ADC10을 사용할 수 있다. Nano Q Plus는 ADC12만 사용이 가능하다.

ADC를 사용하기 위해서는 플랫폼에서 ADC 모듈을 사용 가능하도록 설정해야 한다.
 
/nos/platform/$(플랫폼이름)/platform.c

void nos_platform_init()
{
#ifdef UART_M
        nos_uart_init(STDOUT);
#endif

#ifdef LED_M
        NOS_LED_INIT();
#endif

#ifdef RF_M
        nos_rf_init();
#endif

#ifdef SENSOR_HUM_M
        nos_hum_init();
#endif

#ifdef SENSOR_TEMP_M
        nos_temp_init();
#endif

#ifdef ADC_M
        nos_adc_init();
#endif

}

위의 굵은 빨간색 글씨 부분처럼 adc 모듈을 초기화해줘야 한다.
이렇게 하면 어플리케이션에서 nos_init() 호출시 nos_platform_init()을 호출하게되고, 이때, nos_adc_init()을 호출하게 되는 것이다.

어플리케이션에서 ADC 사용은 간단하다.
UINT16 nos_adc_convert(UINT8 sensor_type)

sensor_type에는 연결된 ADC 채널 번호를 넣어주면 된다. 가령, ADC0면 0을 넣어주면 된다.
이렇게 호출하면 내부적으로 자동으로 아날로그 값을 디지털값으로 변환하여 16비트 short 정수형으로 반환한다.

현재 나노 큐플러스 2.3.3에는 MSP430의 ADC 쪽에 버그가 있다. 다음은 ETRI에서 제공한 수정한 adc.c 파일이다.이 파일을 기존에 adc.c가 있는 디렉토리(/nos/arch/msp430x1611)에 덮어 쓰면 된다.
기존 코드의 문제점은 멀티 채널 사용시 ENC 비트의 유지가 안되는 점이라고 한다. 코드를 보면 기존에는 별다른 설정과정 없이 그냥 사용했지만, 수정된 코드는 pulse sample mode를 사용한다. 그래서 그런지 기존에는 간단한 LM35DZ 온도센서를 사용했음에도 불구하고, 값이 제멋대로 나왔는데, 이제는 잘 된다.
(이 파일의 포스팅을 허락해주신 ETRI 김해용 연구원님께 이자리를 빌어 다시한번 감사를...^^)
신고

'NanoQplus' 카테고리의 다른 글

Nano MAC 초기화 - mac_init()  (0) 2008.08.15
Nano Q Plus 2.3.3 설치  (0) 2008.08.13
아날로그-디지털 변환 - ADC12  (0) 2008.07.29
자원 동시 접근 제어 - Semaphore  (0) 2008.07.28
thread 사용의 시작  (0) 2008.07.27
Nano Q Plus OS 디렉토리 분석 – [nos]  (0) 2008.07.24

자원 동시 접근 제어 - Semaphore

NanoQplus 2008.07.28 09:59 Posted by 몽백작

멀티쓰레딩에서 자원 접근성 제어와 크리티컬 섹션 진입을 제어하는 기능은 필수라고 할 수 있을것이다. 멀티쓰레드를 지원하는 Nano Q Plus도 이를 위해서 세마포어를 사용할 수 있다.

#define sem_create(val)

세마포어를 생성한다. 인자 val은 세마포어의 값(특정 자원을 공유할 수 있는 최대 쓰레드의 수)을 지정한다. 가령, val = 1로 하면 바이너리 세마포어(특정 자원에 하나의 쓰레드만 접근 가능)가 생성된다. 세마포어는 다음과 같이 간단한 구조체로 정의되어 있다.

typedef struct _semaphore
{
 volatile UINT8 val;  // value of semaphore
} *SEMAPHORE;

멤버 변수인 val은 세마포어의 값이며 이는 현재 자원에 접근할 수 있는 쓰레드의 수를 나타낸다.

#define sem_destroy(sem)

세마포어를 제거한다. 인자 sem은 제거할 세마포어를 나타낸다.

#define sem_signal(sem)

세마포어를 해제한다. 즉, 세마포어의 값을 하나 증가시키는 것으로, 쓰레드에서 자원 접근이 끝난 후, 호출할 때 사용한다. 세마포어의 값은 현재 자원에 접근할 수 있는 쓰레드의 수를 나타내므로, "해당 자원을 사용한 작업이 끝났으니 다른 쓰레드 하나가 접근할 수 있다." 라는 뜻이다.

#define sem_wait(sem)


세마포어를 획득한다. 즉, 세마포어의 값을 하나 감소시키는 것으로, 특정 공유 자원에 접근하기 전에 호출하여 자원에 대한 접근 권한을 요청하는 함수이다. 만약 세마포어의 값이 0(더이상 쓰레드가 접근할 수 없는 상태)이라면, 다시말해, 세마포어를 획득할 수 없다면 세마포어를 획득할 때까지(자원을 사용중인 다른 쓰레드가 세마포어를 해제할 때 까지) blocking 된다.


ETRI에서는 세마포어 대신에 enable_sched(), disable_sched() 함수를 이용하여 스케쥴러를 ON/OFF하도록 하여 뮤텍스를 구현할 수 있다고 한다.

신고



 

티스토리 툴바