c-在不中断的情况下复制和重置内存



在开始读取和设置输出之前,我试图复制我的输入触发器掩码,但我怀疑输入中断有时会发生在下面的这两行之间,所以我错过了最后一次更改,因为当快速更改输入时,有时输出会保持在以前的状态。

trigger_mask_t tmask = gpio_trigger_mask;
gpio_trigger_mask.bits = 0;
if (!tmask.bits)
// reading the inputs and setting the outputs here.

我的中断功能:

void gpioCbFxn(PIN_Handle handle, PIN_Id pinId)
{
for (uint8_t i = 0; i < sizeof(GPIO_tab); i++)
{
if (pinId == GPIO_tab[i])
{
gpio_trigger_mask.bits |= (1 << i);
return;
}
}
}

我的触发器掩码结构:

typedef struct {
uint16_t IN1 : 1,
IN2 : 1,
IN3 : 1,
...;
} trigger_mask_fields_t;
typedef union {
trigger_mask_fields_t fields;
uint16_t bits;
} trigger_mask_t;

目前我还没有该芯片的调试器。

这个理论可能吗?如果是,我该如何解决?

在读取掩码变量之前,需要禁用中断,清除掩码后,将再次启用中断。你把这个小方块做成一种";原子";从中断的角度来看。

这样,在两个语句中都会提供的中断将一直挂起,直到启用,然后才提供。没有中断丢失。

这是一种非常类似的情况,就好像中断发生在第一个语句或第二个语句期间一样。通常这样的语句被编译成多个汇编指令;在中间";声明。

这种延迟的中断与紧接在第二条语句之后提供的中断非常相似。

最新更新