以下代码有什么问题:
unsigned int *ptr;
ptr=(unsigned int*)0x1234;
*ptr=10;
/*do someting*/
*ptr=100;
提示点,我已经阅读了单片机的内存映射,并且这个位置可以被程序员非常多地使用,所以排除了不拥有内存的情况。我想知道的是,我可以使用上述方法直接访问内存位置吗?
提前致谢。
以下代码有什么问题:
unsigned int *ptr;
ptr=(unsigned int*)0x1234;
*ptr=10;
/*do someting*/
*ptr=100;
提示点,我已经阅读了单片机的内存映射,并且这个位置可以被程序员非常多地使用,所以排除了不拥有内存的情况。我想知道的是,我可以使用上述方法直接访问内存位置吗?
提前致谢。
是的,这很好,除非(如您所说)您在可访问的内存范围内。
另外我想补充一点,因为您提到了微控制器,如果这是 SFR 或 GPR 的地址,那么它的别名(使用#define
)必须已经在控制器的标头中定义,所以最好使用该别名,以改进可读性/可理解性和可移植性。
编辑:(正如弗拉德在评论中指出的那样)
使用volatile
将使您的程序更加安全可靠,因为编译器不会优化立即内存写入,并且您可以确保您写入的值立即写入您想要的位置。
是的,您可以使用它,但要注意对齐问题。根据您的微控制器,可能会发生以下情况:
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 整除)。