![](/zbxe/layouts/mr_layouts_1st/images/default/blank.gif)
강좌 & 팁
안녕 하세요.
이번주는 벡터 테이블과 결함 익셉션에 대해 설명 하겠습니다.
1. 벡터 테이블
인셉션이 발생하여 Cortex-M3에 의해 처리 될 때, 프로세서는 익셉션 핸들러의 시작 주소를 알아야 합니다.
이 정보는 벡터 테이블 안에 저장 됩니다. 디폴트로 벡터 테이블은 주소 0에서 시작되며, 익셉션 번호의 4배씩 벡터 주소가
배정 됩니다.
(전원이 공급된 후의 익셉션 벡터 테이블)
주소 0x0이 부트 코드이어야 하기 때문에 보통 그것은 플래시 메모리 또는 Rom 소자 안에 있게 되며, 그 값은 동작중 변경될
수 없습니다.
하지만 벡터 동작중에 핸들러를 변경할 수 있도록 하기 위해, Ram이 위치한 Ram 영역 또는 코드 내의 다른 메모리 위치로
재배치될 수 있습니다.
이것은 벡터 테이블 오프셋 레지스터라고 블리는 NVIC 안에 레지스터를 설정함으로써 수행됩니다. 그 주소 오프셋은 벡터
테이블 크기로 정렬되어야 하며, 2의 승수로 확장되어야 합니다.
(벡터 테이블 오프셋 레지스터)
익셉션 핸들러를 동적으로 변경해야 하는 어플리 케이션에서는 부트 이미지의 시작에 다음과 같은 것들을 가지고 있어야 합니다.
●초기 메인 스택 포인터값
●리셋 벡터
●NMI 벡터
●하드 결함 벡터
부팅 과정중에 NMI와 하드 결함이 발생할 수도 있기 때문에 이것들이 요구되는 것입니다.
다른 익셉션들은 그것이 활성화될 때까지 발생될 수 없습니다.
부팅 과정이 수행되면 새로운 벡터 테이블 SRAM의 일부를 정의하고 벡터 테이블을 쓸 수 있는 새로운 곳으로 재배치합니다.
2. 결함 익셉션
많은 시스템 익셉션은 결함 처리를 위해 유용하다. 결함에는 여러 가지 종류가 있습니다.
●버스 결함
●메모리 결함
●사용결함
●하드결함
2.1 버스 결함
AHB 인터페이스에서 전송을 하는 동안 오류 반응을 얻는 경우, 버스 결함이 발생합니다. 이것은 다음 단계에서 발생할 수
있습니다.
●명령어 패치, 보통 prefetcb abort라고 불린다.
●데이터 읽기/쓰기, 보통 data abort라고 불린다.
Cortex-M3에서 버스 결함은 다음의 과정 동안에서도 발생할 수 있습니다.
●인터럽트 처리 전에 스택 PUSH 스태킹 오류라고 불린다.
●인터럽트 처리 끝에서 스택 POP 언스태킹 오류라고 불린다.
●프로세서가 인터럽트 처리 과정을 시작할 때, 인터럽트 벡터 주소를 읽는 동안
이러한 종류의 버스 결함이 발생할 때 만약 버스 결함 핸들러가 활성화되어 있고 동일하거나 더 높은 우선순위를 가진 다른
익셉션이 동작하고 있지 않다면, 버스 결함 핸들러가 실행될 것이다. 만약 버스 결함 핸들러가 활성화되어 있지만, 코어가 더 높은 우선순위를 갖는 또 다른 익셉션 핸들러를 동시에 받아들였다면, 버스 결함 핸들러는 펜딩될 것입니다.
마지막으로 버스 결함 핸들러가 활성화되어 있지 않거나 버스 경함보다 더 높거나 동일한 우선순위를 갖는 익셉션 핸들러에서
버스 결함이 발생할 때에는 대신 하드 결함 핸들ㅇ러가 실행될 것이다. 만약 하드 결함 핸들러가 실행되고 있는 동안 또 다른 버스 결함이 발생한다면 코어는 락업 상태로 진입할 것입니다.
버스 결함 핸들러를 활성화하기 위해서는 NVIC 안에 있는 시스템 핸들러 제어 및 상태 레지스터 안에 있는 BUSFAULTENA 비트를 1로 설정해야 합니다. 그것을 수행하기 전 벡터 테이블 RAM에 재배치되어 있다면 벡터 테이블 안에 버스 결함 핸들러 시작
주소가 설정되어 있는지 확인 하면 됩니다.
2.2 메모리 관리 결함
메모리 관리 결함은 MPU에서의 성절을 참해하는 메모리 접근이나 어떤 불합리한 접근에 의해 야기될 수 있으며, MPU 결함의
일부는 다음과 같은 것들을 포함합니다.
●MPU 설정에서 정의되지 않은 메모리 영역으로의 접근
●읽기 전용 영역으로의 쓰기
●특권 접근만 가능하도록 정의된 영역에 사용자가 상태에서 접근할 때
메모리 관리 결함이 발생할 때 메모리 관리 결함 핸들러가 활성화된다면, 메모리 관리 결함 핸들러가 실행될 것입니다.
만약 더 높은 우선순위의 익셉션과 동시에 결함이 발생한다면 다른 익셉션이 먼저 처리되고 메모리 관련 결함은 펜딩될 것입니다.
만약 프로세서가 동일하거나 더 높은 우선순위의 익셉션 핸들러를 이미 실행하고 있거나 메모리 관리 결함 핸들러가 활성화되어 있지 않다면 하드 결함 핸들러가 대신 실행됩니다. 만약 메모리 관리 결함이 하드 결함 핸들러 또는 NMI 핸들러 안에서 발생한다면, 프로세서는 락업 상태에 진입할 것입니다.
2.3 사용 결함
사용 결함은 여러가지 원인들로 인해 야기될 수 있습니다.
●정의되지 않은 명령어
●코프로세서 명령어
●ARM 상태의 전환을 시도
●유효하지 않은 인터럽 리턴
●다중 로드/스토어 명령어를 사용할 때 정렬되지 않은 메모리 접근
NVIC 안에 어떤 제어 비트를 설정함으로써 사용 결함을 발생시키는 것도 가능합니다.
●0으로 나눔
●어떤 정렬되지 않은 메모리 접근
2.4 하드결함
하드 결함 핸들러는 사용 결함, 버스 결함, 메모리 관리 결함이 실행될 수 없을 경우 그 결함들에 의해 야기될 수 있습니다.
또한 그것은 벡터 페치를 하는 동안 버스 결함에 의해서도 야기될 수 있습니다.