임베디드 시스템과 펌웨어

위의 코드는 레지스터 reg의 여러 비트로 이루어진 설정 필드를 바꿔 쓰고 있습니다. 무엇을 하고 있습니까?

reg = (reg & ~(0x7 << 4)) | (5 << 4);
  1. A비트 5만 1로 만든다
  2. B비트 4~6의 3비트 필드를 0으로 만든 뒤 그곳에 5(2진수 101)를 넣는다
  3. Creg의 값을 5배로 한 뒤 4비트 왼쪽으로 시프트한다
정답과 해설 보기

정답: B. 비트 4~6의 3비트 필드를 0으로 만든 뒤 그곳에 5(2진수 101)를 넣는다

0x7은 2진수로 111이므로 '0x7 << 4'는 비트 4~6이 1인 마스크입니다. 그 부정과 AND를 취해 필드를 0으로 만들고, '5 << 4'(비트 4~6에 101)와 OR를 취하면 필드만 5로 바뀌고 나머지 비트는 원래 값 그대로 남습니다. 동작 모드나 분주비처럼 여러 비트로 하나의 설정을 나타내는 레지스터를 바꿔 쓸 때의 기본 형태입니다.

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

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

  1. 메인 처리에서 레지스터 비트를 'reg |= mask;'(읽기-수정-쓰기)로 조작하는 도중에 인터럽트 핸들러가 같은 레지스터의 다른 비트를 바꾸면 발생할 수 있는 문제와 대책의 조합으로 올바른 것은 무엇입니까?
  2. 마이크로컨트롤러의 입력 핀에 스위치만 연결하고 풀업이나 풀다운 저항을 달지 않았습니다. 스위치가 열려 있을 때 일어날 수 있는 일은 무엇입니까?
  3. 마이크로컨트롤러의 GPIO(범용 입출력) 핀을 사용할 때 가장 먼저 설정해야 하는 것으로 올바른 것은 무엇입니까?
  4. 기계식 스위치를 눌렀을 때 접점이 잘게 튀어 짧은 시간에 여러 번 온과 오프를 반복하는 현상을 무엇이라고 합니까?
  5. 소프트웨어로 스위치의 채터링을 제거하는 방법으로 가장 적절한 것은 무엇입니까?

이 분야의 비교