반응형

EmbeddedC 11

[임베디드 C] 49.7일의 저주, 시스템 틱 카운터 오버플로우(Rollover) 버그 방지 코드

내용 요약현상: 시스템 구동 약 49.7일 후, 틱 카운터 초기화로 인해 주기적 태스크가 무한 대기 상태(Lockup)에 빠짐.원인: 32비트 무부호 정수(uint32_t)의 오버플로우(0으로 리셋) 발생 시, 잘못된 대소 비교 조건문으로 인해 시간 계산 오류가 발생함.해결: 미래의 절대 시간 대신 현재 시간 - 이전 시간 $\ge$ 지연 시간 형태의 무부호 정수 차이 연산으로 조건문을 변경함.시스템 틱 카운터 오버플로우(System Tick Timer Rollover) 발생 증상임베디드 시스템 설계 시 장기 신뢰성 테스트(Long-term Reliability Test) 단계나 실제 양산 필드(Field)에서 약 49.7일이 경과하는 시점에 하드웨어가 비정상적으로 락업(Lockup)되거나 통신이 두절되..

[통신 데이터] 내비게이션/센서 연동 시 빅엔디안 vs 리틀엔디안 바이트 스와핑(C언어) (가장 추천)

내용 요약현상: 외부 수신 데이터 값이 예상 범위를 벗어나 표현됨(ex: 0x12345678 -> 0x78563412).원인: 프로토콜 규격 빅엔디안(Big-Endian), 리틀엔디안(Little-Endian) 사이의 바이트 정렬 불일치.해결: 수신 버퍼 바이트의 배열 순서를 역순으로 재배치 Byte Swapping 적용.엔디안 불일치(Endianness Mismatch) 데이터 오염 및 값 왜곡 증상외부 센서 모듈이나 GPS/내비게이션 장비와 RS-232, RS-422, SPI 등의 하드웨어 인터페이스를 통해 패킷 통신을 수행할 때, 전송된 바이너리 원시 데이터(Raw Data)가 정상적인 스케일링 범위(Scaling Range)를 벗어나는 현상이 발생합니다.예를 들어, 센서가 송신한 정상적인 부동소수..

[GPIO 설정] 플로팅(Floating) 노이즈로 인한 핀 오동작과 내부 풀업/풀다운 저항 제어

Quick SummarySymptom:물리적인 입력이 없음에도 GPIO 입력 핀이 무작위로 High/Low 상태로 읽혀, 의도치 않은 소프트웨어 로직이나 고스트 인터럽트(Ghost Interrupt)를 유발함 (플로팅 상태).Cause:고임피던스 상태(High-Z)로 설정되면 핀이 안정적인 기준 전압으로부터 벗어나, 주변의 전자기 간섭(EMI)으로 인해 논리 레벨이 변하게 됨.Solution: 주변장치 구성 레지스터(GPIOx_PUPDR)를 통해 내부 풀업(Pull-up) 또는 풀다운(Pull-down) 저항을 활성화하여, 기준 전압을 $V_{CC}$ 또는 $GND$에 확실하게 묶어줌(Binding).외부 입력 핀 플로팅(Floating State) 오동작 및 무작위 인터럽트 트리거 현상임베디드 시스템 ..

[GPIO 디바운싱] 버튼 채터링(Contact Bounce)으로 인한 외부 인터럽트(EXTI) 중복 실행 소프트웨어 방어적 설계법

