您好,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()是通用例程,可能从许多地方调用,并且在禁用了中断的情况下调用,则将它们重新打开后将返回。计算机的上下文是发生了变化,可能是非常危险的。”
我不完全了解更改计算机上下文的危险性吗?有人可以举个例子说明这可能导致有害后果吗?
答案 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);
}