GCC 기반툴( SW4STM32 등) 에서 컴파일러 셋팅에 있는 Optimization 설정(아래그림)에 따라 프로그램 작동결과가 심각하게 다른 결과가 나오는 경우 있다. 특히 float 형 변수 사용하는 경우 옵션에 따라 황당한 결과를 주는 경우가 많음.
위 그림은 SW4STM32 화면에서 optimization 부분인데, 프로젝트 생성초기 기본 값은 -Og 가 선택된 상태이다.
옵션 -O1, -O3 -Og 상태로 "float 형변수의 메모리 1바이트 단위로 접근하는 처리" 실행시켜보면, 엉뚱한 결과를 준다.
오류없이 정상적으로 실행되는 옵션 : 상기 Optimization 옵션을 적용하지 않는 None, 혹은 -Os, -O1 을 선택하면 정상 작동한다.
컴파일 옵션에 따른 오류의 실예.
옵션 : None, -Os, -O2 인 경우 아래 파형은 float 변수 사용중인 시계열 데이터가 정상적으로 처리된 경우의 데잍터 챠팅 모습,
옵션 : -O1, -O3 -Og 인 경우. 아래 처럼 엉망의 결과를 보임. 개 쓰레기.... 이렇게 엉망으로 만드는걸 옵션에 넣어둔 발상이 뭐임?
결론.
GCC 기반 개발시 컴파일 optimization 옵션 필수 확인하고,
특히 실수 사용되는 수치처리 등에서는 특히 위험성 심각하다. 의심스럽다면 None 선택할것.
참고.
KEIL 이나 Visual C++ 등의 컴파일러에서는 위와 같은 이상한 특성 본적없음.
연관
첫등록 : 2019년 2월 20일
최종수정 : 2020년 1월13일
단축주소 : https://igotit.tistory.com/2084
'임베디드.일렉트로닉스 > STM32' 카테고리의 다른 글
STM32. GPIO IDR 레지스터 값 읽기 주의사항 (0) | 2020.01.19 |
---|---|
STM32. 버그 해결. SPI 통신. 첫 SPI 송수신 데이터 비트 밀림 . 해결방법. (0) | 2020.01.19 |
STM32. 힙 , 스택 사이즈 설정 . KEIL. SW4STM32. CubeMX (0) | 2019.12.29 |
STM32. EXTI (Extented Interrupts and events controller) (0) | 2019.12.22 |
STM32. System tick timer 인터럽트 사용방법. (0) | 2019.12.15 |
댓글