0

以下代码有什么问题:

unsigned int *ptr;    
ptr=(unsigned int*)0x1234;
*ptr=10;
/*do someting*/
*ptr=100;

提示点,我已经阅读了单片机的内存映射,并且这个位置可以被程序员非常多地使用,所以排除了不拥有内存的情况。我想知道的是,我可以使用上述方法直接访问内存位置吗?

提前致谢。

4

2 回答 2

2

是的,这很好,除非(如您所说)您在可访问的内存范围内。

另外我想补充一点,因为您提到了微控制器,如果这是 SFR 或 GPR 的地址,那么它的别名(使用#define)必须已经在控制器的标头中定义,所以最好使用该别名,以改进可读性/可理解性和可移植性。

编辑:(正如弗拉德在评论中指出的那样)
使用volatile将使您的程序更加安全可靠,因为编译器不会优化立即内存写入,并且您可以确保您写入的值立即写入您想要的位置。

于 2013-11-14T11:48:20.560 回答
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 整除)。

于 2013-11-14T12:01:24.633 回答