2009. 9. 29. 11:47
Cortex M3 - Bit Banding
2009. 9. 29. 11:47 in 혼자서 놀기.../STM32
Bit Banding는 Cortex M3 에서 제공하는 Bit 연산을 쉽게(간단하게) 할 수 있도록 제공하는 하나의 방법이다.
Writing to a word in the alias region has the same effect as a read-modify-write operation on the targeted bit in the bit-band region. (하나의 워드를 bit band에 alias된 영역에 프로그래밍 하는 것으로 원하는 bit band 영역의 bit 를 프로그래밍 할 수 있다.)말이 참 어렵다... -_-;;
Cortex M3의 메모리 맵을 보면 다음과 같이 되어있다. (from Cortex M3 Technical Reference Manual)
위 그림에서 붉은 박스로 된 부분, 즉 SRAM과 Peripheral의 하위 0x03FFFFFF 영역을 보면 1MB의 Bit Band region 과 32MB의 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 적으로 구현이 되어있다.
아래의 그림을 보면서 생각을 해보면 이해가 잘 된다. ^^; (from Cortex M3 Technical Reference Manual)
예를 들어 설명을 해보자.
실제 bit banding 영역의 0x20000000 번지의 0번 비트는 alias 된 가상의 영역 0x22000000 번지(한 바이트)와 매칭된다. 0x22000000 번지에 1을 넣게 되면, 0x20000000 번지의 0번 비트가 1이 된다는 말이다. 또 0x22000004 번지에 1을 넣게 되면, 0x20000000 번지의 1번 비트가 1이 되는 것이다.
데이터 시트를 보면 이를 수식화 해놓은 것이 있다.
bit_word_addr = bit_band_base + (byte_offset x 32) + (bit_number x 4)
bit_word_addr = bit_band_base + bit_word_offset
수식에 맞추어 위의 예제를 풀어보자.
bit banding 영역의 0x20000000 번지의 비트 1번을 처리할 수 있는 alias 주소값은??
bit_word_addr : X
bit_band_base : 0x22000000
byte_offset : 0 byte
bit_number : 1 bit
0x22000000 + (0x00 x 32) + (0x01 x 4) = 0x22000004
bit_word_addr : X
bit_band_base : 0x22000000
byte_offset : 0 byte
bit_number : 1 bit
0x22000000 + (0x00 x 32) + (0x01 x 4) = 0x22000004
데이터 시트에 있는 예제를 가지고 실제 어떠한 방식으로 사용을 할 수 있는지 살펴보자.
(from Insider's Guide STM32)
bit banding을 사용하여 GPIO의 PortB의 output register(0x40010C0C)를 다루는 예제이다.
Word address(GPIOB_ODR) = 0x40010C0C
Peripheral bit band base = 0x40000000
Peripheral bit band Alias base = 0x42000000
Byte offset from bit band base = 0x40010c0c – 0x40000000 = 10c0c
Bit word offset = (0x10c0c x 0x20) +(8x4) = 0x2181A0
Bit Alias address = 0x42000000 + 0x2181A0 = 0x422181A0
bit banding 식에 의해 나온 alias 주소값을 PortBbit8에 매핑한다.
#define PortBbit8 (*((volatile unsigned long *) 0x422181A0 ))
단지 데이터를 쓰는 것만으로도 해당 비트에 접근을 해 LED를 켤 수 있다.
PB8 = 1; //led on
또 다음과 같이 LED를 끌 수도 있다.
PB8 = 0; //led off
Word address(GPIOB_ODR) = 0x40010C0C
Peripheral bit band base = 0x40000000
Peripheral bit band Alias base = 0x42000000
Byte offset from bit band base = 0x40010c0c – 0x40000000 = 10c0c
Bit word offset = (0x10c0c x 0x20) +(8x4) = 0x2181A0
Bit Alias address = 0x42000000 + 0x2181A0 = 0x422181A0
bit banding 식에 의해 나온 alias 주소값을 PortBbit8에 매핑한다.
#define PortBbit8 (*((volatile unsigned long *) 0x422181A0 ))
단지 데이터를 쓰는 것만으로도 해당 비트에 접근을 해 LED를 켤 수 있다.
PB8 = 1; //led on
또 다음과 같이 LED를 끌 수도 있다.
PB8 = 0; //led off
우리(프로그래머)는 위와 같이 간단하게 프로그래밍을 하면 된다.
Bit Banding이라는 것 참 좋은 아이디어인 듯 하다.
참고문서 :
푸우님 블로그(http://blog.naver.com/yhoh)
Insider's Guide STM32
Cortex M3 Technical Reference Manual
Reference Manual(RM0008)
'혼자서 놀기... > STM32' 카테고리의 다른 글
STM32 개발 환경 (0) | 2009.12.26 |
---|---|
STM32 Memory Map (1) | 2009.12.24 |
Cortex-M3(STM32) System Architecture (0) | 2009.10.06 |
STM32F103C6T6 (0) | 2009.10.05 |
STM32F103C6 (0) | 2009.09.23 |