RM7TDMI 레퍼런스 매뉴얼을 살펴보면 다음과 같이 칩코어의 블럭다이어그램을 찾을 수 있다.

 

 

위 그림에서 좌측부분을 보면 디바이스가 프로그램메모리에 접근하기 위해 PC(프로그램 카운터) 정보를 레지스터로부터 가져옴을 볼 수 있는데, 이로부터 resolve하는 어드레스의 크기는 A31:0의 총 32비트임을 보여준다. 즉, SAM7S가 인식하는 메모리의 어드레스 공간은 총 32비트(약 4.3GB)로 구성됨을 알 수 있다. 또한, PC는 32비트의 주소값을 저장해야 하므로, 아래의 그림에서 ARM7TDMI 코어의 동작모드(총 7가지)에 관계없이 레지스터15(R15)를 PC를 위해 사용한다.

 

 

SAM7S는 폰노이만 구조로서, 코어에 내장된 물리적 메모리(플래시 및 SRAM)와 각종 I/O 주변장치등을 매모리맵 I/O 방식(Memory Mapped I/O)으로 맵핑시켜 두었다. (아래 그림 참고)

 

 

 

우선 위의 그림의 좌측에서와 같이, 32비트의 어드레스 공간은 크게 3개의 영역으로 나뉘어져 있다. 하위 256MB는 물리적 메모리를 위한 영역으로 할당되어 있고, 상위 256MB는 주변장치를 위한 I/O 공간으로 할당되어 있다. 이들 사이의 3.5GB 정도의 공간은 미정의상태로서 사용되지 않는다.

 

여기서 하위 256MB의 물리적메모리를 위한 공간을 다시 자세히 살펴보면, 3개의 1MB 영역과 253MB의 미사용영역으로 이루어져 있음을 알 수 있다.(위 그림에서 우측 참고) 여기서, SAM7S의 프로그램메모리(플래시)는 0x10_0000 번지부터 맵핑되어 있으며, 데이터메모리(SRAM)는 0x20_0000 번지부터 맵핑되어 있다. 플래시와 SRAM의 공간은 각각 1MB의 영역만큼 할당되어 있으나, 플래시메모리와 SRAM의 용량은 디바이스마다 그 크기가 정해져 있기 때문에 실제 사용되는 공간은 디바이스의 메모리 용량에 의해 결정된다. (예컨데, SAM7S256의 경우 플래시메모리의 크기가 256KB이므로 256KB의 공간만큼만 사용가능)

 

디바이스가 리셋이 되면 PC는 0x0000_0000 번지로 점프하므로 이 곳은 아무런 메모리도 할당되어 있지 않아 왠지 모순이 되는 것 같다. 그러나, SAM7S에는 메모리 리맵핑(Memory Re-mapping) 기능이 제공되고 있어, 디폴트로 0x10_0000 번지의 플래시영역이 0x00_0000 번지에 리맵핑되어 있다. 따라서, 리셋이 되면 SAM7S는 플래시메모리의 내용을 읽으면서 부팅이 된다. 반면에,MC_RCR이란 레지스터의 RCB비트를 1로 세팅하면 재배치 명령(Remmap Command)이 실행되어 0x20_0000 번지의 SRAM영역이 0x00_0000 번지로 리맵핑되어 SRAM의 내용을 읽으면서 부팅이된다.

 

SAM7S의 플래시메모리는 Single Plane으로 구성되어 있기 때문에, 플래시메모리의 내용을 실행하면서 플래시-라이트를 할 수는 없다. 때문에, SAMBA와 같은 경우 이 리맵핑 기능을 이용하여 SRAM영역으로 SAMBA 코드를 복사한 뒤 SRAM영역에서 부팅하여 플래시메모리에 펌웨어를 라이팅하게 된다.

FCLK : cpu에서 사용되는 클럭

HCLK : AHB 버스에 사용되는 클럭(메모리 컨트롤러, 인터럽트 컨트롤러,  LCD 컨트롤러, DMA, USB 호스트 등에서 사용)

PCLK : APB 버스에 사용되는 클럭(WDT, 타이머, ADC, UART, GPIO, RTC, SPI 등에서 사용)






 .ascii "<string>"
: 데이터와 같은 문자열을 어셈블리에 삽입한다. armasm의 DCB와 동일한 기능을 가진다.

 .asciz "<string>"
: .ascii와 동일한 기능을 가지지만 0 바이트를 가진 문자열이 나온다.

 .balign <power_of_2> {,<fill_value>{,<max_padding>}}
: 주소를 <power_of_2> 바이트로 정렬한다. 어셈블러는 <fill_value>나 적절한 디폴트 값을 추가하여 정렬을 맞춘다. 만약 <max_padding>보다 더 많은 fill 바이트가 필요하다면 정렬되지 않을 것이다. 이것은 armasm의 ALAIN과 유사하다.

 .byte <byte1> {,<byte2>} ...
