software 관점에서 memory는 addressable한 bytes의 array이다 (8 bit 단위).
만약 memory를 word 단위로 본다면 4 bytes 단위가 된다. word address는 그 word의 4 bytes중 가장 작은 address이다.
위의 경우 word address는 0x20000000
, 0x20000004
이다.
만약 memory를 halfword 단위로 본다면 2 bytes 단위가 된다. halfword address는 word address와 동일하게 그 halfword의 2 bytes중 가장 작은 address이다.
위의 경우 word address는 0x20000000
, 0x20000002
, 0x20000004
, 0x20000006
이다.
Cortex-M3 프로세서는 4 GB의 addres space를 가지고 있다.
또한 Cortex-M3 프로세서는 fixed memory map을 가지고 있다. fixed memory map이기 때문에 Cortex-M3 product는 NVIC
와 MPU
가 모두 동일한 memory location을 갖고 있어서 그들 사이의 software porting이 쉽다고 함.
거의 모든 하드웨어가 address를 부여받고 그 address를 통해 하드웨어에 접근할 수 있음.
memory map은 각 memory block이나 device에 접근할 때의 memory attribute를 정의한다. Cortex-M3 프로세서는 default memory attribute setting을 가지고 있지만 overridden될 수 있다 (MPU
와 관련 있음).
Cortex-M3 memory map은 memory access permission을 위한 default configuration이 있다.
default memory access permission은 다음과 같은 경우에 사용된다.
- No
MPU
is presentMPU
is present but disabled
위의 경우가 아니라면 MPU
가 memory access가 allow됐는지 결정한다.
만약 접근하려는 memory region의 memory access가 block되어 있다면 fault exception이 즉시 발생한다.
MPU
는 memory와 I/O access가 허용되었는지 확인할 수 있는 기능을 제공한다.
8~16개의 개별적인 memory region을 지원하고 각 region은 fetch, read, write permission의 combination으로 이루어져 있다. 또란 access attribute도 지정할 수 있음..
만약 허용되지 않은 access라면 trap(exception)이 발생한다 (MMF
, memory management fault).
MPU
는 privileged/unprivileged memory access permission의 combination이다.
MPU
region은 중복될 수 있다 (ARMv7 only).
memory region이 overlap되면 memory access는 highest number를 가진 region의 attribute에 영향을 받는다.
bit-band operation은 single data bit에 접근하는 single load/store operation을 지원한다.
bit-band region은 다음과 같다.
SRAM
region의 첫 번째 1 MB- peripheral region의 첫 번째 1 MB
이 영역들은 bit-band alias라고 불리는 분리된 memory region을 통해 access될 수 있다.
bit banding은 bus matrix를 통해 수행된다.
https://todayis.tistory.com/254 참고.
1. Write
2. Read
사용하는 instruction의 수를 줄여서 bit operation을 더 빠르게 수행할 수 있다.
hardware를 통한 수 많은 read/write operation을 줄일 수 있음.
그리고 bit-band operation을 통한 read/write을 할 때에는 lock이 걸리기 때문에 shared memory location의 data가 손실되거나 하지 않는다.
1
을 0
으로 만들고 싶었던건데 의도치않게 interrupt handler에 의해 3
으로 바뀐걸 0
으로 바꿔버림.. race condition.
이런 현상을 피하기 위해 single instruction으로 bit operation을 실행시키고자 하는 것임. bit-band operation을 사용하면 single instruction으로 bit operaion을 실행할 수 있음.
C에서는 bit-band operation이 native하게 지원되지 않으므로 이를 따로 정의해주어야 한다. bit-band operation을 쓰면 C compiler가 이를 인식하지 못함... 그래서 bit-band operation을 쓰고 싶으면 추가적인 코드를 사용해야함.
가장 쉬운 방법은 bit-band region을 pointer로 사용하는 것이다. 그럼 single write로 bit-band를 구현할 수 있다.
Cortex-M3은 single access에서의 unaligned transfer를 지원한다.
data memory access는 aligned/unaligned 으로 정의될 수 있다.
unaligned transfer인 경우
1. Word size인데 address가 4배수가 아닌 경우
2. Halfword size인데 address가 2배수가 아닌 경우
unaligned transfer는 load/store multiple instruction을 지원하지 않고 stack operation(push/pop)은 무조건 align으로 사용해야 한다. 또한 exclusive access는 align된 상태로 접근되어야 하고 unaligned transfer는 bit-band operation을 지원하지 않는다.
unaligned transfer는 여러 개의 aligned transfer로 변환되어 사용된다. 따라서 single data access에 더 많은 clock cycle을 소모하게 된다.
LDREX
, STREX
)task와 handler가 안전하게 자원을 공유하기 위해서 보통 lock이 사용된다. race condition을 피하기 위한 것임.ㄴ
자원을 사용하기 전에 그 자원을 사용하기 위한 lock을 획득해야 한다. 그리고 그 자원의 사용이 끝나면 lock을 release 해야한다.
exclusive access instruction은 hardware resource를 사용할 수 있는지 확인할 수 있다.
LDREX
(word), LDREXB
(byte), LDREXH
(halfword), STREX
(word), STREXB
(byte), STREXH
(halfword)가 있다.
Cortex-M3은 little endian(recommended)과 big endian을 모두 지원한다.
하지만 지원되는 memory type은 microcontroller의 design에 따라 다르다.
endian mode는 processor가 reset을 exit할 때 정해지며 그 이후로는 바뀌지 않는다.
instruction fetch는 항상 little endian으로 수행된다.
REV
/REVH
를 사용하면 data를 little endian과 big endian으로 쉽게 변환할 수 있다.