저는 프리 스케일 MPC5534 컨트롤러를 기반으로 개발 프로젝트를 진행하고 있습니다.
ISR (이미 있음) 중에 함수에서 액세스 할 수있는 변수에 두 개의 특수 함수 레지스터 (즉 SRR0 및 SRR1)의 값을 저장해야합니다. 기존 ISR에 대한 어셈블리 코드는 다음과 같은 :특수 함수 레지스터에서 변수에 값 저장
lis r0,0x_value1
ori r0,r0,0X_value2
mfSPEFSCR r3
and r0,r0,r3
mtSPEFSCR r0
lis r3,[email protected]
ori r3,r3,[email protected]
mtlr r3
li r3,0x_value3
blrl
rfi
:
무엇 나를 괴롭게하는 것은lis r0,0x_value1
ori r0,r0,0X_value2
mfSPEFSCR r3// move from SPEFSCR register
and r0,r0,r3
mtSPEFSCR r0 //move to SPEFSCR register
lis r3,[email protected]
ori r3,r3,[email protected]
mtlr r3
mfsrr0 r4 //copy srr0 to r4
mfsrr1 r5 //copy srr1 to r5
li r3,FPU_RESET
blrl
rfi
, 내가 어떻게 알 수 있습니까 레지스터 r4와 r5가 이미 다른 함수들에 의해 사용중이라면 (다른 프로젝트 파일에 접근 할 수 없다는 말)? 그렇다면 제 접근 방법이 맞습니까? 이 ISR에 대한 스택 프레임을 명시 적으로 만들어서 r4와 r5를 푸시하고 터뜨려서 레지스터 충돌이 발생하지 않도록해야합니까? 그것은 의미가 있습니까?
지금은 파일을 컴파일하고 볼 수있는 위치에 없습니다.
일반적으로 freescale 또는 powerPC에서 작업 한 사람이면 누구든지 나를 도울 수 있습니다. 미리 감사드립니다.
, R4 및 R5는 인터럽트에 적재되지 않은에서 :
이것은 내가 언급 된 애플리케이션 노트입니다. 그렇다면 이전 값을 쌓기 전에 어떻게 사용합니까? 나는 그 문제가 PowerPC와 어떻게 관련되어 있는지 보지 못했다. 일반적으로 CPU에 상관없이 ISR 내부에서 임의의 CPU 레지스터에 쓸 수는 없습니다. – Lundin
모든 어셈블러 코드를 사용해야하는 이유는 무엇입니까? 왜 C 또는 C++ 컴파일러가 프레이밍을 생성하고 내장 함수를 사용하게할까요? – Olaf