임베디드 시스템과 펌웨어

메인 처리에서 레지스터 비트를 'reg |= mask;'(읽기-수정-쓰기)로 조작하는 도중에 인터럽트 핸들러가 같은 레지스터의 다른 비트를 바꾸면 발생할 수 있는 문제와 대책의 조합으로 올바른 것은 무엇입니까?

  1. A인터럽트에서 한 변경이 메인 처리의 되쓰기로 사라진다. 조작하는 동안만 인터럽트를 금지하거나, 비트별 세트·클리어 전용 레지스터를 사용한다
  2. B레지스터가 망가져 다시는 사용할 수 없게 된다. 마이크로컨트롤러를 교체한다
  3. C아무 일도 일어나지 않는다. 대책은 필요 없다
정답과 해설 보기

정답: A. 인터럽트에서 한 변경이 메인 처리의 되쓰기로 사라진다. 조작하는 동안만 인터럽트를 금지하거나, 비트별 세트·클리어 전용 레지스터를 사용한다

'reg |= mask'는 레지스터를 읽고, OR를 취하고, 되쓰는 세 가지 동작입니다. 읽은 직후에 인터럽트가 들어와 핸들러가 다른 비트를 바꿔도, 메인 처리는 인터럽트 이전에 읽은 오래된 값을 바탕으로 되쓰기 때문에 핸들러의 변경이 사라집니다. 조작하는 동안만 인터럽트를 금지하거나, 1을 쓴 비트만 바뀌는 세트용·클리어용 레지스터를 사용하면 한 번의 쓰기로 끝나므로 이 문제는 발생하지 않습니다.

이 분야 연습하기 분야로 돌아가기

임베디드 시스템과 펌웨어의 다른 문제

  1. 마이크로컨트롤러의 입력 핀에 스위치만 연결하고 풀업이나 풀다운 저항을 달지 않았습니다. 스위치가 열려 있을 때 일어날 수 있는 일은 무엇입니까?
  2. 마이크로컨트롤러의 GPIO(범용 입출력) 핀을 사용할 때 가장 먼저 설정해야 하는 것으로 올바른 것은 무엇입니까?
  3. 기계식 스위치를 눌렀을 때 접점이 잘게 튀어 짧은 시간에 여러 번 온과 오프를 반복하는 현상을 무엇이라고 합니까?
  4. 소프트웨어로 스위치의 채터링을 제거하는 방법으로 가장 적절한 것은 무엇입니까?
  5. 16 MHz 클럭을 프리스케일러로 16분주한 것으로 타이머를 세고, 1000카운트마다 인터럽트가 발생하도록 설정했습니다. 인터럽트 간격은 얼마입니까?

이 분야의 비교