-
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.c6. 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