![](/zbxe/layouts/mr_layouts_1st/images/default/blank.gif)
강좌 & 팁
진보한 프로그래밍 특징과 시스템 동작
1. 두 개의 분리된 스택을 가지고 있는 시스템 동작시키기
V-6-M 아키텍처의 가장 중요한 특징 가운데 하나는 사용자 어플리케이션 스택이 특권/커널 스택과 분리되어 있다는 점입니다.
만약 MPU가 구현되어 있다면, 이것은 메모리 충돌에 의해 커널이 망가지는 일이 없도록 사용자 어플리케이션이 커널 스택 메모리에 접근하지 못하도록 하기 위해 사용됩니다.
전형적으로, Cortex-M3를 기반으로 하는 시스템은 다음과 같은 특징을 가지고 있습니다.
- MSP를 사용하는 익셉션 핸들러
- 태스크 스케줄링 및 시스템 관리를 위해 특권 접근 레벨로 동작하면서 규칙적인 구간에서 SYSTICK 익셉션에 의해 침해되는 커널 코드
- 사용자 접근 레벨을 갖는 쓰레드로 동작하는 사용자 어플리케이션이 어플리케이션들은 PSP를 사용합니다.
- 커널 및 익셉션 핸들러를 위한 스택 메모리는 MSP에 의해 표시되면, 스택 메모리는 MPU가 사용 가능한 경우에만 특권 접근이 가능하도록 표시됩니다.
- 사용자 어플리케이션을 위한 스택 메모리는 PSP에 의해 표시됩니다.
2. 락업 상황
오류 상황이 발생하면 그에 상응하는 결함 핸들러가 트리거될 것입니다. 만약 사용 결함/버스 결함/메모리 관리 결함 핸들러
내에서 또 다른 결함이 발생하면, 하드 결함 핸들러가 트리거될 것입니다. 하지만 하드 결함 내에서 또 다른 결함 핸들러가 발생하면 이때 락업 상황이 발생하는것 입니다.
락업상황에서는 락업 동안에는 프로그램 카운터가 0xFFFFFFFX가 되고, 그 주소에서 페치를 계속합니다 또한 이 상황을 가리키기 위해 Cortex-M3에서 LOCKUP이라고 불리는 출력신호가 발생됩니다. 침 설계자들은 시스템 리셋 발생기에서 리셋을 발생기키기 위해 이 신호를 사용할 수 있습니다.
락업은 다음과 같은 상황에 발생 합니다.
- 결함이 하드 결함 핸들러 내에서 발생할 때
- 결함이 NMI 핸들러 내에서 발생할 때
- 버스 결함이 리셋 과정 동안에 발생할 때
중복 결함 상황에서도 코어는 NMI에 반응하고 NMI 핸들러를 실행시킬 수 있습니다. 하지만 핸들러가 완료된 후에는 프로그램
카운터가 0xFFFFFFFX로 복원되어 락업 상태로 되돌아갈 것입니다. 이 경우 시스템은 락업되고 현재 우선순위 레벨은 -1이 됩니다. 만약 NMI가 발생한다면, NMI가 현재 우선순위 레벨 보다 더 높은 우선순위인 -2를 갖기 때문에 프로세서는 선점을 하여 NMI 핸들러를 실행시킬 것입니다.
NMI가 완료되고 락업 상태로 되돌아가면, 현재 익셉션 우선순위는 -1이 됩니다. 일반적으로 락업에서 나올 수 있는 가장 좋은
방법은 리셋을 수행하는 것입니다. 대안으로는 시스템에 디버거를 연결하여 코어를 중단하고 PC를 다른 값으로 변경하여 그 위치에서 프로그램 실행을 시작하는것이 가능 합니다.
3. 락업 피하기
NMI 또는 하드 결함 핸들러를 개발할 때에는 락업 문제를 방지하기 위해 보다 주의를 기울이는 것이 중요합니다.
예를 들어, 메모리가 정확히 동작하는지 그리고 스택 포인터가 여전히 유효한지 알지 못한다면, 하드 결함 핸들러 안에서 불필요한 스택 접근을 피하는것이 좋습니다. 복잡한 시스템을 개발하는 경우 버스 결함 또는 메모리 결함의 가능한 원인 중 하나는 스택 포인터 충돌 입니다.