【问题标题】:Is there a ready solution for embedded c to use external string resource on serial flash?嵌入式 c 是否有现成的解决方案可以在串行闪存上使用外部字符串资源?
【发布时间】:2015-04-28 03:18:51
【问题描述】:

我正在开发一个 128K RAM 的 SoC,目前 UART 打印太多,所以我们必须通过从内存中提取来减少代码大小。

我们有一个可用的 128Mb SPI 串行闪存,我想在上面存储字符串。请注意闪存或我们的固件中没有文件系统。

与其自己编写所有内容,我想知道是否有任何有用的代码或标准或其他我们可以使用的材料?

包括:(以下任何内容都会有所帮助)

  1. 库生成
  2. 资源获取方法实现。
  3. SPI FLASH 读/写。(其实我已经写好了。)

我期待这样的事情:

UART_PRINT(C315);

FLASH上有一个“C315”项,对应“Hello world”。

我们读出它然后在运行时通过 UART 打印。最终结果是终端上的“Hello world”。

当然,任何让我大吃一惊的东西都是受欢迎的。:)

【问题讨论】:

  • 与问题无关,但我认为 DMA 可能会让您大吃一惊。你的芯片上有DMA吗?如果您可以编写一个应用层,这样您就不必担心数据是在片上闪存中还是在外部闪存中,那就太好了。更不用说从 SPI 到 UART 缓冲区的所有数据了。

标签: c embedded flash-memory soc


【解决方案1】:

创建一个指向字符串的指针数组,并使用类似于资源的数组索引。该数组以及字符串可以存储在闪存中。将汇编程序用于指针和字符串数组可能更容易,可能作为与嵌入式代码的单独构建。您需要将 .h 包含文件中使用的索引名称与指向字符串的指针数组进行协调,类似于用于 Windows 应用程序的资源文件。这可以通过一堆定义或枚举来完成:

enum stringindexes{C000, C001, ...};

update - 我想知道是否可以使用诸如 Windows 资源编辑器之类的东西来创建指针和字符串。这需要一些逆向工程来创建一个实用程序,将生成的资源文件转换为仅包含指针和字符串数组的二进制图像,但它会自动生成包含文件,并为指针命名。如果有的话,资源编辑器可以用作创建自定义程序的指南,以生成包含定义或枚举的包含文件,以索引到指向字符串的指针数组。

【讨论】:

  • 存储在 SPI 总线上的串行访问内存上,而不是内存总线上 - 您不能拥有指向非地址映射内存的指针。
  • 指针将偏移到闪存中。我假设您可以通过 SPI 总线随机访问闪存。
  • C 标签的上下文中,术语“指针”可能会产生误导,但是随机访问/串行读出是访问方法。我无法想象 OP 还没有想到这个简单直接的解决方案。对他的问题的简单回答可能是“不”,他确实必须编写自己的系统。然而,我确实认为他可能高估了必要的努力。正如您所指出的,主要问题可能是首先将字符串放入内存中。我不确定在汇编程序中是否会更容易 - 这似乎完全没有必要。
  • @Clifford - 我只提到使用汇编程序可能更容易,可能作为单独的构建,来创建只包含指针(偏移量)和字符串的二进制图像。我担心的是,如果一个只有数据(指针和字符串)的 C 源文件最终会在生成的二进制图像中包含任何额外的数据。
  • 我明白了;我曾设想应用程序动态加载字符串和元数据,而不是将它们嵌入代码中;这样做没有什么优势,可能是因为您无法使用微控制器设备编程器加载串行 EEPROM。
【解决方案2】:

您也许可以利用链接器。

将 SPI FLASH 字符串放在自定义区域的自定义部分中。使用链接器生成的自定义区域内容对 SPI FLASH 进行编程。

使用字符串指针作为UART_PRINT() 的参数。该函数应通过从字符串指针中减去自定义部分的基地址来将指针转换为偏移量。然后使用偏移量从 SPI FLASH 中检索字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-13
    • 1970-01-01
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-11
    • 1970-01-01
    相关资源
    最近更新 更多