在另一个模块中定义了一个常量全局变量。
我想在运行时操作这个变量(因为我无法在其他模块中更改并删除 const 关键字)。
我知道常量被放入 ROM 中...
代码将被下载到微 Controller (leopard powerpc 5643),因此我认为常量将位于闪存(而不是普通的 PC ROM)中
我尝试过类似的方法,但编译器在编译过程中产生了错误:
const int global_Variable = 0;
const int* ptr = &global_Variable;
*ptr = 5;
那么,您知道还有其他方法可以实现这一目标吗?
最佳答案
如果您知道常量确实被放入您平台上的 ROM(或者更可能是闪存)中,那么您当然无法修改它,至少不能直接修改它。
如果它是闪存,您可能,但是您必须更深入地研究,因为重新编程闪存不能仅通过写入来完成,您必须删除相关部分,并且通常需要处理 block /扇区大小限制。不会很漂亮。
您的实际代码无法编译,因为您无法通过 const 指针进行编写(毕竟,这就是 const 的要点)。您可以放弃它并强制编译器生成写入,但是如果目标地址指向不可写内存,它当然不会工作:
const int global_Variable = 0;
int *ptr = (int *) &global_Variable; /* Cast away the const. */
*ptr = 5; /* Do the write! */
同样,如果 global_Variable
位于不可写内存中,则此将不起作用。您将得到未定义的结果。
最后,这太明显了,我什至没有想到要写它:你正在做的事情听起来像是一个非常糟糕的主意。显然,您正在开发的软件是在假设global_Variable
恒定的情况下设计的。你试图覆盖设计的特定部分,如果你成功了,这很可能会破坏很多东西。换句话说:考虑不这样做。
关于更改常量全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26626331/