2007/10/19 - [임베디드/ARM] - ARM7 강좌 [13] : Instruction Set(7) (출처 : 디지털 동호회)
---------------------------------------------------------------------- ARM7 강좌 [14] : Instruction Set(8) ---------------------------------------------------------------------- 오늘 다룰 명령은 SWP와 SWI두가지 입니다. Co - Process 명령을 제외하면 이 명령이 마지막이겠군요... 코프로세서는 다루지 않을 생각이니... 참 홀 가분한 느낌입니다. 1. Single Data Swap :{cond}{B} Rd,Rm,[Rn] 레지스터를 3개 지정하도록 되어 있습니다. 실제 동작은 Rd:=[Rn], [Rn]:=Rm 이 한번에 일어나는 명령입니다. 여기서 한번이라는 말은 한클럭을 의미하는 것이 아니라, 명령 도중에 인터럽트 등에 의해 중단되지 않고 계속 이루어진다는 것입니다. 그리고 B 접미사는 계속 보 아 왔듯이 워드 Operation이 아니라 Byte Operation을 의미합니다. 예제를 보죠. SWP r0,r1,[r2] ; r0:=[r2], [r2]:=r1 입니다. SWPB r2,r3,[r4] ; r2:=[r4], [r4]:=r3 입니다. 다만 B가 붙었으므로 Bit 0에서 7까지만 영향을 미칩니다 SWPEQ r0,r0,[r1] ; Flag의 상태를 확인하여 r0와 [r1]의 내용을 바꾸는 형태입니다. 보셨듯이 Rd와 Rm이 같을 수도 있군요. 한가지 더 언급하고 싶은것은 SWP를 세마포어 구현에 사용하는 방법입니 다. 어떤 문서에선가 SWP명령이 세마포어를 구현하는데 유용하다고 읽었 는데... 처음에는 이해가 안되더군요.. 한참 뒤에 이해할 수 있었습니다. 인터럽트를 금지시키지 않고 Semaphore 연산을 할 수 있다는 것이 SWP명 령의 강점입니다. 여기서 Semaphore를 설명드리긴 좀 그러니, 간단히 핵 심만 말씀드리고... 이해하실 분은 하시고... 안해도 별 수 없겠죠. 보통 세마포어의 p()연산을 구현하는 순서로, 먼저 세마포어 변수를 읽 어오고, 다음에 비교를 하죠. 그 값이 0보다 크다면 감소를 시켜 다시 Write합니다. Test and Set 연산이라고도 하던데요... SWP명령에 적용시키려면... [Rn]부분이 변수가 되야겠군요. 그러면 Rd에 는 SWP명령을 통해 세마포어 변수값이 들어올 테구요.. 물론 세마포어변 수의 상태를 알지 못하므로 어떤 값이 들어올런지는 모릅니다. 따라서 이 단계에서는 세마포어 변수에 어떤값을 다시 Write해야 할런지도 모릅 니다. 핵심은 변수에 Write되는 값을 무조건 0으로 설정한다는 것이죠. 즉... r3가 Semaphore 변수의 주소를 가리키고 있다고 하고, r2의 값은 0이라 고 한다면, SWP r1,r2,[r3] 와 같은 명령으로 처리할 수 있습니다. 위의 명령을 통해 원래 세마포어 변수의 값이 r1으로 로드됩니다. 0보다 큰지의 여부는 이제부터 비교해 야 겠지요... 한가지 특이한것은 세마포어 값을 읽어옴과 동시에 0을 넣어주었다는 것입니다. SWP명령의 특성상 읽어오는 동작과 0을 넣는 동 작 사이에는 인터럽트 등이 걸릴 수 없습니다. 이제, r1의 세마포어 값을 비교하는 부분으로 넘어가면 되는데, 이 와중 에 인터럽트가 걸리고 다른 타스크가 세마포어 변수를 Access하려고 하 더라도 0이 들어 있으니 자연히 대기상태로 인식되어 더이상 진행을 하 지 못하게 될 것입니다. 이밖에도 v()연산에서도 뭔가 더 해주어야 겠지만... (괜한 얘기를 꺼냈나 하는 후회가 엄습하는 중입니다...^^) 2. Software Interrupt : SWI{cond} SWI명령은 소프트웨어 인터럽트 명령입니다. 8086에는 INT 명령이 있죠? Exception 파트를 보시면 언급이 있었습니다. SWI명령이 걸리면 동작모드가 변화합니다. Supervisor 상태로 진입을 하 게 됩니다. 이런 특성 때문에 pSOS의 경우는 System Call의 진입방법으 로 사용합니다. 명령의 형식을 보시면 부분이 있는데, 무슨 역할을 하는 것 일까요? 8086계열 처럼 INT 21H 또는 INT 10H 이런 식으로 인수를 주는 것일까요? 8086이야 Interrupt 벡터를 지정하는 것이었지만... ARM7에는 해당 Vector는 고정이 되어 있습니다.(Software Exception 한가지로)... CPU는 expression에 대한 아무런 일도 하지 않습니다. 실제 명령어 구조 를 보면 총 32비트 중 상위 4비트는 조건 Flag에 사용되고, 다음 4비트 가 모두 1111 이면 SWI명령으로 판단됩니다. 이후 24비트는 실제로는 무 시되는 내용입니다만... 위와 같이 써주면 expression의 내용이 SWI명령의 Low 24Bit부분에 인코 딩 됩니다. 하지만 말씀 드렸듯이 ARM7은 SWI명령의 Low 25Bit내용이 뭐 든 간에 동일하게 동작합니다. 그럼 왜 그렇게 쓰는걸까요? 예제를 보면 SWI명령을 만나면 소프트웨어 Exception Handler로 이동하 고 복귀번지는 r14_svc로 저장이 됩니다. 그런데 핸들러 부분에서 복귀 번지를 이용하여 해당 명령을 직접 읽어다가 Low 24 Bit 부분을 인수로 해석해서 사용할 수 있는 것입니다. 물론 이런 일들은 ARM7이 해주는 것이 아니라 유저가 핸들러에서 직접 프로그램 하는 것이죠. 다음은 핸들러 부분의 예제입니다. STMFD r13,{r0-r2,r14} LDR r0,[r14,#-4] BIC r0,r0,#0xFF000000 ... 위에서 보시면 결국 r0에 SWI명령의 low 24Bit가 얻어지죠. 오늘 강좌까지... 길고 길었던... 정말 길었던 ARM Instruction 부분을 끝 냈습니다. 계획했던 분량은 3회 였는데... 결국 8회분량으로 늘어나고 말았군요. 이것저것 후회가 많았던 부분이었습니다. 이렇게 저렇게 숙제하듯이 여기까지 해치우고는... 다음엔 뭘 써야할까... 고민을 하게 되는군요. 뭐가 되었든 다음 강좌로 ARM7 강좌를 정리하겠습니다. (마음의 준비를...^^) 그럼 이만.
2007/10/19 - [임베디드/ARM] - ARM7 강좌 [13] : Instruction Set(7) (출처 : 디지털 동호회)
2007/10/19 - [임베디드/ARM] - ARM7 강좌 [12] : Instruction Set(6) (출처 : 디지털 동호회)
2007/10/19 - [임베디드/ARM] - ARM7 강좌 [11] : Instruction Set(5) (출처 : 디지털 동호회)
2007/10/19 - [임베디드/ARM] - ARM7 강좌 [10] : Instruction Set(4) (출처 : 디지털 동호회)
2007/10/19 - [임베디드/ARM] - ARM7 강좌 [9] : Instruction Set(3) (출처 : 디지털 동호회)
2007/10/19 - [임베디드/ARM] - ARM7 강좌 [8] : Instruction Set(2) (출처 : 디지털 동호회)
2007/10/19 - [임베디드/ARM] - ARM7 강좌 [7] : Instruction Set(1) (출처 : 디지털 동호회)
2007/10/19 - [임베디드/ARM] - ARM7 강좌 [6] : Exception(2) (출처 : 디지털 동호회)
2007/10/19 - [임베디드/ARM] - ARM7 강좌 [5] : Exception(1) (출처 : 디지털 동호회)
2007/10/19 - [임베디드/ARM] - ARM7 강좌 [4] : 레지스터 (출처 : 디지털 동호회)
2007/10/19 - [임베디드/ARM] - ARM7 강좌 [3] : ARM7의 구조 (출처 : 디지털 동호회)
2007/10/19 - [임베디드/ARM] - ARM7 강좌 2 개요 (출처 : 디지털 동호회)
Hacked Brain/embeddedland.net