gpt4 book ai didi

c - 在 PIC32 上的 HiTech C 中设置函数指针的中断安全方法

转载 作者:行者123 更新时间:2023-12-04 06:59:09 28 4
gpt4 key购买 nike

我定义了一个 ISR 来触发外部中断。外部中断可能并不总是启用,但在某些情况下,我希望能够在主代码中的中断内注册一个要调用一次的函数。在下一次中断之前,该函数可能会被另一个函数替换或删除。

我不太了解 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)

最佳答案

假设设置 bool 是一个原子操作(反汇编并阅读手册以确保) - 我会使用一个标志来设置函数指针,但是这个标志只能由 ISR 读取,并且只能由普通代码写入,给出你是一个简单的信号量。如果写入函数指针是原子的(再次通过反汇编检查),则可以使用它代替标志。

像这样(在我的头顶上)

void (*myCallback)() = NULL;        

void RegisterCallback(void (*callback)())
{
myCallback = callback;
}

void interrupt MyExternalInterrupt() @EXTERNAL_1_VCTR
{
// Do a bunch of other things here...

if (myCallback!=NULL)
myCallback();
myCallback = NULL;
}

编辑
看到反汇编指令后,使用函数指针作为标志就可以了。修改代码以显示用法。

关于c - 在 PIC32 上的 HiTech C 中设置函数指针的中断安全方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2152974/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com