외부 인터럽트를 트리거하도록 정의 된 ISR이 있습니다. 외부 인터럽트는 항상 활성화되지는 않지만 특정 상황에서는 주 코드 내에서 인터럽트 내에서 ONCE라는 함수를 등록 할 수 있기를 원합니다. 함수는 다른 인터럽트가 있기 전에 다른 것으로 대체되거나 제거 될 수 있습니다.PIC32의 HiTech C에서 함수 포인터를 설정하는 인터럽트 안전한 방법
나는 PIC32에 대한 동기화를위한 기술에 대해 잘 모르겠지만, 나는 다음과 같이 왔어요 : 나는 문제가 있지만 그것에 대해 추론하는 데 문제가
volatile BOOL callbackInterrupted = FALSE;
volatile BOOL callbackWritten = FALSE;
void (*myCallback)() = NULL;
void RegisterCallback(void (*callback)())
{
do
{
callbackWritten = FALSE;
myCallback = callback;
}
while(callbackInterrupted);
callbackWritten = (callback != NULL);
}
void interrupt MyExternalInterrupt() @EXTERNAL_1_VCTR
{
// Do a bunch of other things here...
if(callbackWritten)
{
myCallback();
myCallback = NULL;
callbackInterrupted = TRUE;
callbackWritten = FALSE;
}
}
합니다. 이것이 내가 원하는 바를 실제로 하는가? ISR이 반 설정 함수 포인터를 호출하거나 함수를 두 번 호출하는 것을 방지 할 수 있습니까? do ... while
루프가 불필요한가요? 더 좋은 방법이 있습니까?
추가 :이 인터럽트를 비활성화하는 것은 의문의 여지가 없습니다. 타이밍에 사용됩니다.
지침 flag = TRUE
생성 : fnc1 = &testfunc
생성
lui s1,0x0
ori s1,s1,0x1
addiu at,s1,0
or t0,at,zero
방법 :
lui a2,0x9d00
ori a2,a2,0x50
or a1,a2,zero
sw a1,16376(gp)
두 작업에 대해 디스 어셈블 된 지침을 추가했습니다. 내가 이해하는 한, 그들은 원자가가 아닙니다. – detly
PIC32 명령어 세트는 잘 모르겠지만 안전하다고 생각합니다. fnc = & testfunc는 인터럽트 할 수없는 명령어 인 sw a1, 16376 (gp)에서 발생합니다. 인터럽트 이후에 a1이 복원되기 때문에 그 전에 명령은 a1 레지스터를 설정하는 것 뿐이며 인터럽트 될 수 있습니다. 인터럽트는 sw 명령 전후에서만 발생할 수 있으므로 fnc가 항상 유효하다는 보장이 있습니다. – Jeff
그래서 부울 플래그를 제거하고 단순히'myCallback! = NULL'을 체크 할 수 있습니다 ... 당신은 그 정보로 당신의 대답을 업데이트 할 수 있습니까? – detly