C 无法在其他文件中更新存储在闪存中的变量STM32

C 无法在其他文件中更新存储在闪存中的变量STM32,c,linker,sections,flash-memory,stm32f4,C,Linker,Sections,Flash Memory,Stm32f4,我使用STM32F41RE。 因为我的内存中没有更多的内存。我决定在闪存中存储大变量。为此,我在section.ld中创建了一个节 .large_buffer: ALIGN(4) { . = ALIGN(4) ; *(.large_buffer.large_buffer.*) . = ALIGN(4) ; } >FLASH 在main.c文件中,我声明变量如下: uint8_t buffer[60 * 200] __att

我使用STM32F41RE。 因为我的内存中没有更多的内存。我决定在闪存中存储大变量。为此,我在
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)


因此,您不能将闪存用作数据存储器,您可以使用闪存存储常量(只读)值的变量,因此任何查找表都将完全适合于此(通常,当您将变量统计为常量时,编译器会将它们放在闪存中)。如何写入闪存您可以在MCU的参考手册中阅读。

由于闪存的物理设计,您无法以与写入RAM相同的方式写入闪存。确切地说,您需要擦除扇区/页面(比如~1-4kB,它在MCU数据表中指定)。原因是,闪存即使未通电也会保持状态,只要您想更改0->1的任何位,就需要擦除整个扇区(擦除后,所有位都将设置为1)


因此,您不能将闪存用作数据存储器,您可以使用闪存存储常量(只读)值的变量,因此任何查找表都将完全适合于此(通常,当您将变量统计为常量时,编译器会将它们放在闪存中)。如何写入闪存您可以在MCU的参考手册中阅读。

感谢您的回答。在闪存中存储缓冲区(通常需要R/W)是一个好的解决方案吗?我不建议将其作为可行的解决方案,首先需要保存RAM,以便能够先读取闪存,然后写入闪存。写入/擦除比读取慢得多,与RAM相比,写入/擦除闪存更长。另外,你可以执行的擦除周期是有限制的,通常大约是100k个周期。是的,我理解这个问题。在这一点上,我被卡住了,因为我无法保存ram。解决办法是什么?哪些优化是相关的?可能的解决方案是:-将一些只读变量移到const并存储在闪存中。-将SRAM作为附加设备添加到您的系统中,STM32F4具有FMC外围设备,允许您映射外部SRAM,并以与内部相同的方式使用它。-使用更大的MCU和更大的RAMOr-优化您的软件,找到一些可以缩小规模的地方,更改协议,以减少所需资源。找到如何以更短的方式存储信息的方法,比如说,有些地方不使用32位变量,而是将其打包为8位。如果在某些地方只使用布尔值(它基本上至少存储8位,因此可以使用8位变量和位掩码来存储多个标志。感谢您的回答。是否存储缓冲区(通常需要是R/W)在闪存中是一个很好的解决方案?我不建议将其作为可行的解决方案,首先,您需要保存RAM,以便能够先读取然后写入闪存。写入/擦除比读取慢得多,与RAM相比,写入/擦除闪存更长。此外,您可以执行的擦除周期也有限制,通常约为100k周期。是的,我知道理解这个问题。在这一点上,我被卡住了,因为我无法保存ram。什么是解决方案?什么优化是相关的?可能的解决方案是:-将一些只读变量移动到常量并存储在闪存中。-将SRAM作为附加设备添加到系统中,STM32F4具有FMC外围设备,允许您映射外部SRAM并使用它e与内部相同。-使用更大的MCU和更大的RAMOr-优化您的软件,找到一些可以缩小规模的地方,更改协议以减少所需资源。找到如何以更短的方式存储信息的方法,比如说,不要使用32位变量,有些地方将其打包为8位。如果在某些地方仅使用布尔值(它基本上至少存储8位,所以可以使用8位变量和位掩码来存储多个标志。