임베디드 시스템과 펌웨어
메인 처리에서 레지스터 비트를 'reg |= mask;'(읽기-수정-쓰기)로 조작하는 도중에 인터럽트 핸들러가 같은 레지스터의 다른 비트를 바꾸면 발생할 수 있는 문제와 대책의 조합으로 올바른 것은 무엇입니까?
- A인터럽트에서 한 변경이 메인 처리의 되쓰기로 사라진다. 조작하는 동안만 인터럽트를 금지하거나, 비트별 세트·클리어 전용 레지스터를 사용한다
- B레지스터가 망가져 다시는 사용할 수 없게 된다. 마이크로컨트롤러를 교체한다
- C아무 일도 일어나지 않는다. 대책은 필요 없다
정답과 해설 보기
정답: A. 인터럽트에서 한 변경이 메인 처리의 되쓰기로 사라진다. 조작하는 동안만 인터럽트를 금지하거나, 비트별 세트·클리어 전용 레지스터를 사용한다
'reg |= mask'는 레지스터를 읽고, OR를 취하고, 되쓰는 세 가지 동작입니다. 읽은 직후에 인터럽트가 들어와 핸들러가 다른 비트를 바꿔도, 메인 처리는 인터럽트 이전에 읽은 오래된 값을 바탕으로 되쓰기 때문에 핸들러의 변경이 사라집니다. 조작하는 동안만 인터럽트를 금지하거나, 1을 쓴 비트만 바뀌는 세트용·클리어용 레지스터를 사용하면 한 번의 쓰기로 끝나므로 이 문제는 발생하지 않습니다.