首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >STM32,存储在闪存中的变量无法在其他文件中更新。

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

Stack Overflow用户
提问于 2016-12-06 09:29:06
回答 1查看 1.5K关注 0票数 0

我使用STM32F411RE。因为我的内存里没有内存了。我决定在闪存中存储大变量。为此,我在section.ld中创建了一个节。

代码语言:javascript
复制
 .large_buffer: ALIGN(4)
    {
        . = ALIGN(4) ;
        *(.large_buffer.large_buffer.*)
        . = ALIGN(4) ;
    } >FLASH

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

代码语言:javascript
复制
uint8_t buffer[60 * 200] __attribute__ ((section(".large_buffer"), used));

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

代码语言:javascript
复制
buffer[25] = 42;
printf("%d\n", buffer[25]); // 42

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

main.c

代码语言:javascript
复制
uint8_t buffer[60 * 200] __attribute__ ((section(".large_buffer"), used));

int main()
{
  myFunc(buffer);
}

other.c

代码语言:javascript
复制
myFunc(uint8_t* buffer)
{
    buffer[25] = 42;
    printf("%d\n", buffer[25]); // 0
}

buffer从不更改另一个文件(作为参数传递)。

我错过了什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-06 10:15:28

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40991905

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档