在它们之间不间断地复制和重置内存
Copying and resetting memory without interruption between them
我试图在开始读取和设置输出之前复制我的输入触发掩码,但我怀疑输入中断有时可能发生在下面这两行之间,所以我错过了最后的更改,因为在更改时输入很快,有时输出会保持之前的状态。
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;
目前我没有那个芯片的调试器。
这个理论可能吗?如果是,我该如何解决?
读取掩码变量前需要关闭中断,清空掩码后再次开启中断。从中断的角度来看,您使这个小块有点“原子”。
这样,将在两个语句期间服务的中断将一直挂起,直到启用,然后才会服务。没有中断丢失。
这与中断发生在第一条语句或第二条语句期间非常相似。通常这样的语句被编译成多条汇编指令,中断可以在语句的“中间”服务。
这种延迟中断与在第二条语句之后立即服务的中断非常相似。
我试图在开始读取和设置输出之前复制我的输入触发掩码,但我怀疑输入中断有时可能发生在下面这两行之间,所以我错过了最后的更改,因为在更改时输入很快,有时输出会保持之前的状态。
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;
目前我没有那个芯片的调试器。
这个理论可能吗?如果是,我该如何解决?
读取掩码变量前需要关闭中断,清空掩码后再次开启中断。从中断的角度来看,您使这个小块有点“原子”。
这样,将在两个语句期间服务的中断将一直挂起,直到启用,然后才会服务。没有中断丢失。
这与中断发生在第一条语句或第二条语句期间非常相似。通常这样的语句被编译成多条汇编指令,中断可以在语句的“中间”服务。
这种延迟中断与在第二条语句之后立即服务的中断非常相似。