ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Chapter 2
    전공 - IT/졸업작품 2023. 7. 16. 16:14

    영어 원문을 한글로 해석하여 정리한 글이므로 정확하지 않은 정보를 포함할 수 있음

     

     목차 

    1.   Contiki-NG 프로그래밍 모델

    2.   Contiki-NG 기본 구문

    3.   Protothreads 검토

    4.    Contiki-NG 라이브러리 확장

    5.    Contiki-NG 코딩 규칙

    6.    Contiki-NG 애플리케이션 구축

     

     

     

    1. Contiki-NG 프로그래밍 모델 

    Contiki-NG 프로그래밍


    Contiki-NG는 구성요소 중심의 C 프로그램이 언어를 사용한다

    대부분의 WSN mote는 절전모드에서 작동하며 실행할 작업이 있다면 프로그램은 하드웨어 인터럽트를 통해 작업을 수행한다
    이후 작업이 완료되면 Contiki-NG프로그램은 절전모드로 돌아간다

     

     

    Contiki-NG는 Protothread를 적용하고 위의 접근방식을 사용하여 Contiki-NG 응용 프로그램을 개발할 수 있다

    1. 프로젝트 생성

    2. C 프로그램을 만들고 Contiki-NG 프로그램 개발을 위한 protothreads 접근 방식을 적용

    3. 프로그램 작성이 끝나면 컴파일하여 WSN mote에 업로드

     

     

    Contiki-NG 프로그램 구조와 폴더 정보

     

    Contiki-NG 프로그램 구조

     

    Contiki-NG 폴더 정보 영문, 한글

     

     

     

    2. Contiki-NG 기본 구문 

    일반적으로 Contiki-NG는 C 프로그래밍 언어를 채택한다

     

     

    프로젝트 생성

    Contiki-NG 프로그램은 프로그램을 구축하기 위한 프로젝트 템플릿을 제공하지 않는다

    새 프로젝트를 만들려면 새 폴더와 Makefile 파일을 만드는 것부터 시작한다

     

    Contiki-NG 폴더에 vscode라는 폴더를 만들고 기초적인 프로그래밍 언어를 작성 후 저장해 보았다

     

     

     

     3. Protothreads 검토 

    Protothread는 소형 임베디드 시스템 또는 WSN 노드와 같이 메모리가 제한된 시스템용으로 설계된 경량 스레드이다

     

    Contiki-NG Protothreads 구현 폴더 위치

     

    Contiki-NG Protothreads 구현 내용

     

    PT_INIT(pt)
    //  함수를 초기화 하기 위해 사용된다
    
    PT_THREAD(name_args)
    //  Protothread를 선언하는데 사용되는 매크로이다
    
    PT_BEGIN(pt)
    //  a의 시작점을 선언하는데 사용된다
    
    PT_END(pt)
    //  Protothread를 종료하는데 사용된다
    
    PT_WAIT_UNTIL(pt,  condition)
    //  지정된 조건이 참일 때 까지 Protothread를 차단하는데 사용된다
    
    PT_WAIT_WHILE(pt,  cond)
    //  차단에 사용되며 조건이 참일 때까지 기다린다
    
    PT_WAIT_THREAD(pt,  thread)
    //  자식 Protothread
    //  현재 Protothread는 하위 Protothread가 완료될 때까지 차단된다
    
    PT_SPAWN(pt,  child,  thread)
    //  하위 Protothread를 생성하고 종료될 때까지 대기하는 데 사용된다
    
    PT_RESTART(pt)
    //  Protothread는 PT_BEGIN() 호출 위치에서 실행을 다시 시작한다
    
    PT_EXIT(pt)
    //  Protothread를 종료하는데 사용된다
    
    PT_SCHEDULE(f)
    //  Protothread를 예약하는데 사용된다
    //  함수의 반환 값은 Protothread가 프로토스레드가 실행 중이면 
    //  0이 아닌 값을 가지며, 프로토스레드가 종료되었을 경우 0을 반환한다
    
    PT_YIELD(pt)
    //  현재 Protothread에 생성된다
    
    PT_YIELD_UNTIL(pt,  cond)
    //  조건이 발생할 때까지 Protothread에서 양보한다

     

     

     

     4. Contiki-NG 라이브러리 확장 

    Contiki-NG OS는 경우에 따라 확장할 수 있는 여러 라이브러리와 앱으로 구성된다

    Contiki-NG OS 기능을 확장하려면 C 프로그램을 빌드하는 동안 사용된 것과 동일한 접근 방식을 따를 수 있다

     

    contiki-ng 하위폴더에 demo-counter 라는 폴더를 생성한다

     

    생성한 폴더 아래에  Makefile, demo-counter.c, mycounter.c, mycounter.h 를 생성한 뒤 native 파일을 생성한다

     

    // mycounter.h 
    
    #ifndef MYCOUNTER_H
    #define MYCOUNTER_H
    
    int next_round(int temp);
    
    #endif
    // mycounter.c
    
    #include "mycounter.h"
    
    int next_round(int temp)
    {
        if (temp > 59)
        {
            temp = 1;
        }
        else
        {
            temp++;
        }
        return temp;
    }
    // demo-counter.c
    
    #include "contiki.h"
    #include "sys/etimer.h"
    #include "mycounter.h"
    #include <stdio.h>
    
    PROCESS(mycounter_process, "My Counter Process");
    AUTOSTART_PROCESSES(&mycounter_process);
    
    static struct etimer et;
    static int count = 0;
    
    PROCESS_THREAD(mycounter_process, ev, data)
    {
        PROCESS_BEGIN();
    
        while(1)
        {
            etimer_set(&et, CLOCK_SECOND*2);
            PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));
    
            count = next_round(count);
            printf("Count Value : %d\n", count);
        }
    
        PROCESS_END();
    }
    // Makefile
    // CONTIKI 의 경로는 사용자 마다 다름
    
    CONTIKI_PROJECT = demo-counter
    all: $(CONTIKI_PROJECT)
    
    PROJECT_SOURCEFILES += mycounter.c
    
    CONTIKI = ../
    include $(CONTIKI)/Makefile.include

     

    생성된 native 파일을 실행한다

     

    60이 넘어가면 1로 초기화된다

     

     

     

     5. Contiki-NG 코딩 규칙 

    3명 이상의 개발자와 프로그램을 개발한다고 했을 때, 개발자 마다 프로그래밍 스타일과 방법이 있다

    코드가 하나로 합쳐지는 경우 작성 스타일이 일치하지 않으면 문제가 발생하지만 작성 스타일이 동일할 경우 이 문제는 해결된다

    Contiki 의 규칙은 아래에서 확인할 수 있다
    https://github.com/contiki-os/contiki/blob/master/doc/code-style.c

     

     

     

     6. Contiki-NG 애플리케이션 구축 

    virtual-sensor 라는 Contiki-NG 애플리케이션을 개발해 본다

    온도 및 습도 판독에 사용될 센서용 일반 라이브러리를 사용하고 read_temperature()라는 두 함수를 노출하는 헤더 파일에 가상 센서를 생성할 것이다

    가상 센서를 위한 간단한 라이브러리

     

    counter와 다른 위치에 폴더를 생성하고 마찬가지로 4개의 파일을 작성한다

     

    작성완료 후 컴파일한 뒤 실행해 준다

     

    실행결과 위 사진처럼 온도와 습도가 나오는 것을 확인할 수 있다

     

    counter와 다른 위치에 폴더를 생성하였으므로 CONTIKI의 경로도 변경되었다

     

    // mysensor.h
    
    #ifndef MYSENSOR_H
    #define MYSENSOR_H
    
    struct Sensor 
    {
        char name[15];
        float value;
    };
    
    struct Sensor read_temperature();
    struct Sensor read_humidity();
    
    #endif
    // mysensor.c
    
    #include "mysensor.h"
    #include <string.h>
    #include <stdlib.h>
    
    float random_value(float min, float max)
    {
        float scale = rand() / (float) RAND_MAX;
     return min + scale * (max - min);
    }
    
    struct Sensor read_temperature()
    {
        struct Sensor temp;
        strncpy(temp.name, "Temperature", 15);
        temp.value = random_value(0, 35);
        return temp;
    }
    
    struct Sensor read_humidity()
    {
        struct Sensor humdidty;
        strncpy(humdidty.name, "Humidity", 15);
        humdidty.value = random_value(40, 80);
        return humdidty;
    }
    // demo-sensor.c
    
    #include "contiki.h"
    #include "sys/etimer.h"
    #include "mysensor.h"
    #include <stdio.h>
    
    PROCESS(sensor_process, "Sensor process");
    AUTOSTART_PROCESSES(&sensor_process);
    static struct etimer timer;
    
    PROCESS_THREAD(sensor_process, ev, data)
    {
        PROCESS_BEGIN();
        printf("Demo Virtual Sensor\n");
    
        while(1) 
        {
        etimer_set(&timer, 3 * CLOCK_SECOND);
        PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&timer));
        struct Sensor temp = read_temperature();
        printf("%s: %.2f\n", temp.name, temp.value);
    
        struct Sensor hum = read_humidity();
        printf("%s: %.2f\n", hum.name, hum.value);
    
        printf("------------\n");
        }
    
        PROCESS_END();
    }
    // Makefile
    
    CONTIKI_PROJECT = demo-sensor
    all: $(CONTIKI_PROJECT)
    
    PROJECT_SOURCEFILES += mysensor.c
    
    CONTIKI = ../../
    include $(CONTIKI)/Makefile.include

     

    728x90

    '전공 - IT > 졸업작품' 카테고리의 다른 글

    Ubuntu(22.04) - Contiki 설치하기  (0) 2023.07.29
    Chapter 4  (0) 2023.07.24
    Chapter 3  (0) 2023.07.23
    Chapter 1  (0) 2023.07.16
    Ubuntu(22.04) - Contiki-NG 설치하기  (0) 2023.07.12
Designed by Tistory.