[Quick Summary (TL;DR) - For Global Developers]Symptom: 하드웨어 버튼을 한 번만 눌렀지만 인터럽트(EXTI)가 여러번 호출되어 시스템의 오작동 또는 카운터 중복 발생.Cause: 기계적 접점의 탄성으로 인해 수 밀리초(ms) 동안 신호가 진동하는 기계적 채터링(Contact Bounce) 현상이 마이크로컨트롤러(MCU)의 엣지 트리거 인터럽트 회로에 인가됨.Solution: 인터럽트 서비스 루틴(ISR) 진입 시 타이머 클럭 시스템 카운터(HAL_GetTick 등)를 활용하여 이전 트리거 시점과의 시간 차(정량적 임계값, 예: 50ms)를 확인하고, 임계값 이하인 경우 예외로 간주하여 연산을 차단하는 필터링 소프트웨어 기법 구현.하드웨어 버튼 채터링(Conta..

[임베디드 C] 인터럽트(ISR)와 메인 루프 간 전역 변수 오염 해결 (Critical Section 설정)

[Quick Summary - For Global Developers]Symptom: 메인 루프(Main Loop) 내에서 전역 변수를 기반으로 제어되는 조건문이 간헐적으로 오동작하거나, 센서 데이터 혹은 카운터 변수의 값이 예측 불가능하게 깨지는 데이터 오염 현상이 발생함.Cause: 공유 전역 변수(Shared Global Variable)를 수정하는 연산이 원자성(Atomicity)을 보장받지 못해, 비동기적으로 발생한 인터럽트 서비스 루틴(ISR)이 연산 중간에 개입하여 컨텍스트(Context)를 침범함.Solution: 비동기 인터럽트 진입을 일시적으로 차단하는 크리티컬 섹션(Critical Section)을 설정하여 인터럽트 비활성화 레지스터(PRIMASK)를 제어하고 연산의 원자성을 강제 확..

[임베디드 빌드] 링커 스크립트(.ld) 메모리 초과 에러(Flash/RAM Overflow) 해결 가이드

[Quick Summary - For Global Developers]Symptom: 펌웨어 빌드(Build) 단계에서 GNU 툴체인이 컴파일을 중단하고 region FLASH' overflowed by X bytes 또는 region RAM' overflowed 형태의 치명적인 링커 에러(Linker Error)를 발생시킴.Cause: 임베디드 소스 코드 내 전역 변수 크기, 상수 데이터(RO data) 및 컴파일된 바이너리 코드(.text)의 총용량이 링커 스크립트(.ld)에 정의된 물리 메모리 경계 레지스터 영역(Memory Region) 크기를 초과함.Solution: .ld 파일의 MEMORY 섹션 내 LENGTH 매개변수를 데이터시트에 맞게 교차 검증하거나, 큰 배열을 Flash 영역으로 이동..

[MCU 통신] 구조체 패딩(Struct Padding) 바이트 밀림 현상과 attribute((packed)) 사용법

[Quick Summary - For Global Developers]Symptom: MCU 간 UART/SPI 통신 또는 통신 모듈 데이터 파싱 시, 데이터 필드가 특정 바이트만큼 뒤로 밀려 수신되거나 Alignment Fault로 인해 시스템이 다운됨.Cause: 컴파일러가 32비트 MCU 메모리 접근 효율을 위해 구조체 부전공 데이터 멤버 사이에 무지성으로 구조체 패딩(Struct Padding) 바이트를 자동 삽입하여 물리적 크기가 변경됨.Solution: 구조체 선언부에 attribute((packed)) 속성을 명시하여 컴파일러의 최적화 정렬을 강제로 억제하고 데이터 스트림 바이트를 1:1로 정렬함.구조체 패딩(Struct Padding) 데이터 정렬 불일치로 인한 통신 패킷 바이트 밀림 현상..

[임베디드 C] volatile 키워드 누락으로 인한 컴파일러 최적화 오류 및 무한 루프 해결

[Quick Summary - For Global Developers] Symptom: 인터럽트 서비스 루틴(ISR) 또는 하드웨어 레지스터 상태 변경 시, 메인 루프(Main Loop)의 조건문이 갱신되지 않고 시스템이 무한 루프(Infinite Loop) 또는 행(Hang) 상태에 빠짐. Cause: volatile 키워드 누락으로 인해 컴파일러 최적화(Compiler Optimization, -O2/-O3) 과정에서 하드웨어 레지스터 및 전역 변수의 RAM 재참조 로직이 제거되고 CPU 레지스터(Register) 값만 반복 조회하도록 잘못 최적화됨. Solution: 메모리 매핑 I/O(MMIO) 레지스터 주소 포인터 및 인터럽트 공유 전역 변수 선언문에 volatile 한정자를 명시하여 컴..

[C언어 임베디드] 버퍼 오버플로우(Buffer Overflow) 에러 예방과 안전한 메모리 복사

[Quick Summary - For Global Developers]Symptom: Unexpected modification of adjacent variables, sudden system resets, or immediate jumps to HardFault_Handler during data parsing.Cause: Writing data beyond the allocated array boundary, which overwrites the Stack Frame (return address) or adjacent global variables in RAM.Solution: Implement strict input validation (Bounds Checking) before any memor..

[MCU 디버깅] Wild Pointer 및 Dangling Pointer로 인한 시스템 다운 방지 대책

[Quick Summary - For Global Developers]Symptom: Random system resets, infinite loops in HardFault_Handler, unexpected peripheral behaviors, or silent data corruption that alters operation based on Compiler Optimization levels.Cause: Dereferencing uninitialized pointer variables (Wild Pointer) or accessing memory addresses that have already been deallocated from the heap or stack frame (Dangling ..

반응형