임베디드 시스템과 펌웨어
8비트 마이크로컨트롤러에서 타이머 인터럽트가 32비트 변수 ticks를 1씩 증가시키고, 메인 처리가 ticks를 읽어 경과 시간을 구하고 있습니다. 드물게 크게 어긋난 값이 읽히는 원인으로 올바른 것은 무엇입니까?
- A8비트 마이크로컨트롤러에서는 32비트 변수를 사용할 수 없기 때문에
- B타이머 인터럽트의 주기가 매번 무작위로 바뀌기 때문에
- C32비트 읽기가 4번으로 나뉘어 그 도중에 인터럽트가 들어와 일부 바이트만 새로운 값이 되는 경우가 있기 때문에
정답과 해설 보기
정답: C. 32비트 읽기가 4번으로 나뉘어 그 도중에 인터럽트가 들어와 일부 바이트만 새로운 값이 되는 경우가 있기 때문에
8비트 마이크로컨트롤러는 한 번에 1바이트밖에 읽지 못하므로 32비트 값은 4번에 나누어 읽습니다. 예를 들어 0x000000FF에서 0x00000100으로 바뀌는 순간에 하위 바이트를 읽은 뒤 인터럽트가 들어오면, 오래된 하위 바이트(0xFF)와 새로운 상위 바이트(0x01)가 조합되어 0x000001FF와 같은 값이 됩니다. 읽는 동안만 인터럽트를 금지하거나, 두 번 읽어 같은 값이 될 때까지 다시 읽는 방법으로 막습니다.