인프런 커뮤니티 질문&답변
난방실만들기.4 진행 중, m_state 값 초기화가 안됩니다..
작성
·
23
0
안녕하세요 온도 센서 값에 따라 릴레이를 붙이고 띄고 하는 동작을 하려는 데요,
main.c 파일에서 첫 동작 시 m_state가 0으로 할당하니 elseif문을 타야 될 거 같은데 안 탔어서 m_state 값을 라이브로 찍어보니 127 '\177'의 값으로 처음 할당 되는 걸 확인 했습니다.
이 값의 문제가 맞나 해서 "getHeaterState() == t_OFF" 소스 값을 "getHeaterState() != t_ON" 으로 바꾸니 정상 작동 했었습니다..
heaterController.c 에서 m_state 는 확실히 0으로 할당 해주었고, heaterController.h 에서 enum 타입도 선언 해주었는데도, 초기 값이 127로 주어지는 이유를 알 수 있을까요..??
퀴즈
이 프로젝트에서 릴레이 모듈의 주요 역할은 무엇일까요?
온도 센서 데이터를 읽는 것
마이크로컨트롤러에 전원을 공급하는 것
저전압 제어 신호로 고전압 AC 장치를 켜고 끄는 것
GPIO 핀의 입출력 방향을 설정하는 것
답변 2
1
코드를 한번 직접 봐야 정확하게 판단할 수 있을 것 같습니다.
다만 경험상 몇 가지 방향은 추려볼 수 있습니다.
만약 매번 동일하게 127로 나온다면, 단순히 초기화가 안 된 랜덤 값이라기보다는
어딘가에서 해당 값이 반복적으로 설정되고 있는 명확한 원인이 있을 가능성이 큽니다.
(예: 잘못된 메모리 접근, 다른 변수 참조, 초기화 순서 문제 등)
반대로, 초기값이 실행할 때마다 다르게 나온다면
0으로 초기화한 코드가 실제로 적용되지 않는 범위에 있거나,
즉 초기화 자체가 제대로 이루어지지 않았을 가능성을 의심해볼 수 있습니다.
그래서 이 경우는 단순 자료형 문제보다는
변수의 실제 선언 위치, 접근 방식, 초기화 시점을 먼저 확인해보는 것이 좋겠습니다.
0
안녕하세요, 인프런 AI 인턴입니다. 장한별님!
언급하신 문제는 초기화 과정에서 변수 m_state가 예상치 않은 값으로 설정되는 것으로 보입니다. 이와 같은 경우, 몇 가지 가능한 원인을 점검해 보시는 것을 권장드립니다.
전역 변수 초기화 문제:
main.c내에 글로벌 변수로 선언된 경우에 초기화를 하지 않는다면 기본적으로 0이 아닌 임의의 값으로 시작할 수 있습니다. 함수 내부에서 초기화를 보장하는지 확인해 보세요.
메모리 상의 초기값:
- 만약 변수가 로컬 변수라면 초기화되지 않은 채로 다른 객체의 잔존 값이 들어갈 수도 있습니다.
- 만약 변수가 로컬 변수라면 초기화되지 않은 채로 다른 객체의 잔존 값이 들어갈 수도 있습니다.
컴파일러 설정:
- 일부 컴파일러 및 최적화 설정에 따라 초기화가 제대로 되지 않는 경우도 있습니다. 컴파일러 옵션을 검토하고, 최적화 설정을 조정해 보세요.
- 일부 컴파일러 및 최적화 설정에 따라 초기화가 제대로 되지 않는 경우도 있습니다. 컴파일러 옵션을 검토하고, 최적화 설정을 조정해 보세요.
변경 전후의 코드 비교:
- 기존 코드 구조와 변화를 주기 전후의 코드를 비교하여 흐름의 차이가 있는지 점검합니다. 변경 후 작동한 원인을 탐구함으로써 초기 문제의 근본 원인을 발견할 수 있습니다.
- 기존 코드 구조와 변화를 주기 전후의 코드를 비교하여 흐름의 차이가 있는지 점검합니다. 변경 후 작동한 원인을 탐구함으로써 초기 문제의 근본 원인을 발견할 수 있습니다.
다음의 게시물을 통해 유사 문제에 대한 추가적인 해결책을 확인해 보시기 바랍니다:
- 변수 초기화 및 메모리 할당의 이해
- 임베디드 개발에서의 전역 변수와 초기화 문제
이 정보를 바탕으로 m_state 초기화 문제를 해결해보세요. 다른 궁금한 점이 있으시면 이어서 질문해 주시면, 곧 지식공유자께서도 답변을 드릴 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.






정확히는 매번 127 값이 들어오고, 처음 main.c while 문 들어오기 전에는 0값으로 들어옵니다. 그런데 Ds18b20_ManualConvert 함수 브레이크 걸린 후에 127이 할당 되는 것 같습니다.
그래서 지금은 개인 소스 초기화 영역에 "heaterControll(t_OFF)" 를 넣어서 초기화 한 후 원래 강의대로의 소스를 넣어서 쓰면 정상 작동하긴 합니다..