0

您好,来自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() 是一个通用例程,可能从许多地方调用,并且在禁用中断的情况下调用,它会在重新打开它们后返回。机器的上下文发生了变化,可能在很短的时间内危险的方式。”

我不明白究竟是如何改变机器的上下文是危险的?有人可以举一些例子来说明这可能导致有害后果吗?

4

1 回答 1

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);
}
于 2018-12-30T12:47:07.993 回答