【问题标题】:Pointer to a specific fixed address指向特定固定地址的指针
【发布时间】:2011-01-24 06:13:08
【问题描述】:

如何为指针分配特定的内存地址?

AVR m128 等微控制器中的特殊功能寄存器具有固定地址,AVR GCC 在 io.h 头文件中定义了 SFR,但我想自己处理。

【问题讨论】:

    标签: c pointers


    【解决方案1】:

    当然,没问题。您可以直接将其分配给变量:

    volatile unsigned int *myPointer = (volatile unsigned int *)0x12345678;
    

    我通常做的是声明一个内存映射 I/O 宏:

    #define mmio32(x)   (*(volatile unsigned long *)(x))
    

    然后在头文件中定义我的寄存器:

    #define SFR_BASE    (0xCF800000)
    #define SFR_1       (SFR_BASE + 0x0004)
    #define SFR_2       (SFR_BASE + 0x0010)
    

    然后使用它们:

    unsigned long registerValue = mmio32(SFR_1); // read
    mmio32(SFR2) = 0x85748312;                   // write
    

    【讨论】:

    • 我会使用通用的 void 指针,除非该位置的数据是无符号整数。
    • 将内存映射的 I/O 地址声明为 volatile 通常是个好主意。
    • @Sean,他想访问内存映射寄存器。你不能取消引用 void 指针,那有什么用?
    • 好吧,你可以让它成为 volatile void *,这样他们就不能随便访问它,除非使用 mmio32()。我不会那样做,也许这就是你想要的?
    猜你喜欢
    • 2018-12-23
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多