gpt4 book ai didi

c++ - 部分易变变量?

转载 作者:搜寻专家 更新时间:2023-10-31 01:34:42 27 4
gpt4 key购买 nike

假设我有一个带有主循环和 1 毫秒中断的微 Controller (如果你不知道那是什么,它只是一个中断主循环执行的任务,同时它做了一些事情......并且它是 1 毫秒的中断,因为它每毫秒发生一次)。

我有一个变量,用于在主循环和毫秒中断之间进行通信:

volatile status_t Status;

现在我在主循环中有一段代码更新 Status 变量,它对其进行了大量转换:

cli();    // This temporarily turns off interrupts, so we don't 
// modify the variable unsafely
Status.UpdateStuff();
Status.UpdateOtherStuff();
//etc.

sei(); // Turn interrupts back on

问题在于,这些对Status 的函数调用中的每一个都会重写Status......编译器无法在本地内存中缓存Status 的值。

这个问题的一个可能的解决方案是:

cli();
status_t* localStatus = (status_t*)&Status;
localStatus->UpdateStuff();
localStatus->UpdateOtherStuff();
//etc.

Status = *localStatus;
sei();

这里真正的问题是:

这是否会达到我希望的效果,或者是否有更好的方法来解决不断刷新变量的问题,而不是让优化器缓存变量?

最佳答案

您的第二个版本可能仍会多次写入微 Controller ,因为编译器可能没有意识到它可以跨方法调用缓存值(如果方法是内联的,它可能只能确定这一点)。所以我建议制作一个显式的本地拷贝,而不仅仅是一个本地指针。

cli();
status_t localStatus = Status;
localStatus.UpdateStuff();
localStatus.UpdateOtherStuff();
...
Status = localStatus;
sei();

关于c++ - 部分易变变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38799124/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com