重入函数

时间:2018-12-30 12:22:09

标签: interrupt reentrancy disable

您好,https://www.embedded.com/design/operating-systems/4008268/2/Back-to-the-Basics--Practical-Embedded-Coding-Tips-Part-1的文章中,提到了如何使函数可重入。

long i; 
void do_something(void){ 
    disable_interrupts();
    i+=0x1234; 
    enable_interrupts();
}

Autor告诉:”该解决方案不起作用。如果do_something()是通用例程,可能从许多地方调用,并且在禁用了中断的情况下调用,则将它们重新打开后将返回。计算机的上下文是发生了变化,可能是非常危险的。”

我不完全了解更改计算机上下文的危险性吗?有人可以举个例子说明这可能导致有害后果吗?

1 个答案:

答案 0 :(得分:0)

请注意,do_something()既可以在启用了中断的地方调用,也可以在已经禁用了中断的地方调用。在第二种情况下启用中断会以不同的危险方式违背调用者的期望。

您真正需要的是在禁用中断的同时保存先前的中断状态,然后再将其恢复。

因此,更好的版本是:

long i; 
void do_something(void){ 
    irq_state_t prev_int_state = disable_interrupts_save();
    i+=0x1234; 
    restore_interrupts(prev_int_state);
}