Fixing the Zephyr Flash Simulator Erase Capability Bug

Today I fixed a bug in the Zephyr RTOS Flash Simulator (#100352 and #100400). The Bug The simulated flash driver incorrectly applied the no_explicit_erase capability. It was overriding the Kconfig settings with a missing Devicetree property since it used a global fallback but couldn’t accommodate boolean properties naturally. This caused even RAM-like configurations (which do not require erasing before writing) to wrongly report needing explicit erases. The Fix To resolve this issue, I submitted PR #105035 with the following targeted fixes: ...

Zephyr Flash Simulator Erase Capability Fix Plan

Flash Simulator Erase Capability Fix Plan Issues: #100352 · #100400 1. Root Cause Background The Flash Simulator driver supports two operating modes: Erase-before-write (classic Flash): set by CONFIG_FLASH_SIMULATOR_EXPLICIT_ERASE=y (default) RAM-like (no explicit erase required): set by CONFIG_FLASH_SIMULATOR_EXPLICIT_ERASE=n The Flash API uses flash_get_parameters()→caps.no_explicit_erase (a runtime boolean field) to allow code to query at runtime whether a device requires erase prior to write. The Bug File: drivers/flash/flash_simulator.c, line 556 (inside the FLASH_SIMULATOR_INIT(n) macro): // BUGGY – uses global Kconfig constant for ALL instances static const struct flash_parameters flash_parameters_##n = { .write_block_size = FLASH_SIMULATOR_PROG_UNIT(n), .erase_value = FLASH_SIMULATOR_ERASE_VALUE(n), .caps = { .no_explicit_erase = !IS_ENABLED(CONFIG_FLASH_SIMULATOR_EXPLICIT_ERASE), // ← BUG }, }; IS_ENABLED(CONFIG_FLASH_SIMULATOR_EXPLICIT_ERASE) is a compile-time global Kconfig option that applies uniformly to all instances. It does not look at per-device Devicetree properties. ...

Zephyr RTOS: ZMS free space 테스트 코드 리뷰 및 개선

PR #104644 리뷰 과정에서 발견한 코드 품질 문제들과 수정 내용. 1. sizeof(struct zms_ate) → fixture->fs.ate_size 문제: Flash의 write_block_size에 따라 ZMS는 ATE를 ROUND_UP(sizeof(struct zms_ate), write_block_size) 크기로 배치한다. 테스트가 컴파일 타임 sizeof를 직접 사용하면 write_block_size > sizeof(struct zms_ate) 인 환경에서 free space 계산이 어긋난다. /* before */ const size_t max_space_in_sector = fixture->fs.sector_size - sizeof(struct zms_ate) * 5; /* after */ ate_size = fixture->fs.ate_size; /* runtime: ROUND_UP(sizeof(zms_ate), wbs) */ max_space_in_sector = fixture->fs.sector_size - ate_size * ZMS_MIN_ATE_NUM; 2. Magic number 5 → ZMS_MIN_ATE_NUM 문제: 섹터에 예약되는 ATE 슬롯 수가 5로 하드코딩되어 있었음. zms_priv.h에 이미 ZMS_MIN_ATE_NUM = 5 (close / empty / gc_done / delete / data)가 정의되어 있음. ...

Zephyr RTOS: pre-commit 훅 기반 자동 검사 셋업

개요 Zephyr 프로젝트 기여 및 작업 시 커밋 메시지 규칙(subsystem: 50자 이내 요약)과 코드 포맷 검증 자동화를 위해 pre-commit 도구를 설정하는 방법 정리. 저장소의 .pre-commit-config.yaml 룰을 적용하여 커밋 전 규정 위반을 자동 차단할 수 있음. 설치 시스템에 pre-commit 패키지 설치: # macOS (Homebrew) brew install pre-commit # Python 환경 pip3 install pre-commit Zephyr 저장소 설정 로컬 Zephyr 경로(~/ws/zephyr)에서 Git Hook 적용: cd ~/ws/zephyr # 기본 훅 (코드 포맷, 스타일 체크) 설치 pre-commit install # 커밋 메시지 규정 검사 훅 설치 pre-commit install --hook-type commit-msg 명령어 실행 후 .git/hooks/ 경로에 훅 스크립트가 생성됨. ...

Zephyr RTOS: cbvprintf_package %.*s 포맷 사용 시 OOB 읽기 버그 분석

문제 요약 cbvprintf_package()에서 %.*s 포맷 사용 시 precision specifier를 무시하고 strlen()을 호출. null-terminated가 아닌 문자열에서 힙 버퍼 오버플로(out-of-bounds read) 발생. 원본 이슈: zephyrproject-rtos/zephyr#93999 원인 분석 lib/os/cbprintf_packaged.c의 포맷 문자열 파싱에서 '.'과 '*'를 별도로 처리하지만, '*'로 소비한 precision 정수 값을 저장하지 않음. 이후 's' 처리 시 precision 정보 없이 strlen(s)를 호출하여 할당된 버퍼를 넘어서 읽음. 영향받는 코드: Sizing pass (L676): len += strlen(s) + 1 + 1; Copy pass (L792): size = strlen(s) + 1; 재현 macOS + Apple Clang + AddressSanitizer로 핵심 동작을 독립 재현: ...

Zephyr RTOS: ZMS free space 테스트 assertion 실패 수정

문제 요약 ZMS(Zephyr Memory Storage)의 test_zms_free_space 테스트가 write_block_size > 1인 환경(섹터 크기 4KB 이상)에서 assertion 실패. 테스트가 sizeof(struct zms_ate)를 하드코딩하여 free space를 계산하지만, ZMS 내부는 write_block_size의 배수로 올림한 ate_size를 사용하기 때문에 값이 불일치. 원본 이슈: zephyrproject-rtos/zephyr#101880 원인 분석 zms_mount() 시 ATE 크기는 zms_al_size(fs, sizeof(struct zms_ate))로 결정되어 write_block_size의 배수로 올림됨. 테스트 코드는 이를 무시하고 컴파일 타임 sizeof(struct zms_ate)를 사용하여: free space 산술 계산이 실제 ZMS 동작과 불일치 zassert_equal(ZMS_DATA_IN_ATE_SIZE, ...) — 정렬 패딩으로 인해 정확히 8바이트로 떨어지지 않음 VLA 버퍼가 큰 섹터 크기에서 스택 오버플로 유발 ZMS 구현 자체는 정상. 테스트 로직 버그. ...

Zephyr RTOS: README 누락 샘플 문서화 기여

문제 요약 Zephyr RTOS의 samples/ 디렉토리 내 다수의 샘플이 README 문서 없이 배포되고 있는 문제. 사용자가 샘플의 목적, 요구사항, 빌드 방법을 파악하기 어려움. 원본 이슈: zephyrproject-rtos/zephyr#27805 작업 내용 5개 샘플에 대해 소스 코드(main.c), 설정(prj.conf, sample.yaml), 보드 overlay를 분석하여 Zephyr 표준 포맷(:orphan:, zephyr-app-commands directive)에 맞춘 README.rst를 작성함. 샘플 내용 espressif/ethernet ESP32 Ethernet Kit DHCP/DNS/NET_SHELL mec172xevb/qmspi_ldma QMSPI SPI 플래시 읽기/쓰기/검증 (Dual/Quad) mec172xevb/rom_api ROM API 기반 SHA-224/256/384/512 해시 검증 nordic/nrf_sys_event nRF 상수 지연 모드 및 RRAMC 웨이크업 ipm_mcux/remote NXP LPC 메일박스 IPM 리모트 코어 에코 활동 로그 2026-02-24: 5개 샘플 README.rst 작성 및 PR #104439 제출. 2026-02-24: 메인테이너 @kartben 리뷰 피드백 수신: 표준 템플릿(doc/templates/sample.tmpl) 미준수 → 형식 재작성 필요. 5개 샘플을 개별 PR로 분리 제출할 것 (각 플랫폼 메인테이너 리뷰 필요). 보드 문서 링크 추가 필요. 2026-02-25: 피드백 반영하여 samples/subsys/pm/device_pm README.rst를 표준 템플릿 기반으로 재작성, qemu_x86에서 빌드/실행 검증 후 PR #104503 제출. 빌드 시 발생하는 Sphinx 경고(Doxygen group name 등) 수정 커밋 추가. 2026-02-26: 리뷰어 @JordanYates 리뷰 피드백 반영: 샘플 코드 내의 잘못된 API 사용(pm_device_runtime_enable 대신 pm_device_driver_init 사용)을 수정하여 불필요한 초기 suspend 로그 출력 제거. 수정된 샘플 코드 동작 결과를 반영하여 README.rst의 Expected Output 항목 업데이트. 2026-02-27: 추가 리뷰 피드백 반영 및 CI 실패 수정: prj.conf에 CONFIG_PM_DEVICE_RUNTIME_DEFAULT_ENABLE=y 추가 — 이 설정 없이는 런타임 PM이 실제로 활성화되지 않는 문제 해결. CI twister 테스트 실패 원인 분석: sample.yaml harness regex가 이전 출력 패턴(pre-main suspending 메시지)을 기대하여 120초 타임아웃 발생. sample.yaml harness regex 패턴을 새 출력에 맞게 수정하여 CI 테스트 통과 가능하도록 반영. 2026-02-28: PR CI Compliance 검사 실패(커밋 메시지 너비 75자 초과) 확인 및 커밋 메시지를 72자로 줄바꿈(wrap)하여 강제 푸시 완료. 2026-03-02: 메인테이너 @kartben의 추가 피드백을 반영하여 수정 커밋 푸시. SonarCloud Quality Gate 검사 통과 확인. 2026-03-04: PR got merged. Done.

Zephyr RTOS: CODE_UNREACHABLE 매크로의 Coverity Dead Code 오탐 분석

문제 요약 Zephyr RTOS의 CODE_UNREACHABLE 매크로(__builtin_unreachable())가 Coverity 정적 분석에서 dead code로 오탐되는 문제. 매크로가 ~170곳에서 사용되어 개별 수정은 비현실적이며, 매크로 내부에 주석(/* coverity[deadcode] */)을 삽입하는 제안도 C 전처리기(Phase 3)에서 주석이 소실되어 작동하지 않음을 확인. 원본 이슈: zephyrproject-rtos/zephyr#99981 분석 결과 Coverity 유저 모델을 통해 __builtin_unreachable()를 kill path(__coverity_panic__())로 정의하면, 소스 코드 수정 없이 전역적으로 오탐을 제거할 수 있음. 활동 로그 2026-02-24: 분석 결과를 기반으로 Coverity 유저 모델 제안 코멘트 작성.

Zephyr Environment Setup & QEMU Walkthrough

In this post, we will explore how to set up the Zephyr RTOS development environment on a Mac (Apple Silicon, M1/M2/M3/M4), and how to build and test applications using the QEMU emulator without actual board hardware. 0. Preliminary Work (Changes Made) For a smooth walkthrough, the following environment configuration has been completed prior to writing this guide. System Dependencies: Installed cmake, ninja, qemu, ccache and other required homebrew packages. Python Environment: Created a virtual environment (~/ws/zephyr-venv), upgraded pip, and installed west. Zephyr Workspace: Initialized the west workspace and pulled all external dependencies (west update). Installed required Python scripts. Zephyr SDK: Downloaded and installed the zephyr-sdk-0.16.8 with the x86_64-zephyr-elf toolchain for macOS ARM64. 1. Activating Zephyr Virtual Environment To use Zephyr’s build system, west, and various tools properly, you first need to activate the Python virtual environment. Load the previously created virtual environment (~/ws/zephyr-venv) and navigate to the working directory. ...