如何在嵌入式系统闪存上存储文本文件并从中读取

How to store text file on embedded systems flash memory and read from it

我正在尝试执行以下操作:将文本文件 (7kB) 存储在 STEVAL-MKI109V2(运行 freeRTOS)板的闪存中并读取该文本文件并使用它进行一些计算在设备本身上。我有 2 个问题:

1) 存储文本文件 将文本文件添加到我的 keil 项目中就足够了吗?编译后可以访问吗?

2) 访问数据 直到现在,这就是我失败的地方。起初我尝试使用 stdio.h 中的 fopen() 但我在编译时遇到了一些错误。我发现我的项目是使用 microLib 编译的,它似乎不包含文件 I/O。在使用标准 C 库编译后,它是成功的,但是一旦我到达代码中的 fopen 部分,系统就会崩溃。

现在我不知道原因是没有找到文本文件还是我不能在我的嵌入式系统上使用fopen()。我没有在 STM 文档或论坛中找到更多信息,除了 FLASH_Unlock();功能,但它似乎是用来写的。

我是否需要以另一种方式存储我的文本文件并通过内存地址访问,而不仅仅是文件名?我很困惑,在网上找不到任何信息。

在此先感谢您的帮助!

如果您只想将文件的内容作为字符串,您可以将文件转换为 C 源代码,例如使用小型 Python 程序(或任何其他语言,我只使用 Python 因为在 Python 中比在 C 或 C++ 中更简单)。只需创建如下内容:

const char my_text[] = {

    ... here goes the text

};

最简单的是,用 " 包围每一行。

然后将该文件添加到项目中(您需要在使用它的地方进行外部声明)或 #include 并进行声明 static(感谢@clifford)。

如果您只是想在您的应用程序中嵌入一个资源,那么实现一个文件系统就太过分了,您应该使用@Olaf 的方法。

但是,如果您想要可以独立于您的应用程序进行编程的数据;那么您可以简单地保留必要数量的片上闪存页面,然后通过 JTAG 单独编程这些页面,或者添加对闪存页面加载和编程的支持到您的应用程序。或者为了获得更大的灵活性,您可以添加一个使用保留数量的闪存页面的文件系统——这也需要您向应用程序添加一种下载和写入数据的方法。

STM32F1xx 上的所有闪存页面大小相同,因此无论您使用低内存页面还是高内存页面都无所谓,但使用上层页面更简单,因为代码开始的复位向量在低内存中.要保留页面(防止编译器在其中放置代码),您只需减少项目内存映射选项中的默认上层地址(我假设您使用的是 Keil ARM-MDK/uVision,因为您提到了 MicroLib)。

Keil 的 MicroLib 或它的全功能库都支持 I/O 流,但由于目标的 I/O 能力无法提前知道,因此需要所谓的 retargetting. At it's simplest this is often implemented only for stdout/stdin streams, but you can implement file descriptors for any I/O device - however to perform file I/O you need a file-systems such as ELM FatFs or Yaffs 为此,您仍然需要实现用于访问闪存的低级驱动程序。如果您使用文件系统库;您实际上不必通过重定向挂钩 stdio;您可以直接访问该库 - 我提到重定向是因为您似乎对 stdio 的工作原理不太了解。

STM32F1xx 闪存编程的详细信息来自主要参考文献 separate manual,而 STM32 标准外设库包含支持编程的低级函数。在这里您会发现一个严重的问题,在 ST 文档的其他地方没有明确说明;当您编程或擦除闪存时,它会将地址和数据总线锁定到 整个 闪存 - 因为这通常是处理器从中获取指令的地方,所以整个内核会暂停操作的持续时间,可能长达 40 毫秒(在 STM32F2xx 上更糟,为 800 毫秒!);因此写入闪存页面可能会扰乱时间关键操作。

如果你想在这样的设备上使用文件系统;您最好使用 SPI 端口与 SD 卡通信,或者使用片外非易失性存储器。