3

我对标准 C 库提供的 FILE 函数系列非常陌生。

在研究了fopen()如何stdout与.stdinstderrprintf()

我想知道,fopen()在嵌入式系统(不一定有操作系统支持)上需要使用什么。在阅读了更多关于它的内容之后,在更强大的嵌入式系统上连接到 UART/SPI 接口似乎是一件很酷的事情,这样调用printf()就会从 UART 打印数据。同样,您可以通过调用从 UART 缓冲区读取数据scanf()

这也将增加便携性!(如果支持的话,为 Linux 编写的代码会更容易移植printf())。如果它在生产环境中运行,您还可以将调试数据打印到文件中,然后再从中读取。

你可以fopen()在一个简单的嵌入式系统上使用吗?如果是这样,那么“文件”是谁/在哪里/何时创建的(就我现在而言,文件fopen()没有malloc()空间,你也没有指定多少)?或者您是否需要支持 FAT 文件的操作系统。如果是这样,像http://ultra-embedded.com/?fat_filelib这样的东西会起作用吗?使用 FreeRTOS 会有帮助吗?

4

4 回答 4

5

检查工具链的 C 库的文档 - 它应该有关于重新定位库的内容。

例如,如果您使用Newlib ,则必须重新实现部分或全部 [syscalls stubs][3] 以适合您的目标。在这种情况下,低级open()系统调用将允许fopen()根据需要工作。在最简单的情况下,您可以实现open()支持更高级别的 stdio 对串行端口的访问,但如果您期望标准文件系统访问,那么您仍然需要一个底层文件系统来映射它。

可以在此处找到重新定位 Keil/ARM 标准库的另一个示例。

于 2013-07-12T16:44:12.237 回答
1

在 Keil 编译器上,该stdio库旨在允许用户以__FILE任何所需的方式定义结构。类似的函数fprintf将执行一系列对 的调用fputc,它将接收传递给 的指针的副本fprintf。可以定义诸如fopen“创建” a__FILE并通过任何所需方式填充其成员之类的东西(如果一次打开的文件永远不会超过一个,则可以简单地填写静态实例的字段并返回它)。变量__stdin,__stdout__stderror也可以根据需要定义(stdin定义为指向__stdin,同样使用stdoutand stderror)。

于 2013-07-15T18:35:00.937 回答
1

是的,通常可以fopen()在嵌入式系统的代码中使用类似的例程。它通常的工作方式是供应商提供针对其系统的 C 编译器和相关库,它们以适合该系统的方式实现一些受支持的语言子集(例如printf(),通过 UART 实现该输出,fopen()或者使用 RAM 来模拟某种文件系统)。

于 2013-07-12T00:43:59.587 回答
0

“你能在一个简单的嵌入式系统上使用 fopen() 吗?” 这取决于。取决于您的嵌入式系统的配置、接口的内存类型、您想要实现文件系统的内存、文件系统库代码大小(ROM 和 RAM 要求)。文件操作函数可以独立于任何操作系统使用。但是必须使用正确的文件系统,并且 FAT 不是唯一的文件系统(JFFS2、YAFS、...一些其他专有文件系统)文件系统通常(但不总是)在闪存(Nand Flash、Nor Flash)上实现)。USB设备也是闪存(Nand flash)。Nand Flash & Nor Flash 可能有Parallel接口、I2C接口或SPI接口。

于 2013-07-12T04:30:27.043 回答