gpt4 book ai didi

c - 如何将变量存储在特定的内存位置?

转载 作者:太空狗 更新时间:2023-10-29 16:51:53 25 4
gpt4 key购买 nike

由于我是 C 的新手,我必须在我的一个项目中使用以下内容:我必须声明一些全局变量,每次程序在同一内存地址运行时都必须存储这些变量。我做了一些阅读,发现我将其声明为“静态”,它将存储在相同的内存位置。

但我的问题是:我可以指示程序在哪里存储该变量吗?例如:int a 被存储在 0xff520000。这件事做不做?我在这里搜索但没有找到任何相关示例。如果他们是关于此的旧帖子,请分享链接。

提前谢谢大家。劳伦修

更新:我使用的是 32uC

最佳答案

在您的 IDE 中,将有一个内存映射可通过一些链接器文件使用。它将包含程序中的所有地址。阅读 MCU 手册,查看哪些地址有适合您目的的有效内存,然后为您的变量保留一些内存。您必须阅读特定开发平台的文档。

接下来,请注意将变量映射到特定地址没有多大意义,除非它们是硬件寄存器或驻留在闪存或 EEPROM 中的非 volatile 变量。

如果这样一个内存位置的内容在执行过程中会发生变化,因为它是一个寄存器,或者因为你的程序包含一个引导加载程序/NVM 编程算法来改变 NVM 内存单元,那么变量必须声明为易变的。否则,编译器将在优化时完全破坏您的代码。

特定的编译器很可能有一种非标准的方法来在特定地址分配变量,例如 #pragma 或有时奇怪的非标准 @ 运算符。在标准 C 中的固定位置分配变量的唯一明智方法是:

#define MY_REGISTER (*(volatile uint8_t*)0x12345678u)

其中 0x12345678 是其中 1 个字节所在的地址。一旦有了这样的宏声明,就可以像使用变量一样使用它:

void func (void)
{
MY_REGISTER = 1; // write
int var = MY_REGISTER; // read
}

大多数情况下,您希望这些类型的变量驻留在全局命名空间中,因此也就是宏。但是如果你出于某种原因想要缩小变量的范围,那么跳过宏并在代码中手动访问地址:

void func (void)
{
*(volatile uint8_t*)0x12345678u = 1; // write
int var = *(volatile uint8_t*)0x12345678u; // read
}

关于c - 如何将变量存储在特定的内存位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15267001/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com