以下代码有什么问题:
unsigned int *ptr;
ptr=(unsigned int*)0x1234;
*ptr=10;
/*do someting*/
*ptr=100;
重点,我已经阅读了微控制器的存储器映射,程序员可以非常使用这个位置,因此排除了不拥有内存的情况。 我想知道的是,我可以使用上面的方法直接访问内存位置吗?
提前致谢。
答案 0 :(得分:2)
是的没关系,除非(如你所说)你在可访问的内存范围内。
另外我想补充一下,既然你提到了微控制器,如果这是SFR或GPR的地址那么它的别名(使用#define
)必须已经在控制器的头中定义,所以它是更好地使用该别名,以提高可读性/可理解性和可移植性。
编辑:(正如 Vlad 在评论中指出)
使用volatile
可以让您的程序更安全。可靠,因为编译器不会优化立即内存写入,并且您可以确保您编写的值立即写入您想要的位置。
答案 1 :(得分:1)
是的,您可以使用它,但要注意对齐问题。根据您的微控制器可能会发生以下情况:
uint16_t * p1 = (uint16_t *)0x8;
uint16_t * p2 = (uint16_t *)0x9;
*p1 = 1; // Ok
*p2 = 1; // Unaligned access -> Crash or something else
例如,ARM要求16位变量在偶数地址上对齐(可被2整除)。