Bit-banding

레지스터의 비트제어를 아토믹(atomic)하게 할 수 있는 비트밴딩(bit-banding)에 대해 알아봅시다. 사실 비트밴딩은 ARM에서 칩 벤더에게 제공하는 여러 옵션중 하나인 것이라서 모든 칩에서 지원하는 것은 아닙니다. 대부분의 Cortex-M3, M4 칩에서는 비트밴딩을 지원하지만, Cortex-M0 계열에서는 지원하는 칩이 조금 드물고, Cortex-M7 같은 경우는 비트밴딩이 없다고 합니다. STM32F103의 경우엔 지원하고 있네요~

Memory Region

Bit-banding 은 일부 메모리 영역에 할당되어있습니다. 아래는 이전에 봤던 메모리맵 다이어그램입니다. STM32F103은 SRAM 비트밴딩과 페리퍼럴 비트밴딩 옵션 모두를 선택했네요.
MemoryModel-BitBand

세부 매핑이 어떻게 되어있는지는 아래 다이어그램을 참조하면 됩니다. ST사에서 제공하는 데이터시트에는 다이어그램이 없어서 TI사의 TM4C123GH6PM 데이터시트에서 가져왔습니다. 다른 칩이라도 ARM에서 제공하는 옵션이기 때문에 메모리 매핑이 동일합니다.
BitBandMapping

계산하는 공식은 다음과 같습니다.

bit_word_offset = (byte_offset x 32) + (bit_number x 4)

bit_word_addr = bit_band_base + bit_word_offset

Name Description
bit_word_offset The position of the target bit in the bit-band memory region.
bit_word_addr The address of the word in the alias memory region that maps to the targeted bit.
bit_band_base The starting address of the alias region.
byte_offset The number of the byte in the bit-band region that contains the targeted bit.
bit_number The bit position, 0-7, of the targeted bit.

bit_word_addr를 계산한 후 C 소스 코드에서 #define LED2 (*(volatile uint32_t *)(bit_word_addr)) 라고 매크로를 만든 뒤에 LED2 = 1;, LED2 = 0; 이런 식으로 사용하면 됩니다. 실제 쓸 때는 bit_word_addr를 계산하는 매크로 함수를 사용하는 것이 편하겠지요~

LAB!

실습을 해볼까요! 이전에 작성한 GPIO 코드에서 LED와 버튼에 해당하는 레지스터 비트 엑세스 부분을 비트밴드를 이용한 코드로 수정하면 됩니다. 레퍼런스 매뉴얼의 공식을 보고 매크로 함수를 만들어써도 되지만 여기선 ARM infocenter의  Application Note 179, 2.5. Bit-banding 에 나오는 매크로 함수를 써봅시다.

이전에 작성한 코드에서 레지스터에 엑세스하기 위해 레지스터 주소를 아래의 코드처럼 타입캐스팅 해두었는데요. 이걸 다시 주소로 다시 바꾸기 위해서는 다시 캐스팅이 필요합니다. 안해주면 컴파일러가 싫어합니다!

실제 사용은 아래처럼 해주면 됩니다.

아래는 비트밴딩을 적용한 소스 코드입니다.

코드만 약간 바뀌었지 동작은 이전 코드랑 동일합니다~

References

ST, RM0008: STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx advanced ARM®-based 32-bit MCUs

ST, PM0056: STM32F10xxx/20xxx/21xxx/L1xxxx Cortex-M3 programming manual

TI, Tiva™ TM4C123GH6PM Microcontroller – DATA SHEET

Leave a Reply

Your email address will not be published. Required fields are marked *