在它们之间不中断地复制和重置内存

问题描述

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

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;

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

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

解决方法

在读取掩码变量之前需要禁用中断,清除掩码后,您将再次启用中断。从中断的角度来看,您可以使这个小块成为一种“原子”。

这样,将在两个语句期间服务的中断将挂起直到启用,然后才会被服务。没有中断丢失。

这是一种非常相似的情况,就好像中断发生在第一条语句或第二条语句期间一样。通常这样的语句被编译成多条汇编指令,中断可以在语句的“中间”提供。

这种延迟中断与在第二条语句之后立即服务的中断非常相似。