2009-08-29 7 views
3

IAR 워크 벤치 툴 체인을 사용하는 임베디드 시스템에서 이상한 ARM 예외를 디버깅하고 있습니다. 때때로 예외가 트랩되면 SVC_STACK이 범위를 벗어난 것으로보고됩니다 (범위를 벗어납니다!). 이것이 관련이 있습니까, 아니면 J-Link JTAG 디버거의 아티팩트일까요? SVC_STACK은 무엇을 위해 사용됩니까? 0x1000 크기로 설정되어 있지만 범위를 벗어나면 힙 영역으로 올라갑니다. 감사!ARM9 SVC_STACK 범위를 벗어 났습니까?

답변

4

ARM 예외가 발생하면 SVC 모드로 전환됩니다 (IRQ 또는 FIQ - 고속 IRQ 아님). 또한 비 사용자 모드에서 CPRS 레지스터를 설정하여 코드를 직접 입력 할 수도 있지만 시스템을 초기화 할 때를 제외하고는 드문 경우라고 생각합니다.

예외가 발생하면 프로세서는 SVC 스택으로 전환합니다.이 SVC 스택은 시스템 초기화 초기에 설정해야합니다. 귀하의 초기화 코드가 SVC 스택을 제대로 설정하지 않았거나 예외 핸들러 중 하나가 올바르게 코딩되지 않아서 스택을 파기하고있을 가능성이 있습니다.

세 번째 가능성은 원하는대로 ARM 스택을 설정하는 RTOS를 사용한다는 것입니다 (기본적으로 IAR의 초기화 코드가 설정 될 수있는 SVC 스택을 무시). 이 경우 모든 것이 정상이지만 IAR 디버거는 SVC 스택이 범위를 벗어난다고 생각합니다. 디버거는 링커 구성 파일에서 정보를 가져옵니다.하지만 스택이 다른 메모리 영역으로 변경되면, 디버거가 혼란 스러울 것입니다.

이것은 RTOS를 사용할 때 IAR의 사용자 모드 스택에서 항상 발생합니다. 스택은 디버거가 있어야한다고 생각한 CSTACK 세그먼트에없는 태스크 제어 블록을 기반으로 할당되었으며 디버거 자극적 인 경고를 발행합니다. 경고를 없애기 위해 사용할 수있는 몇 가지 프로젝트 구성 설정이 있었지만, 나는 그것이 무엇인지 궁금하지 않았습니다. 우리는 거의 귀찮게 생각하지 않았으며 단지 소음과 함께 살았습니다.

힙 영역의 스택이 유효한지 확인해야합니다. 명시 적으로 이렇게하는 코드가 없으면 틀릴 수도 있습니다. RTOS 벤더에게 물어볼 필요가있다).

ARM Architecture Reference Manual (ARM ARM)은 arm.com에서 무료로 구할 수 있으며 ARM 스택 작동 방식에 대해 자세히 설명합니다. Andrew Sloss, et al.의 ARM System Developer's Guide도 좋은 참고 자료입니다.

+0

감사합니다. IAR에서 - "EWARM 버전 4.42 용 스택 플러그인은 RTOS를 인식하지 않기 때문에 항상 스택 오버플로에 대해 불평 할 것입니다. RTOS를 사용하는 경우 스택 플러그인을 비활성화해야합니다". Darn - 그랬 으면 좋겠다 - 더 많은 디버그! – Jeff

관련 문제