ARM 아키텍처는 스택 오퍼레이션을 수행하기 위해 다중-레지스터 전송 명령어를 사용하고 있다. 팝(pop) 동작(스택에서 데이터를 제거하는 일)을 위해 LDM 명령어를 사용하며, 푸시(push) 동작(스택에 데이터를 집어넣는 일)을 위해서는 STM 명령어를 사용한다. 스택을 사용할 때에는 스택을 메모리 위쪽으로 증가시킬 지 아래쪽으로 증가시킬 지를 결정해야 한다. 스택은 ascending(A)이나 descending(D) 중 하나이다. ascending 스택은 메모리의 상위 주소 방향으로 스택이 자라는 것을 말하며, descending 스택은 메모리의 하위 주소 방향으로 스택이 자라는 것을 의미한다.
full 스택(F)을 사용하는 경우, 스택 포인터 sp는 마지막으로 사용된 위치의 주소(예를 들어, sp는 스택상에 마지막 아이템을 가르킴)를 가르키고 있다. 반면 empty 스택(E)은 sp가 처음 사용되지 않을 영역의 주소(예를 들어, 스택의 마지막 아이템 다음의 빈공간)를 가르키고 있다.
스택을 처리하기 위해 보번해야 되는, 스택 베이스, 스택 포인터, 스택 리미트의 3개의 인자가 있다. 스택 베이스는 메모리에서 스택의 시작 위치를 나타낸다. 스택 포인터는 초기에는 스택 베이스를 가리키지만, 데이터가 스택으로 들어가면 스택 포인터는 메모리의 하단으로 이동하여 스택의 가장 맨 위를 계속 가르키고 있다. 스택 포인터가 스택 리미트를 넘어가면 스택 오벼플로우 에러가 발생된다.
2008년 7월 28일 월요일
2008년 7월 21일 월요일
ARM 프로세서 모드
프로세서 모드는 어떤 레지스터가 활성화 되고, cpsr 레지스터를 액세스 할 수 있는 권리를 갖게 될 지를 결정한다. 각 프로세서 모드는 특권 모드일 수도 있고 일반 모드일 수도 있다. 특권모드란 CPSR를 완전히 읽고 쓸 수 있는 모드를 말한다. 반면, 일반 모드에서는 cpsr의 제어 필드는 읽기만 가능하고, 상태 플래그는 읽고 쓰기가 모드 가능하다.
프로세서 모드에는 6개의 특권모드(abort, FIQ, IRQ, supervisor, system, undefined)와 하나의 일반모드(user),즉 전체적으로 7개의 모드가 있다.
프로세서는 메모리 액세스가 실패했을 경우, abort모드로 진입한다. FIQ와 IRQ모도는 ARM 프로세서에서 사용할 수 있는 2가지의 인터럽트 레벨을 위한 모드이다.
supervisor 모드는 프로세서에 리셋이 걸렸을 때에 진입하는 모드로, 일반적으로 운영체제 커널이 동작하는 모드이다. system 모드는 user 모드의 특수한 버전으로 cpsr을 완전히 읽고 쓸 수 있다. undefined 모드는 프로세서가 정의되지 않은 명령어나 지원되지 않은 명령어를 만났을 때에 진입하는 모드이고, user 모드는 프로그램과 어플리케이션을 위해 사용되는 모드이다.
프로세서 모드에는 6개의 특권모드(abort, FIQ, IRQ, supervisor, system, undefined)와 하나의 일반모드(user),즉 전체적으로 7개의 모드가 있다.
프로세서는 메모리 액세스가 실패했을 경우, abort모드로 진입한다. FIQ와 IRQ모도는 ARM 프로세서에서 사용할 수 있는 2가지의 인터럽트 레벨을 위한 모드이다.
supervisor 모드는 프로세서에 리셋이 걸렸을 때에 진입하는 모드로, 일반적으로 운영체제 커널이 동작하는 모드이다. system 모드는 user 모드의 특수한 버전으로 cpsr을 완전히 읽고 쓸 수 있다. undefined 모드는 프로세서가 정의되지 않은 명령어나 지원되지 않은 명령어를 만났을 때에 진입하는 모드이고, user 모드는 프로그램과 어플리케이션을 위해 사용되는 모드이다.
2008년 7월 17일 목요일
ARM 인터럽트 컨트롤러
주변 장치나 디바이스가 실행되려고 할 때, 이것은 프로세서에게 인터럽트를 발생시킨다. 인터럽트 컨트롤러란 인터럽트 컨트롤러 레지스터 안에 있는 해당 비트를 1로 설정함으로써 특정 시간에 어떤 주변 장치나 디바이스가 프로세서에게 인터럽트를 발생시킬수 있도록 할 지에 대한 소프트웨어 정책을 제공한다.
ARM 프로세서에서 사용할 수 있는 2가지 인터럽트 컨트롤러로는 표준 인터럽트 컨트롤러와 백터 인터럽트 컨트롤러(VIC, Vector Interrupt Controller)가 있다.
표준 인처럽트 컨트롤러는 외부 다바이스가 서비스를 요청하면, 그 인터럽트 신호를 프로세서 코어에게 보낸다. 이 컨트롤러는 각 디바이스나 디바이스 세트의 요청을 무시할지, 수렴할 지에 대해 프로그램적으로 설정할 수 있다. 인터럽트 핸들러는 인터럽트 컨트롤러 안에 있는 디바이스 비드맵 레지스터를 읽은 후 어떤 디바이스가 서비스를 요청 했는지를 결정한다.
VIC는 표준 인터럽트 컨트롤러보다 강력한 기능을 가지고, 인터럽트에 우선순위를 부여하여 어떤 디바이스가 인터럽트를 발생시켰는지를 쉽게 결정할 수 있다. VIC는 운선순위와 각 인터럽트에 대한 핸들러 주소를 살펴본 후, 새로운 인터럽트가 현재 실행되고 있는 인터럽트 핸들러보다 우선순위가 높은 경우에만 프로세서에게 인터럽트 신호를 보낸다. VIC는 다비이스를 위한 핸들러 주소를 읽어들이기 위해 표준 인터럽트 익셉션 핸들러를 호출하거나 디바이스를 위해 직접 핸들러로 분기한다.
ARM 프로세서에서 사용할 수 있는 2가지 인터럽트 컨트롤러로는 표준 인터럽트 컨트롤러와 백터 인터럽트 컨트롤러(VIC, Vector Interrupt Controller)가 있다.
표준 인처럽트 컨트롤러는 외부 다바이스가 서비스를 요청하면, 그 인터럽트 신호를 프로세서 코어에게 보낸다. 이 컨트롤러는 각 디바이스나 디바이스 세트의 요청을 무시할지, 수렴할 지에 대해 프로그램적으로 설정할 수 있다. 인터럽트 핸들러는 인터럽트 컨트롤러 안에 있는 디바이스 비드맵 레지스터를 읽은 후 어떤 디바이스가 서비스를 요청 했는지를 결정한다.
VIC는 표준 인터럽트 컨트롤러보다 강력한 기능을 가지고, 인터럽트에 우선순위를 부여하여 어떤 디바이스가 인터럽트를 발생시켰는지를 쉽게 결정할 수 있다. VIC는 운선순위와 각 인터럽트에 대한 핸들러 주소를 살펴본 후, 새로운 인터럽트가 현재 실행되고 있는 인터럽트 핸들러보다 우선순위가 높은 경우에만 프로세서에게 인터럽트 신호를 보낸다. VIC는 다비이스를 위한 핸들러 주소를 읽어들이기 위해 표준 인터럽트 익셉션 핸들러를 호출하거나 디바이스를 위해 직접 핸들러로 분기한다.
2008년 7월 16일 수요일
ARM 버스
임베디드 시스템은 x86 PC를 위해 설계된 것과는 다른 버스 체계를 사용하고 있다. 임베디드 디바이스는 칩 내부 보스를 사용하는데, 이 버스는 칩 내부에 위치하여, 다른 주변 장치가 ARM 코어와 내부에서 연결될 수 있도록 해준다.
버스에 연결될 수 있는 디바이스에는 두 종류가 있다. ARM 프로세서 코어는 버스 마스터이다. 버스 마스터란 다른 디바이스로 데이터를 전송할 수 있는 논리 장치를 말한다. 주변 장치는 버스 슬레이브처럼 동작하는데, 이는 버스 마스터로부터 전송 요청이 있을 때에만 동작한다.
버스 아키텍처는 두 단계로 구성되어 있다. 하나는 전기적인 특성과 버스폭(16, 32, 64비트)를 담당하는 물리적인 단계이며, 다른 하나는 프로토콜 처리 단계이다. 프로토콜이란 츠로세서와 주변 장치간의 통신을 담당하는 논리적인 규칙이다.
버스에 연결될 수 있는 디바이스에는 두 종류가 있다. ARM 프로세서 코어는 버스 마스터이다. 버스 마스터란 다른 디바이스로 데이터를 전송할 수 있는 논리 장치를 말한다. 주변 장치는 버스 슬레이브처럼 동작하는데, 이는 버스 마스터로부터 전송 요청이 있을 때에만 동작한다.
버스 아키텍처는 두 단계로 구성되어 있다. 하나는 전기적인 특성과 버스폭(16, 32, 64비트)를 담당하는 물리적인 단계이며, 다른 하나는 프로토콜 처리 단계이다. 프로토콜이란 츠로세서와 주변 장치간의 통신을 담당하는 논리적인 규칙이다.
RISC의 특징
RISC란 매우 빠른 속도로 한 클럭 안에 실행될 수 있는 간결하면서도 막강한 명령어들을 가지고 있는 아키텍처를 말한다. RISC는 하드웨어에 의해 수행되는 명령어들의 복잡도를 줄이는 것을 목표로 하고 있는데, 그 이유는 하드웨어보다는 소프트웨어에 유연성과 기능성을 제공하는 것이 보다 유리하기 때문이다. 결과적으로 RISC는 컴퍼일러에 더욱 의존하게 되었다. RISC는 다음 4가지의 설계 방식을 기본으로 한다.
1. 명령어
RISC 프로세서는 상대적으로 적은 수의 명령어군을 가지고 있다. 컴파일러와 프로그래머는 간단한 명령어 몇 개를 조합하여 복잡한 연산들을 구현하다.
2. 파이프라인
명령어는 파이프라인에 의해 병렬로 실행될 수 있는 작은 단계로 쪼게져 실행된다. 이상적인 파이프라인에서는 한 사이클에 각 명령어를 한 단계씩 앞서 처리하고, 명령어들을 한 파이프라인 단계에서 해독될 수 있다.
3.레지스터
RISC 프로세서는 거대한 레지스터군을 가지고 있으며, 이 레지스터에는 데이터와 주소가 저장될 수 있다. 레지스터들은 모든 데이터 처리 동작을 위해 사용되는 빠른 로컬 메모리처럼 동작한다.
4. 로드-스토어(Load-Store) 아키텍처
프로세서는 보통 레지스터 안에 저장되어 있는 데이터를 이용하여 어떤 동작을 수행한다.메모리에서 레지스터로 데이터를 읽어 들일때에는 로드 명령어를, 레지스터에서 메모리로 데이터를 저장할 때에는 스토어 명령어를 사용한다.
1. 명령어
RISC 프로세서는 상대적으로 적은 수의 명령어군을 가지고 있다. 컴파일러와 프로그래머는 간단한 명령어 몇 개를 조합하여 복잡한 연산들을 구현하다.
2. 파이프라인
명령어는 파이프라인에 의해 병렬로 실행될 수 있는 작은 단계로 쪼게져 실행된다. 이상적인 파이프라인에서는 한 사이클에 각 명령어를 한 단계씩 앞서 처리하고, 명령어들을 한 파이프라인 단계에서 해독될 수 있다.
3.레지스터
RISC 프로세서는 거대한 레지스터군을 가지고 있으며, 이 레지스터에는 데이터와 주소가 저장될 수 있다. 레지스터들은 모든 데이터 처리 동작을 위해 사용되는 빠른 로컬 메모리처럼 동작한다.
4. 로드-스토어(Load-Store) 아키텍처
프로세서는 보통 레지스터 안에 저장되어 있는 데이터를 이용하여 어떤 동작을 수행한다.메모리에서 레지스터로 데이터를 읽어 들일때에는 로드 명령어를, 레지스터에서 메모리로 데이터를 저장할 때에는 스토어 명령어를 사용한다.
2008년 7월 15일 화요일
MOBM(Mini OEM Boot Module)
MOBM(Mini OEM Boot Module)은 NAND Flash를 동작시키기 위한 소스이다. NAND Flash는 NOR Flash 처럼 0x0000_0000 번지에서 실행 할수 없다. NOR Flash는 주소로 구성되어 직접전근을 할 수 있으나, Nand Flash는 명령어 체계를 이용하여 Block과 Page단위로 접근하기 때문에 실행코드가 바로 수행되지 못한다. 또한 NAND Flash의 블력크기는 Small Block인 경우 16KB, Large Block인 경우에는 64KB정도의 크기 밖에 안 된다. 따라서 부트로더의 크기가 200KB 이상인 경우 0번 블럭에 다 복사하지 못한다. MOBM은 부팅시 필요한 기본적인 기능들 만 구현된것을 말한다. 또한 NAND Flash에 있는 loader를 internal SRAM 및 메모리로 복사하고, 제어권을 넘겨주는 역활을 한다.
2008년 7월 11일 금요일
소프트웨어에서의 하드웨어 접근방법
소스트웨서에서 하드웨어는 메모리로 인식된다. 프로그램은 주변기기로부터 값을 읽거나 프로그램에서 처리한 결과를 주변기기로 출력한다. 이러한 동작을 마이크로프로세서 입장에서 본다면 외부에서 데이터가 입력되거나 외부로 데이터를 출력하는 과정이며, 이러한 입출력을 중간에서 연결지어주는 것이 바로 입출력포트이다. 그러므로 프로그램에서는 입출력포트에서 사용할 메모리를 지정하고, 지정된 메모리에 값을 읽거나 쓰면 된다. 데이터 시트는 보드를 구성하는 하드웨어와 마이크로프로세서를 제어하는 정보들을 담고 있다. 특히 어떤 장치를 사용하려면 어떤 레지스터를 등록해야 하고, 어떤 값을 써야 하는지에 대한 정보를 제공받아야 한다.
피드 구독하기:
글 (Atom)