在非OS Arm板上使用'fopen'

时间:2013-02-25 13:15:27

标签: c++ embedded arm

我正在开发一个非操作系统支持的Arm Board。我已经在我的桌面计算机上测试了我的c ++代码。它运行正常。现在我必须转储使用arm-elf-g ++交叉编译代码后生成的bin文件。 我的代码是打开一个文件来使用fopen命令读取它的内容,但这个东西是否适用于主板,因为没有操作系统,所以没有文件系统?

由于 vid09

3 个答案:

答案 0 :(得分:2)

为什么要打开文件来阅读它 - 那是什么数据?

您可以通过其他方式将其提供给嵌入式代码。例如

  • 以常量
  • 编译它
  • 通过某个端口读取(可能是串口,或以太网 - 虽然后者是一个没有O / S的大工作!)并使用主机发送数据。

答案 1 :(得分:1)

在裸机上使用文件I / O的常用方法是进行调试。在这种情况下,它通常使用semihosting实现。

  

CS3旨在支持没有操作系统的主板。至   允许openwrite等函数在没有操作系统的情况下工作   支持,支持半主机功能,以及   调试器。

     

启用半主机后,这些系统调用将被转换为   主机系统上的等效函数调用。你只能使用这些   连接到调试器时的函数调用;如果你试图使用它们   当与调试器断开连接时,您将获得一个硬件   异常。

显然,这在独立设置中不起作用。

但是,您可以选择自己实施必要的调用。这取决于您正在使用的C运行时库;这是关于如何为Newlib执行此操作的教程:http://www.embedded.com/electronics-blogs/industry-comment/4023922/Embedding-GNU-Newlib-Part-2

答案 2 :(得分:1)

你的目标库很可能有一个fopen()存根;一个无法运行的空函数定义,需要用工作版本替换。这称为重新定位。如果没有重新定位,您的代码可能会编译和链接,但fopen()调用和任何其他标准I / O调用(例如printf())将不执行任何操作。

重新定位的方式取决于编译器的标准C库。在Keil / RealView中,您可以修改其中一个提供的retarget.c示例并将其与项目链接。如果您使用的是Newlib(通常与裸机GNU工具链一起使用),则需要修改或重新实现 syscalls 存根。其他工具链也有类似的方法。

然而,这完全是学术性的,因为要打开文件,您必须拥有一个文件系统,这反过来又要求您拥有某种形式的媒体,其中包含可以作为文件读取的数据。所有这些都可以在裸机系统上完成,但它涉及额外的硬件和软件。例如,请参阅FatFs。例如,通过SPI接口添加SD或MMC卡在硬件方面相对简单。您当然可以在片上Flash上​​实现RAM磁盘或文件系统,但您仍然必须考虑如何将数据放到这样的文件系统上。