У меня определен ISR для запуска по внешнему прерыванию. Внешнее прерывание не всегда может быть включено, но при определенных обстоятельствах я хочу иметь возможность зарегистрировать функцию, которая будет вызываться ONCE, внутри прерывания из основного кода. Функция может быть заменена другой или удалена до следующего прерывания.
Я не знаю много о методах синхронизации на 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
:
lui s1,0x0
ori s1,s1,0x1
addiu at,s1,0
or t0,at,zero
Инструкции для fnc1 = &testfunc
:
lui a2,0x9d00
ori a2,a2,0x50
or a1,a2,zero
sw a1,16376(gp)