2011-11-11 2 views
1

내 코드에서 컨트롤이 인터럽트 서비스 루틴에서 일부 X 함수로 점프하고 있습니다. 해당 X 함수를 실행 한 후 반환해야 할 위치를 모르기 때문에 초기화가 수행됩니다. 인터럽트 서비스 루틴에서 함수 X로 점프 할 때주의해야 할 레지스터를 알려주시겠습니까?함수의 반환 주소를 아는 방법?

시나리오 :

Function m() { 
    Function x(); 
} 

Function x() { 
    Step1: 
    Step2:call Function Y(); 
    Step3: 
} 

Function y() { 
    Step1:Enable interrupt; 
    Step2:call function z(); 
    step3:disable interrupt; 
} 

interrupt() { 
    Step1:Jump Step 3 of function x(); 
} 

설명 : 기능 Z 그래서 난 그 시간 초과를 달성하기 위해 타이머 인터럽트를 사용하고 약간의 시간 기간 내에서 실행해야합니다. 나는 3 단계의 함수 x()를 인터럽트 서비스 루틴에서 제공하여 특정 시간 간격 (점프가 PC 주소 변경으로 이루어짐) 후에 제어가 돌아올 수 있도록합니다.

하드웨어 : NEC V850E2 프로세서, GHS 컴파일러. 소프트웨어 : GHS compilers는 GCC 매우 호환되는 경우 (그들이 주장하는 것처럼) C.

+2

ISR을 사용하여 Z() 실행을 "종료"하고 컨트롤을 X()로 복원한다고 말하는가? 이것은 까다 롭습니다. 일반적으로 스택을 푸는 것이 필요합니다. 또는 setjmp 및 longjmp를 조사 할 수도 있습니다. –

+0

예 이해가 정확합니다 .. 조금 까다 롭습니다 만 그 중 하나를해야합니다 ... – Devi

답변

2

를 내장, 그들은 GCC __builtin_return_address가있을 수 있습니다 (그러나 이것은 표준 및 GCC 특정하지 않습니다).

타겟 시스템이 최근의 GCC에서 지원 될 수 있습니까? 그렇다면 소스 코드에서 GCC를 빌드 할 가치가 있습니다.

그렇지 않으면 자신의 어셈블리 코드를 작성해야합니다.

+0

죄송합니다 ... GHS와 GCC는 모두 완전히 다른 컴파일러입니다 ... 그 기능을 사용할 수 없습니다 ... – Devi

관련 문제