Introduction
Nol.A-SDK는 IoT용 embedded systems 개발을 위한 CLI 기반 개발환경입니다. 그리고 Nol.A-SDK Library는 다양한 하드웨어, 통신 프로토콜, 라이브러리 등을 지원하기 위한 C++ 라이브러리, Makefile, 링커 스크립트, 플래싱 스크립트 등의 모음입니다.
Installation
개발 도구 설치 및 프로젝트 생성, 빌드, 플래싱 등 개발 환경 구성에 대한 자세한 내용은 Nol.A-Tools를 참고해주세요.
Coding-Style
Nol.A-SDK에서는 C++를 기본 언어로 사용합니다. 물론 C 파일도 컴파일 및 링킹을 지원합니다. 저희가 지원하는 보드들은 다양하지만 모두 GCC를 사용합니다. 자세한 보드별 컴파일러 종류 및 버전 정보는 Supported Boards 를 참고해주세요. 문법 표준은 C++14 with GNU extensions (gnu++14), 및 C99를 지원합니다.
사용자 애플리케이션의 시작 지점은 Arduino 처럼 setup() 입니다. setup()에서는 각종 초기화를 수행합니다.
void setup() {
Serial.begin(115200);
Serial.printf("Hello World!\n");
}
Arduino와 달리 loop() 같은 함수는 지원하지 않습니다. 그 대신 postTask 와 Timer 를 지원합니다.
- postTask: 작업 함수 func 를 args 인자와 함께 시스템 작업 큐에 등록합니다. 등록된 작업은 현재 실행 중인 작업이 완료된 직후 시스템 스레드에 의해 실행됩니다. 인터럽트 핸들러 등에서 바로 실행하기 부담스러운 작업을 지연 실행할 때 사용합니다. 큐가 가득 차 있으면 등록에 실패하고 false 를 반환합니다.
- Timer: 일정 시간 후 1회(startOneShot) 또는 매 주기(startPeriodic)마다 작업 함수를 실행하기 위한 클래스입니다. onFired() 로 실행할 작업을 지정합니다.
static void taskHello(void *) {
Serial.printf("Hello World!\n");
}
void setup() {
Serial.begin(115200);
}
Timer는 일정 시간 이후에 1회 실행될 작업, 매 일정 시간마다 실행될 작업 등을 위한 기능입니다.
Definition Timer.hpp:61
bool startPeriodic(uint32_t millis, bool interrupt=false)
작업함수를 매 millis 밀리초 주기로 반복하여 실행합니다.
void onFired(void(*func)(void *), void *args=nullptr)
타이머 만료시 실행시킬 작업함수를 지정합니다.
bool postTask(void(*func)(void *), void *args)
작업을 나중에 실행되도록 게시합니다.
Keywords
- NOLA_VER_MAJOR: Library version (major number)
- NOLA_VER_MINOR: Library version (minor number)
- NOLA_VER_PATCH: Library version (patch number)
Project Options
Nol.A-SDK에서 프로젝트 별로 생성되는 Nol.A-project.json 파일에 다음과 같은 옵션을 추가하면 추가적인 기능을 사용할 수 있습니다.
일부 option 들은 보드별로 지원 가능 여부가 다릅니다. 자세한 정보는 보드별 정보를 참고해주세요.
Heap and Stack Size
- NOLA_HEAP_SIZE: Heap 크기를 지정(단위: byte)
- NOLA_STACK_SIZE: Stack 크기를 지정(단위: byte)
위 옵션들은 생략시 보드별 기본 heap 및 stack 크기를 사용합니다. 자세한 정보는 보드별 정보를 참고해주세요.
Debugging Messages
- NOLA_DEBUG_AT86RF233: 1이면 AT86RF233Chip 드라이버의 디버깅 메시지를 출력
- NOLA_DEBUG_CC1200: 1이면 CC1200Chip 드라이버의 디버깅 메시지를 출력
- NOLA_DEBUG_DW1000: 1이면 DW1000Chip 드라이버의 디버깅 메시지를 출력
- NOLA_DEBUG_6LORAWAN: 1이면 IPv6LoRaWAN 프로토콜의 디버깅 메시지를 출력
- NOLA_DEBUG_SX126X: 1이면 SX126xChip 드라이버의 디버깅 메시지를 출력
- NOLA_DEBUG_SX127X: 1이면 SX127xChip 드라이버의 디버깅 메시지를 출력
- NOLA_DEBUG_SX1301: 1이면 SX1301Chip 드라이버의 디버깅 메시지를 출력
- NOLA_DEBUG_HTTP: 1이면 HTTP 프로토콜의 디버깅 메시지를 출력
- NOLA_DEBUG_IPV6: 1이면 IPv6 프로토콜의 디버깅 메시지를 출력
- NOLA_DEBUG_IEEE802_15_4FRAME: 1이면 IEEE802.15.4 프로토콜의 디버깅 메시지를 출력
- NOLA_DEBUG_LORAWAN: 1이면 LoRaWAN 프로토콜의 디버깅 메시지를 출력
- NOLA_DEBUG_LPPMAC: 1이면 LPPMac 프로토콜의 디버깅 메시지를 출력
- NOLA_DEBUG_DSTWRANGING: 1이면 DSTWRanging 프로토콜의 디버깅 메시지를 출력
- NOLA_DEBUG_TSCHMAC: 1이면 TSCHMac 프로토콜의 디버깅 메시지를 출력
예를 들어, SX127xChip 드라이버와 LoRaWAN 프로토콜의 디버깅 메시지를 출력하기 위해서는 다음과 같이 옵션을 지정하면 됩니다.
{
"options": "NOLA_DEBUG_LORAWAN=1 NOLA_DEBUG_SX127X=1",
}
The '.noinit' Section
프로젝트에서 초기화되지 않는 변수를 사용하고 싶으면 다음과 같이 변수명에 attribute를 지정할 수 있습니다.
int foo __attribute__ ((section(".noinit")));
.noinit section에 너무 많은 변수를 지정하면 힙 또는 스택 영역이 줄어들어 애플리케이션이 정상 동작하지 않을 수 있습니다. 보드별 크기 제한 등 자세한 정보는 보드별 정보를 참고해주세요.