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

时间:2015-06-03 01:58:21

标签: c++ embedded keil freertos

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

1)存储文本文件 将文本文件添加到我的keil项目是否足够?我可以在编译后访问它吗?

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

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

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

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

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

const char my_text[] = {

    ... here goes the text

};

最简单的说,就是用"包含每一行。

然后将该文件添加到项目中(您需要在其中使用extern声明)或#include并发出声明static(感谢@clifford)。< / p>

答案 1 :(得分:2)

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

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

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

Keil的MicroLib或其全功能库都支持I / O流,但由于目标的I / O功能无法预先知道,因此需要{{3} }。最简单的是,它通常仅针对stdout / stdin流实现,但您可以为任何I / O设备实现文件描述符 - 但是要执行文件I / O,您需要一个文件系统,例如{{3} }或retargetting您仍需要实现用于访问闪存的低级驱动程序。如果您使用文件系统库;你实际上不必通过重新定位来挂钩stdio;你可以直接访问这个库 - 我提到了重新定位,因为你似乎对stdio的运行方式有些疏忽。

STM32F1xx上的闪存编程详细信息在主参考的ELM FatFs之内,而STM32标准外设库包含支持编程的低级功能。在这里你会发现ST的文档中其他地方没有明确说明的严重问题;当你编程或擦除闪存时,它会将地址和数据总线锁定到整个闪存 - 因为这通常是处理器也从中获取指令的地方,整个核心停顿的时间是操作,可能长达40ms(STM32F2xx在800ms时更糟!);因此,写入闪存页面可能会破坏时间关键操作。

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