c - STM32,保存在flash中的变量无法在其他文件中更新

标签 c linker sections flash-memory stm32f4

我使用的是 STM32F411RE。 因为我的 RAM 中没有更多内存。我决定在我的闪存中存储大变量。为此,我在 section.ld 中创建了一个部分。

 .large_buffer: ALIGN(4)
    {
        . = ALIGN(4) ;
        *(.large_buffer.large_buffer.*)
        . = ALIGN(4) ;
    } >FLASH

main.c 文件中,我声明变量如下:

uint8_t buffer[60 * 200] __attribute__ ((section(".large_buffer"), used));

此时一切正常,缓冲区未存储在 RAM (bss) 中,我可以访问它并重写它。

buffer[25] = 42;
printf("%d\n", buffer[25]); // 42

当我想从另一个文件编辑变量时,问题就来了。

main.c

uint8_t buffer[60 * 200] __attribute__ ((section(".large_buffer"), used));

int main()
{
  myFunc(buffer);
}

other.c

myFunc(uint8_t* buffer)
{
    buffer[25] = 42;
    printf("%d\n", buffer[25]); // 0
}

buffer 在另一个文件中永远不会改变(作为参数传递)。

我错过了什么吗?

最佳答案

由于闪存的物理设计,您不能像写入 RAM 一样写入闪存。确切地说,您需要删除扇区/页面(假设 ~ 1-4kB,它在您的 MCU 数据表中指定)。原因是闪存即使在未通电时也能保持状态,每当您想更改值 0 -> 1 的任何位时,您需要删除整个扇区(删除后所有位都将设置为 1) .

所以你不能使用 Flash 作为数据存储器,你可以做的是使用 Flash 作为存储常量(只读)值的变量,所以任何查找表都可以完美地放入其中(通常是编译器,当你 stat 变量const 会将它们放入 flash 中)。如何写入 flash 你可以在 MCU 的引用手册中阅读。

关于c - STM32,保存在flash中的变量无法在其他文件中更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40991905/

相关文章:

c++ - 读写缓冲区问题

c++ - 获取 CPU/内存利用率的跨平台方式

c++ - PoDoFo 使用 eclipse 设置,链接器错误,对符号 'pthread_mutexattr_settype@@GLIBC_2.2.5' 的 undefined reference

linux - 在 Ubuntu 上暂时禁用 Gold Linker

c# - 保存自定义配置部分会导致 System.UnauthorizedAccessException

html - 容器流体不是全屏宽度

c - 类型转换 :LPCTSTR to Char * for string concatenate operation

c - 我如何扫描包含某人姓名的字符串并为其创建缩写?

gcc - gcc "-Xlinker"和 "-Wl,"选项之间的区别?

javascript - 向下滚动到部分时突出显示菜单项