고양이와 코딩
[내가 헷갈려서 하는] 임베디드 FW 레지스터 제어 패턴 정리 본문
업무를 하다보면, 그냥 앞서 짜여져 있는 코드를 따라 나도 비트 마스크, 시프트 연산을 마구 사용하지만
막상 남이 짠 연산 코드를 빨리 해석해서 공유해야 하는 상황이 오면 당황하게 된다 ....
사실 나는 컴퓨터가 아니기 때문에 왜 곱셈/나눗셈을 안하고 시프트 연산을 썼을까 .. 하면서
1차로 함수 이름으로 어떤 연산을 하는지 추측하곤 한다 ^^ ㅋ 이렇게 하면 훨씬 쉬워지지만 ~
비트 연산도 결국 연산이니까 ,,, 어렸을때 곱셈 나눗셈 구몬 무한반복 했을때처럼 하면 좀 익숙해지지 않을까 싶어서 ..
아무튼 시작
1. 비트 제어 패턴
value |= (1U << 5); // bit5 ON
value &= ~(1U << 3); // bit3 OFF
| 연산자는 또는(OR)니까, 같은 자리에 둘 중 하나만 1이어도 1이 된다!
& 연산자는 그리고(AND)니까, 같은 자리에 둘 다 1이어야 1이 된다
=> 그러면 깊게 생각하지 말고, 1이 5자리 이동했고 | 연산이니까 5번 비트 자리는 무조건 1이 되겠군
1이 3자리 이동했고 &연산 전에 ~으로 반전됐으니까 3번 비트 자리는 무조건 0이 되겠군
그리고 다른 비트는 전혀 영향받지 않고 원래 그대로겠군
정리하면,
- 1을 5칸 왼쪽으로 이동하면 5번 비트만 1이고 나머지는 0인 값이 된다.
- OR 연산은 1이 있는 자리를 1로 만들기 때문에, 5번 비트는 무조건 1이 된다.
- 다른 비트는 0과 OR 연산을 하므로 기존 값이 그대로 유지된다.
- 1을 3칸 왼쪽으로 이동하면 3번 비트만 1인 값이 된다.
- 이를 ~ 연산으로 뒤집으면 3번 자리만 0이고 나머지는 모두 1이 된다.
- AND 연산은 0과 연산된 자리를 0으로 만들기 때문에 3번 비트는 반드시 0이 된다.
- 다른 비트는 1과 AND 되므로 기존 값이 유지된다.
2. 비트 추출 패턴
value = (reg >> shift) & 0x1F;
(원본 >> 시작비트) & 마스크
0x1F = 0001 1111(bin)
예를 들어, reg = 1011 0110 1101 1000, shift = 4
reg >> 4 = 0000 1011 0110 1101
그리고 0x1F와 AND 연산을 하는데, 1F는 아래 다섯 비트만 1인 값이다!
0000 1011 0110 1101
& 0000 0000 0001 1111
---------------------------
0000 0000 0000 1101
- 먼저 reg >> shift를 통해 내가 보고 싶은 비트 구간을 오른쪽 끝으로 이동시킨다.
- 그 다음 보고싶은 비트 구간이 1로 구성된 값과 &연산을 하면, 아래 n비트만 남기고 나머지는 모두 0이 된다.
'임베디드' 카테고리의 다른 글
| [ARM Cortex-M3 완벽 가이드] - 내맘대로 정리.. (0) | 2025.03.16 |
|---|---|
| 임베디드와 펌웨어 (1) | 2024.05.09 |