在另一个模块中定义了一个常量全局变量。
我想在运行时操作这个变量(因为我无法在其他模块中更改并删除const关键字)。
我知道常量放在ROM中......
代码将下载到微控制器(leopard powerpc 5643),所以我认为常量将存在于闪存中(不是普通的PC ROM)
我尝试了类似的东西,编译器在编译期间产生了错误:
const int global_Variable = 0;
const int* ptr = &global_Variable;
*ptr = 5;
那么,你知道其他任何方法吗?
答案 0 :(得分:4)
如果您知道该常量确实存放在您的平台上的ROM(或更可能是闪存)中,那么您当然无法修改它,至少不能直接修改它。
如果它是闪存,你可能,但由于重新编程闪存不完成,你将不得不深入潜水只需写入它,您必须擦除相关部分,并且通常有块/扇区大小限制要处理。它不会很漂亮。
您的实际代码无法编译,因为您无法通过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
常量。你试图推翻设计的那个特定部分,如果你成功的话很可能会破坏很多东西。换句话说:考虑不要这样做。
答案 1 :(得分:0)
如果您设法将global_variable
放在可写的内存区域中,可以使用以下方法更改其值。请注意,如果global_variable
在物理上无法写入,则无法使用此功能,例如:因为它位于ROM区域。
int *ptr = (int*)&global_variable; /* the compiler will warn you about this */
*ptr = 5;
请注意,您可能会遇到其他问题,因为编译器可能会认为声明为const
的变量的内容在程序运行时期间不会更改。你通过改变变量的值来违反这个断言,所以期待奇怪的结果。