2009-09-28 2 views
3

EABI 임베디드 PowerPC 응용 프로그램에서 0x500 외부/감소 자 예외를 처리하는 어셈블러 루틴을 작성하고 있습니다.PowerPC에서 외부 예외를 처리 할 때 r1 스택 포인터 사용

내 어셈블러 루틴은 0x500 벡터 점에서 호출하여 'C'에서 핸들러 함수로 분기하기 전에 컨텍스트 저장 레지스터에 일부 메모리를 사용하려고합니다. I) 예외 모델은 이전 명령을하기 전에, 예외 핸들러가 호출 규칙은 먼저 새 기능을 입력에) 스택 포인터 (R1를 업데이트 표시) 및 II를 실행하는 시간에 완료됩니다 보장

때문에 새로운 스택 공간을 사용하여 옮긴 다음 (스택 포인터를 함수의 끝 부분에있는 마지막 위치로 다시 이동)

r1을 사용하면 더 많은 공간을 확보 할 수 있습니다. 예외 처리 루틴의 정상적인 스택은 명시 적으로 호출 규칙을 고수하고 스택을 다시 찾은 다음 SRR0과 SRR1이 수정되지 않았는지 확인합니다.

스택을 처리 할 때 스택을 사용하는 예외를 허용하지 않을 것입니다. 실제로이 방법을 사용하더라도 문제가 있을지는 확실하지 않습니다.

이것이 현명한 접근이라고 생각하십니까? 아니면 예외 처리를 위해 별도의 스택을 사용해야합니까? 나는 이것이 자신의 문제를 가져올지도 모른다라고 생각하고있다.

답변

5

임베디드 시스템은이 두 가지를 수행합니다. 스택 포인터가 항상 유효한 프레임을 가리키고 스택에 새로운 프레임을위한 공간이있을 것이라는 것을 완전히 확신한다면, 계속해서 사용하십시오. 스택 포인터가 항상 유효하지 않을 가능성이있는 경우 이전 스택 포인터 (일반적으로 SPRG에 있음)를 저장하고 직접 스택 포인터를 설정해야합니다.

소프트웨어 오류를 감지하기 위해 데이터 액세스 예외를 처리하려는 경우 DACC가 깨진 스택 포인터로 인해 발생할 수 있으므로 자체 예외 스택을 설정해야합니다.

1

스택의 레지스터 컨텍스트를 저장할 때 볼 수있는 유일한 단점은 스택 오버플 로인 예외 중 하나가 발생할 수 있다는 것입니다.

+0

:-) 다행히 스택에 약 98 %의 여유 공간이 있습니다. 보드가 실행되도록 설계된 것보다 훨씬 간단한 프로그램입니다. – sparklewhiskers

1

문제점없이 현재 스택에 현재 컨텍스트를 저장했습니다.

반환하려는 예외와 반환 할 수없는 "치명적인 오류"예외를 구별해야합니다. 그렇지 않으면 스택을 신뢰할 수 없습니다. 반환하지 않으려면 두 가지 옵션이 있습니다. 스택을 다시 시작하고 모든 것을 버리거나 일반 스택을 인쇄 할 수 있도록 예외 스택에 대한 RAM 스위치가 더 많아 지거나 ...

+0

예, 다른 유형의 예외에 대한 내용을 복사합니다. 이 메서드를 사용하여 처리 할 계획 인 유일한 예외는 외부 예외입니다. 제 경우에는 '좋은'예외입니다. – sparklewhiskers

관련 문제