liminfo

Zephyr RTOS Reference

Zephyr RTOS 레퍼런스

26개 결과

Zephyr RTOS Reference 소개

Zephyr RTOS 레퍼런스는 리소스가 제한된 IoT 및 임베디드 디바이스를 위해 설계된 오픈소스 실시간 운영체제인 Zephyr 프로젝트에 대한 종합 가이드입니다. 정적 및 동적 스레드 관리를 위한 K_THREAD_DEFINE과 k_thread_create 같은 커널 프리미티브부터 스케줄링 제어를 위한 k_sleep, k_yield, 스레드 일시 중지/재개까지 Zephyr 개발에 필수적인 API와 패턴을 다룹니다. 각 항목에는 Zephyr SDK에 대해 컴파일되는 실전 코드 예제가 포함됩니다.

이 레퍼런스는 Zephyr의 광범위한 API를 여섯 가지 실용적인 카테고리로 분류합니다. 스레드(정적/동적 생성, 대기, 양보, 일시 중지/재개), 디바이스트리(하드웨어 추상화를 위한 DT_NODELABEL, DT_PROP, DT_CHOSEN, DT_ALIAS 매크로), 드라이버(주변장치 접근을 위한 gpio_pin_configure_dt, sensor_sample_fetch, uart_poll_out/in, i2c_write/read), 네트워킹(이더넷 L2, zsock_*를 통한 BSD 소켓, MQTT 클라이언트, CoAP 메시징), 빌드(west build/flash/debug, CMakeLists.txt 설정), 설정(prj.conf Kconfig 옵션, 보드 디바이스트리 오버레이, menuconfig GUI)입니다.

Nordic nRF52840, STM32, ESP32 또는 600개 이상의 지원 보드 중 어떤 것을 위해 개발하든 이 레퍼런스는 Zephyr 코드를 아키텍처 간에 이식 가능하게 만드는 디바이스트리 기반의 하드웨어 추상화 API 패턴을 제공합니다. 디바이스트리 시스템은 컴파일 타임에 하드웨어를 소프트웨어 바인딩에 매핑하고, Kconfig은 모듈식 기능 선택을 가능하게 하며, west 메타 도구는 빌드, 플래시, 디버깅을 처리합니다. 이러한 패턴은 하드웨어 세부 사항을 C 코드에 흩뿌리지 않고 선언적 설정으로 추상화하는 현대적 임베디드 개발 접근 방식을 나타냅니다.

주요 기능

  • 우선순위와 스택 설정을 포함한 정적 및 동적 스레드 생성을 위한 K_THREAD_DEFINE과 k_thread_create 예제
  • 컴파일 타임 하드웨어 추상화를 위한 디바이스트리 매크로(DT_NODELABEL, DT_PROP, DT_CHOSEN, DT_ALIAS)
  • gpio_dt_spec 구조체를 사용한 디바이스트리 기반 핀 설정, 설정, 토글을 위한 GPIO 드라이버 API
  • BME280, 시리얼 통신, 버스 작업을 위한 디바이스트리 바인딩이 포함된 센서, UART, I2C 드라이버 예제
  • MQTT 발행/구독과 CoAP RESTful 메시징을 위한 BSD 소켓 API(zsock_socket/connect)와 프로토콜 클라이언트
  • 펌웨어 빌드(west build -b board), 플래시(west flash), 디버깅(west debug)을 위한 west 메타 도구 명령어
  • find_package(Zephyr)와 target_sources를 사용한 애플리케이션 빌드를 위한 CMakeLists.txt 프로젝트 설정
  • 기능 설정을 위한 prj.conf 옵션, 디바이스트리 오버레이(.dts), 대화형 menuconfig가 포함된 Kconfig 시스템

자주 묻는 질문

K_THREAD_DEFINE과 k_thread_create의 차이점은 무엇인가요?

K_THREAD_DEFINE은 컴파일 타임에 정적으로 스레드를 생성하여 스택과 스레드 제어 블록을 바이너리에 할당합니다. 스레드 이름, 스택 크기, 진입점, 인자, 우선순위, 옵션, 시작 지연을 받습니다. k_thread_create는 사전 할당된 스택 메모리에서 런타임에 동적으로 스레드를 생성합니다. 정적 스레드는 항상 존재하는 고정 작업에 선호되고, 동적 스레드는 스레드 수가 변하거나 작동 중에 생성되고 소멸되는 경우에 사용됩니다.

Zephyr의 디바이스트리 시스템은 하드웨어 추상화를 위해 어떻게 동작하나요?

디바이스트리는 하드웨어 토폴로지를 설명하는 계층적 데이터 구조로, 빌드 타임에 .dts 파일에서 컴파일됩니다. DT_NODELABEL(led0) 같은 매크로는 라벨로 노드를 참조하고, DT_PROP은 보레이트 같은 속성을 읽으며, DT_CHOSEN은 Zephyr가 선택한 콘솔 디바이스에 접근하고, DT_ALIAS는 약칭을 제공합니다. DEVICE_DT_GET은 런타임 디바이스 핸들을 얻습니다. 이 시스템은 애플리케이션 코드를 특정 하드웨어에서 분리하여 디바이스트리 오버레이만 변경하면 동일한 C 코드가 다른 보드에서 실행됩니다.

