임베디드 레시피

Egloos | Log-in





Coprocessor Assembly

Coprocessor라는 게 있지요. 코Processor라는 건 Co-worker에요. 인생을 살다 보면 모든 걸 혼자 처리할 순 없는 노릇이에요. 그러다 보니, Coprocessor도 필요한 거구요. CPU혼자 모든 것을 처리 할 수 없는 것들도 있는 법이거든요.

Coprocessor가 있으면 Coprocessor랑 말도 해야겠지요. 멀뚱히 있는 Coprocessor에게 말을 거는 방법은 Register를 통해서 말을 할 수 있습니다. Coprocessor에게 말을 걸 수 있는 전용 Register가 있거든요. Coprocessor에게 말을 걸 수 있는 방법은 다른 Assembly랑 거의 비슷해요. 명령을 알아 볼까요?

Coprocessor 명령이라고 또 별거 있겠사옵니까,
Data를 전송하는 명령들이 있지요. Coprocessor Data관련 명령어는 세가지 종류로 구분되지요.
Coprocessor내부의 Register들을 장난 침.
Coprocessor내부의 Register를 ARM Register로 읽거나 반대로 써서 장난 침
Coprocessor내부의 Register를 Memory에 직접 읽어 들이거나 반대로 써서 장난 침.

뭐, 이 정도라 할 수 있겠어요.

Coprocessor Data 명령어.
1) Coprocessor 내부의 Register들을 장난 침. (Coprocessor 내부 Register ↔ Coprocessor 내부 Register) 여기에 붙은 모든 것들은 Coprocessor 내부에 정의 된 녀석들입니다. 형식은,

CDP Coprocessor번호, Coprocessor 명령어, CRd, CRn
이고요, Coprocessor 명령어는 Coprocessor마다 준비된 명령어가 틀리니까, 그런 게 들어가는 거구요, CRd는 Coprocessor 내부에 있는 Register로서 Destination Register로 사용되는 Register이고요, CRn은 Coprocessor 내부에 있는 Register로서 인자 Register구요. ARM Assembly랑 비슷하죠?

2) Coprocessor 내부의 Register들을 ARM Register에 읽거나 반대로 써서 장난치는 경우. (Coprocessor 내부 Register ↔ ARM Register)
Coprocessor 명령은 ARM core와 Coprocessor와의 통신에 관련된 Register로서, PSR명령과 유사한 형식입니다. Coprocessor의 Register들과 직접적인 Register 값 교환을 하는 명령어는 MRC, MCR, 이고요. M X ← Y 형식입니다. R은 Core의 일반 Register이고요, C는 coprocessor의 Register를 의미합니다. 그러니까,
MRC는 R←C로서 R:=Coprocessor 이고요,
MCR은 C←R로서, C:=Register 값을 의미합니다.
예를 들어,
MCR 코프로세스번호, 무조건 0, 레지스터번호, Coprocessor 레지스터번호, c0, 무조건 0의 형태를 따라서 명령을 주면 되며
MCR p15, 0, r4, c2, c0, 0 으로 명령을 주면 coprocessor 15번 2번 register에 r4 값을 전송하라는 뜻이 됨을 상기 하시면 됨다~

3) Coprocessor내부의 Register를 Memory에 직접 읽어 들이거나 반대로 써서 장난 침.
(Coprocessor 내부 Register ↔ Memory)
마지막으로, Coprocessor 내부 레지스터와 메모리 사이에 Load, Store할 수 있는 명령이 있으니, 그것들이 LDC, STC입니다. LDC, STC에도 preindex, postindex 방식이 엄연히 존재하고요, 딱 하나만 예제를 든다면, LDC p15, c2, [r0, 0x100] 이면, Coprocessor 15번의 register 2번에 r0+0x100이 가리키는 곳의 값을 load하라는 의미 인 것이죠. 일반 load와 틀림없이 같지만 앞에 Coprocessor 번호인 p15가 붙는 다는 것만 다릅니다. LDR은 Register의 R, LDC는 Coprocessor의 C인 게지요. Coprocessor 15는 MMU, Cache에 관련된 coprocessor로서, 이 녀석을 잘 control해야 할 일이 산더미처럼 많이 있으니, Device control 부분에서 각 register사용 법에 관련하여 더욱 자세히 봐야 할 듯 합니다. 쩝.

by 히언 | 2009/07/13 19:16 | ARM미장센-ARM제어의구현 | 트랙백 | 핑백(1)

Linked at 임베디드 시스템 개발자 되기 .. at 2009/07/13 19:18

... Vector Table (EVT)과 각 Handler의 구현 ⓗ SWI의 진실 ⓘ Coprocessor Assembly ⓙ Bootloader와 Memory Budget (Mapfile) - 어떻게 변수를 초기화 할 것인가 ... more

◀ 이전 페이지          다음 페이지 ▶