안녕 하세요!

 

이번주는 레지스터와 리셋 시퀀스에 대해 설명 하겠습니다.

 

범용레지스터 R0-R7
하위 레지스터로도 불리며 32비트이며 16비트와 32비트 Thumb-2 명령어 들에 의해 모두 접근이 가능합니다.

 

범용레지스터 R8-R12
상위 레지스터로도 불리며 32비트이며 32비트 Thumb-2 명령어에는 접근이 가능 하지만 16비트에 의해서는 접근이 불가능 합니다.

 

스택 포인터 R13
메인 스택포인트는 디폴트 스택 포인터로 OS 커널,익셉션 핸들러, 특권 접근을 요구하는 모든 어플리케이션 코드에 의해 사용됩니다. 프로세스 스택 포인터는 베이스 레벨 어플리케이션 코드에 의해 사용되며, 두 스택 포인터를 사용하는 것은 불필요합니다.

간단한 어플리케이션은 메인스택포인터에만 의존 할 수 있습니다.

 

링크 레지스터 R14
어셈블리 프로그램 안에서 링크 레지스터는 R14 또는 LR로 쓰여 집니다. LR은 서브루틴 또는 함수가 호출될 때, 리턴 프로그램

카운터를 저장하기 위해 사용됩니다.

 

프로그램 카운터 R15
어셈블리 코드 안에서는 R15 또는 PC를 사용하여 접근 할 수 있습니다. Cortex-M3 프로세서의 파이프라인 특석으로 인해 이 레지스터를 읽을 때, 그 값은 실행하고 있는 명령어의 위치에 비해 4만큼 다르다는 사실을 알게 될 것입니다.

 

특별한 레지스터
특별한 레지스터에는 프로그램 상태 레지스터,인터럽트 마슼므 레지스터,제어 레지스터 이렇게 있습니다.
특별한 레지스터들은 MSR과 MRS 명령어를 통해서만 접근 될 수 있습니다.

 

프로그램 상태 레지스터
프로그 레지스터들은 어플리케이션 PSR, 인터럽트 PSR, 실행 PSR이 있습니다.
세 개의 PSR은 특별한 레지스터 접근 명령어인 MSR과 MRS를 사용하여 동시에 또는 분리하여 접근할 수 있습니다.

 

PRMASK, FAULTMASK, BASEPRL 레지스터
익셉션들을 비활성화하기 위해 PRMASK, FAULTMASK, BASEPRI 레지스터들이 사용되며,  사용자 접근 레벨에서는 설정될 수 없습니다.

1.jpg

 

CONTROL 레지스터
CONTROL 레지스터는 특권 레벨과 스택 포인터 선택을 정의하기 위해 사용 됩니다.
이 레지스터는 두 비트를 갖습니다.

 3.jpg

 

CORTEX-M3는 메인 스택 포인터와 프로세스 스택 포인터 두개의 스택 포인터를 가지고 있습니다.
사용되는 SP 레지스터는 제어 레지스터 비트 1에 의해 제어 됩니다.

 

리셋 시퀀스

프로세서가 리셋에서 벗어나면 그것은 메모리에서 두 워드를 읽습니다.

● 주소 0x00000000: R13의 시작 주소

● 주소 0x00000004: 리셋 백터

이것은 전통적인 ARM 프로세서 동작과는 다릅니다. 이전의 ARM 프로세서는 주소 0x0에서 시작하는 프로그램 코드를 실행 했었습니다.
Cortex-M3에서 MSP를 위한 초기값은 메모리맵의 시작에 놓이고, 다음에 벡터 테이블이 놓입니다. 여기에는 벡터 주소값이 포함됩니다.
추가로 벡터 테이블의 내용은 분기 명령어가 아니라 주소값입니다. 벡터 테이블 안에 있는 처 번째 항목은 리셋 벡터 입니다. 이것은 리셋 후 프로세서에 의해 페치 되는 두 번째 종류의 데이터 이며, 테이블 안에 있는 벡터 주소는 그것이 Thumb 코드라는 것을 가리키기 위해 LSB 1로 설정 되게 해야 합니다.

 

오늘은 여기서 끝내도록 하겠습니다.

부족한 점이 있다면 댓글로 말씀해주시고 끝까지 읽어 주셔서 감사 합니다^^;