디바이스트리 API를 사용하여 GPIO 핀을 어떻게 설정하나요?

먼저 디바이스트리에서 GPIO 스펙을 정의합니다: const struct gpio_dt_spec led = GPIO_DT_SPEC_GET(DT_ALIAS(led0), gpios). 그런 다음 핀 방향을 설정합니다: gpio_pin_configure_dt(&led, GPIO_OUTPUT_ACTIVE). gpio_pin_set_dt(&led, 1)로 HIGH를 설정하거나 gpio_pin_toggle_dt(&led)로 토글하여 핀을 제어합니다. 이 접근 방식은 디바이스트리에서 GPIO 컨트롤러, 핀 번호, active-low/high 극성을 자동으로 해석하여 코드를 하드웨어 독립적으로 만듭니다.

Zephyr는 IoT 애플리케이션에 어떤 네트워킹 프로토콜을 지원하나요?

Zephyr는 이더넷 L2, DHCP가 있는 IPv4/IPv6, BSD 호환 소켓(zsock_socket, zsock_connect, zsock_send/recv), 브로커에 대한 발행/구독 메시징을 위한 MQTT 클라이언트, 제약된 RESTful 통신을 위한 CoAP, 디바이스 관리를 위한 LwM2M, HTTP 클라이언트/서버, WebSocket, DNS 리졸버를 포함한 포괄적인 네트워킹 스택을 지원합니다. 무선으로는 BLE, IEEE 802.15.4, Thread 메시 네트워킹, Wi-Fi를 지원합니다. 스택은 모듈식이며 Kconfig 옵션을 통해 활성화됩니다.

Zephyr 개발에서 west 빌드 시스템은 어떻게 동작하나요?

West는 작업 공간, 빌드, 플래시, 디버그 워크플로를 관리하는 Zephyr의 메타 도구입니다. "west build -b nrf52840dk_nrf52840 samples/basic/blinky"는 대상 보드로 CMake를 설정하고 펌웨어를 빌드합니다. "west flash"는 감지된 디버그 프로브(J-Link, OpenOCD 등)를 사용하여 빌드된 이미지를 디바이스에 프로그래밍합니다. "west debug"는 대상에 연결된 GDB 세션을 시작합니다. West는 또한 모듈, HAL, 외부 라이브러리를 가져오기 위한 Zephyr의 매니페스트 기반 종속성 시스템을 관리합니다.

Kconfig란 무엇이며 Zephyr에서 prj.conf는 어떻게 동작하나요?

Kconfig은 Linux 커널에서 계승된 Zephyr의 기능 설정 시스템입니다. 애플리케이션 루트의 prj.conf 파일에서 CONFIG_* 옵션을 설정하여 커널 기능, 드라이버, 서브시스템을 활성화하거나 비활성화합니다. 예를 들어 CONFIG_GPIO=y는 GPIO 드라이버를 활성화하고, CONFIG_BT=y는 블루투스를 활성화하며, CONFIG_LOG_DEFAULT_LEVEL=3은 로깅 상세 수준을 설정합니다. 옵션에는 종속성이 있으며(CONFIG_BT_PERIPHERAL은 CONFIG_BT 필요), "west build -t menuconfig"로 설명이 포함된 모든 옵션을 탐색하는 대화형 GUI를 열 수 있습니다.

Zephyr에서 센서 API를 사용하여 센서 데이터를 어떻게 읽나요?

DEVICE_DT_GET_ONE(compatible_string)으로 디바이스 핸들을 얻습니다. 예를 들어 DEVICE_DT_GET_ONE(bosch_bme280)입니다. sensor_sample_fetch(dev)를 호출하여 하드웨어 읽기를 트리거한 다음 sensor_channel_get(dev, SENSOR_CHAN_AMBIENT_TEMP, &val)로 특정 채널을 검색합니다. sensor_value 구조체는 val1(정수 부분)과 val2(백만분의 일 단위 소수 부분)를 포함합니다. 이 통합 API는 다른 센서 칩에서도 동일하게 동작하며, 디바이스트리 바인딩이 컴파일 타임에 올바른 드라이버를 선택합니다.

커스텀 하드웨어를 위한 디바이스트리 오버레이를 어떻게 만드나요?

프로젝트 루트에 app.overlay 파일을 만들거나 보드별 변경을 위해 boards/board_name.overlay를 만듭니다. &를 사용한 노드 참조로 기존 노드를 수정합니다: &i2c0 { status = "okay"; bme280@76 { compatible = "bosch,bme280"; reg = <0x76>; }; };는 I2C 버스 0의 주소 0x76에 BME280 센서를 추가합니다. 오버레이는 빌드 타임에 기본 보드 .dts와 병합됩니다. 핀 할당, 버스 속도, 인터럽트 설정 같은 속성은 모두 오버레이에서 선언적으로 지정됩니다.