Bit banding 이란. Bit operation 을 빠르게 해줄수 있는 방법을 제공하는것.

공통적으로 alias 영역에 Write 행위는 그에 상응하는 bit-band 영역의 특정비트에 영향을 주는것.

ex)
-> 0x2000 0000 번지의 1번 비트가 어떻게 되는지 보면 결과적으로는 0x2200 0004 번지에 할당되어 있다.
    
그럼 0x2000 0000 번지의 0번비트의 해당하는 alias 영역은,, 0x2200 0080 이되고

1번비트는 0x2200 0084번지..
2번비트는 0x2200 0088번지..
3번비트는 0x2200 0092번지..


이렇게 보면 간단한 식으로 설명할수가 있다.

bit_word_addr = bit_band_base + (byte_offset * 32) + (bit_number * 4)

bit_band_base는 SRAM에서는 0x2200 0000 이 될것이고  
                   Paripheral에서는 0x4400 0000 이 될것이다.

byte_offset는 구하고자하는 주소에서  SRAM에서는 0x2000 0000 을 빼준것이 될것이고  
                                   Paripheral에서는 0x4000 0000 을 빼준것이 될것이다

ex) 0x2000 00400 번지의 2번 비트에 해당하는 alias의 영역 번지를 구하여라~
  0x2200 8008=0x2200 0000 + 0x400 * 0x20(dec 32) + (2 * 4) 

그니깐..여기서 주의 해야 할점은. 32곱해주기전 32가 10진수이니 HEX(16진수)로 타입을 바꾸어서 계산을 해야 합니다.

저는 이부분에서 ..민망한 실수를 했군요.ㅜ흑..

(편의상 hex값을 4자리로 나눠서 보기 싶게 해놓았음.)
8Bit=1Byte  그러므로 32Bit=4Byte

다른 티스토리 사용자의 내용을 조금 .. 담아본다.. --추가내용--
출처: http://todayis.tistory.com/254


위 그림에서 붉은 박스로 된 부분, 즉 SRAM과 Peripheral의 하위 0x03FFFFFF 영역을 보면 1MB의 Bit Band region32MB의 Bit Band alias로 되어있다.

Cortex M3 이전의 ARM7, ARM9 등의 CPU에서 SRAM이나 Peripheral Memory 영역에 bit 연산을 하기 위해서는 AND 나 OR 연산을 사용해서 프로그래밍을 했다. 이러한 방법은 읽기, 수정, 쓰기 작업을 하는데 있어서 set, clear 등의 작업을 통한 많은 작업이 필요했다.
하지만, Cortex M3에서는 bit banding를 사용함으로 alias된 영역의 한 바이트에 값을 넣어주는 방식으로 원하는 bit에 접근을 할 수 있다.

왼쪽은 기존의 ARM7, ARM9에서 사용하던 bit 연산이고, 오른쪽이 Cortex M3에서 사용하는 Bit Banding 방식이다.

기존의 bit 연산을 보면 01001011 이라는 값에서 하위 세번 째 비트를 1로 세팅하기 위해 11111111 과 or 연산을 한다. 이렇듯 bit 연산을 하기 위새 AND 혹은 OR 연산을 통해 Mask를 하거나 다른 작업을 하게 된다. 이는 생각보다 많은 CPU 타임을 잡아먹는다고 한다.

Cortex M3에서의 bit banding를 보면..
실제 수정을 가할 32bit의 메모리 공간(0x20000000 ~ 0x200FFFFF)이 있고, 이 영역에 alias 된 가상의 메모리 공간(0x22000000 ~ 0x23FFFFFF)가 존재한다. 오른쪽 그림을 보면 왠지 감이 올듯도 한데.. alias 된 메모리 공간의 각 바이트들은 실제 bit banding 영역의 한 비트와 매칭된다. alias 된 가상의 메모리 공간의 한 바이트에 값을 넣게 되면 이와 매칭되는 실제 bit banding 메모리 공간(한 비트)에 프로그래밍 한 것과 동일한 효과를 갖는 것이다.
AND 나 OR 연산을 하지 않고 SRAM이나 Peripheral의 특정 메모리 영역에 별다른 instruction 없이 원하는 값을 쓰거나 읽기만 하면 되는 것이다. 이를 Cortex M3에서는 H/W 적으로 구현이 되어있다.




+ Recent posts