0

我使用的是 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永远不要在另一个文件中更改(作为参数传递)。

我错过了什么 ?

4

1 回答 1

2

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

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

于 2016-12-06T10:15:28.470 回答