: 데이터와 같은 바이트값을 어셈블리에 삽입한다. armasm의 DCB와 동일한 기능을 가진다.

 .code <number_of_bits>
: 명령어 폭을 비트로 설정한다. Thumb 어셈블리에서는 16을, ARM 어셈블리에서는 32를 사용한다. armasm에서의 CODE16과 CODE32와 유사하다.

 .else
: .if와 .endif와 함께 사용한다. armasm에서의 ELSE와 유사하다.

 .end
: 어셈블리 파일의 끝을 나타낸다. 보통 생략 가능하다.

 .endif
: 조건부 컴파일 코드 블록을 끝낸다(.if, .ifdef, .ifndef 참고). armasm에서의 ENDIF와 유사하다.

 .endm
: 매크로 정의를 끝낸다. armasm에서의 MEND와 유사하다.

 .endr
: 반복 루프를 끝낸다. armasm에서의 WEND와 유사하다.

 .equ <symbol name>, <value>
: 이 지시어는 심볼값을 설정한다. armasm에서의 EQU와 유사하다.

 .err
: 에러가 있으면 어셈블리를 정지시킨다.

 .exitm
: 매크로를 빠져나온다. armasm에서의 MEXIT와 유사하다.

 .global <symbol>
: 이 지시어는 심볼을 외부 링크로 제공한다. armasm에서의 EXPORT와 유사하다.

 .hword <short1> {,<short2>} ...
: armasm에서의 DCW처럼 데이터로 16비트값 목록을 어셈블리에 삽입한다.

 .if <logical_expression>
: 조건부 코드 블록을 생성한다. 이 블록은 .endif를 사용하여 끝낸다. armasm에서의 IF와 유사하다.

 .ifdef <symbol>
: 만약 <symbol>이 정의되어 있다면 코드 블록을 포함한다. 이 블록은 .endif로 끝난다.

 .include "<filename>"
