我正在开发不支持操作系统的 Arm 板。我已经在台式计算机上测试了我的 c++ 代码。它工作正常。现在我必须转储使用 arm-elf-g++ 交叉编译代码后生成的 bin 文件。我的代码正在使用 fopen 命令打开一个文件以读取其内容,但是由于没有操作系统,所以没有文件系统,这对主板有用吗?
谢谢vid09
你为什么要打开文件来阅读它——那是什么数据?
您可以通过其他方式将其提供给您的嵌入式代码。例如
你的目标库很可能有一个 fopen() 存根;您需要用工作版本替换的无效的空函数定义。这称为重定向。如果不重新定位,您的代码可能会很好地编译和链接,但 fopen() 调用和任何其他标准 I/O 调用(例如 printf() )将无济于事。
重定向的方式取决于编译器的标准 C 库。在 Keil/RealView 中,您可以修改提供的 retarget.c 示例之一并将其与您的项目链接。如果您使用 Newlib(通常与裸机 GNU 工具链一起使用),则需要修改或重新实现系统调用存根。其他工具链也有类似的方法。
然而,这都是相当学术的,因为要打开一个文件,你必须有一个文件系统,这反过来又要求你有某种形式的媒体,上面有可以作为文件读取的数据。所有这些都可以在裸机系统上完成,但它涉及额外的硬件和软件。例如,参见FatFs 。例如,通过 SPI 接口添加 SD 或 MMC 卡在硬件方面相对简单。您当然可以在片上 Flash 上实现 RAM 磁盘或文件系统,但您仍然必须首先考虑如何将数据获取到此类文件系统中。
在裸机上使用文件 I/O 的一种常见方式是用于调试。在这种情况下,它通常使用semihosting来实现。
CS3 旨在支持没有操作系统的板。为了允许类似的功能
open
和write
在没有操作系统支持的情况下工作,与调试器一起支持半主机功能。启用半主机后,这些系统调用将转换为主机系统上的等效函数调用。您只能在连接到调试器时使用这些函数调用;如果您在与调试器断开连接时尝试使用它们,您将获得硬件异常。
显然,这在独立环境中不起作用。
但是,您可以选择自己实施必要的调用。这取决于您使用的 C 运行时库;这是关于如何为 Newlib 执行此操作的教程:http ://www.embedded.com/electronics-blogs/industry-comment/4023922/Embedding-GNU-Newlib-Part-2