: 지정한 소스 파일을 포함한다. armasm에서의 INCLUDE 또는 C에서의 #include와 유사하다.

 .irp <param> {, <val_1>{, <var_2>} ...
: 값 목록에서 각 값에 대해 코드 블록이 반복된다. .endr 지시어를 사용하여 블록의 끝을 표시한다. 반복되는 코드 블록에서 값 목록 안에 연관된 값을 치환하기 위해서는 \<param>을 사용한다.

 .macro <name> {<arg_1>}{, <arg_1>} ... {, <arg_k>}
: k 파라미터를 가진 <name>이라는 이름의 어셈블러 매크로를 정의한다. 매크로 정의는 .endm으로 끝난다. 초기에 매크로에서 빠져나오기 위해서는 .exitm을 사용한다. 이 지시어는 armasm에서의 MACRO, MEND, MEXIT와 유사하다. 더미 매크로 파라미터 앞에는 \이 나와야 한다. 예를 들어, 다음과 같다.

.macro SHIFTLEFT a, b
           .if \b < 0
              MOV \a, \a, ASR #-\b
              .exitm
           .endif
           MOV \a, \a, LSL #\b
.endm

 .rept <number_of_times>
: 주어진 수만큼 코드 블록을 반복한다. .endr로 끝난다.

 <register_name> .req <register_name>
: 이 지시어는 레지스터의 이름을 짓는다. 오른쪽에  숫자가 아니라 이름이 나온다는 것을 제외하면 armasm에서의 RN과 유사하다. 예를 들면 acc.req r0이다.

 .sectoin <section_name> {, "<flags>"}
: 새로운 코드 색션 또는 데이터 색션을 시작한다. 보통 코드 색션 .text, 초기화된 데이터 색션 .data, 초기화되지 않은 데이터 색션 .bss를 호출해야 한다. 이것들은 디폴트 플래그를 가지고 있으며 링커는 이 디폴트 이름들을 이해하고 있다. 이 지시어는 armasm 지시어 AREA와 유사하다. 표 A.19는 ELF 포멧 파일을 위한 <flags>문자열을 나타내는데 사용되는 문자이다.

[표 A.19] ELF 포멧 파일을 위한 .section 플래그

플래그

a

섹션 할당

w

쓰기 가능한 섹션

x

실행 가능한 섹션


 .set <variable_name>, <variable_value>
: 이 지시어는 변수의 값을 설정한다. armasm에서의 SETA와 유사하다.

 .space <number_of_bytes> {, <fill_byte>}
: 주어진 바이트 수를 할당한다. 바이트들은 0이나 규정된 <fill_byte>로 채워져 있다. armasm에서의 SPACE와 유사하다.

 .word <word1> {, <word2>} ...
: armasm에서의 DCD와 같이 데이터로 32비트 워드값 목록들을 어셈블리에 삽입한다.









출처 : http://blog.naver.com/serimo/50091042306

 

명령어 타입

명령

1

Branch, 링크 Branch

B, BL

2

Branch Exchange

BX

3

데이터 프로세싱

ADD, ADC, SUB, SBC, RSB, RSC, AND, ORR, BIC, MOV, MVN, CMP, CMN, TST, TEQ

4

곱셈

MUL, MLA, SMULL, SMLAL, SMULL, UMAL

5

Load/Store

LDR, LDRB, LDRBT, LDRH, LDRSB, LDRSH, LDRT, STR, STRB, STRBT, STRH, STRT

6

Load/Store 곱셈

LDM, STM

7

스왑

SWP, SWPB

8

SWI

SWI

9

PSR

MRS, MSR

10

코프로세서

MRC, MCR, LDC, STC, CDP

ARM에서 지원하는 7가지 동작모드

 

1. User 모드

태스크나 애플리케이션을 실행할 때의 동작모드이다.
비특권모드(Unprivileged)
메모리, I/O 장치와 같은 시스템 자원을 사용하는데 제한이 있다.

 

2. IRQ(Interrupt Request) 모드
인터럽트 요청에 대한 동작모드이다.
하 드웨어적인 외부장치의 요청에 의해 IRQ가 발생하면 IRQ 모드로 전환하고
인터럽트를 처리한다.

 

3. FIQ( Fast Interrupt Request) 모드
빠른 인터럽트 처리를 하는 모드이다.
하드웨어적인 외부장치의 요청에 FIQ가 발생하고 FIQ 모드로 전환하고
인터럽트를 처리한다.

 

4. SVC(Supervisor) 모드
대부분의 시스템 자원을 자유롭게 관리할 수 있는 동작모드이다.
운영체제의 커널이나 디바이스 드라이버를 처리할 때 사용되는 동작모드다.
ARM은 리셋신호가 입력되거나 소프트웨어 인터럽트(SWI)가 사용되면
SVC모드로 전환된다.

 

5. Abort 모드
메모리에서 명령을 읽거나 데이터를 읽고 쓸때 오류가 발생하면 Abort 모드로
전환하여 메모리 오류를 처리한다. MMU나 MPU, 기타 외부 메모리 제어기로부터
발생하는 Abort신호에서 동작한다.

 

6. Undefined 모드
명령어를 읽어 처리할 때 디코더에 정의되어 있지 않을 경우 발생하는 오류를
처리하기 위한 동작모드이다.

 

7. System 모드
특권(privilege) 모드라는 점을 제외하고는 User모드와 동일한 동작모드이다.

 


ARM은 User 모드와 System 모드는 소프트웨어적인 요청에 의해서만 전환이 되며
그외 다른 동작모드는 소프트웨어적인 요청이나 외부의 요청 혹은
오류에 의해 모드가 전환된다.

출처 : http://blog.naver.com/serimo/50091036891

Cross Toolchains

We provide a set of apt-able tools built from standard Debian binutils and gcc sources.

We are currently working on keeping the tools synchronised with Debian, and maintaining installable sets for unstable, testing and lenny. Builds are still handled manually so are sometimes out of date. If you have any trouble finding current packages in the main repository, you may find something useful in Hector Oron's toolchain download area.
Please check Toolchain Wiki page for the latest news on the matter.

The cross-toolchains can not yet be built in Debian proper because there is no mechanism for the autobuilders to understand cross-dependencies. We are working on dealing with this problem so that crosstools can become standard debian packages, but until that is done you need to add the emdebian repository to your sources.list.
If you install emdebian-tools, and run emsetup -a arch it will add suitable sources.list entries for you. Be sure to edit /etc/apt/sources.list.d/ files and add your Debian suite.
To set things up manually edit /etc/apt/sources.list to add one of the lines below.

#
# -- Emdebian sources.list entries
#
# deb http://www.emdebian.org/debian/ unstable main
# deb http://www.emdebian.org/debian/ testing main
deb http://www.emdebian.org/debian/ lenny main

Then do apt-get update to update your local lists.

Once you have that then install whichever version of the tools you want. e.g:
apt-get install libc6-armel-cross libc6-dev-armel-cross binutils-arm-linux-gnueabi gcc-4.3-arm-linux-gnueabi g++-4.3-arm-linux-gnueabi
will install the gcc-4.3 C and C++ toolchain for armel cross-compiling.

For details on how to build your own tools see also how to build your own toolchain.

출처 : http://www.emdebian.org/

+ Recent posts