在嵌入式系统上使用fopen()需要什么?

时间:2013-07-12 00:29:23

标签: c file embedded fopen

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

我最近在研究fopen()stdoutstdinstderr等函数一起工作后,偶然发现了printf()和类似函数。

我想知道,在嵌入式系统上使用fopen()需要什么(不一定有操作系统支持)。在阅读了更多关于它之后,在更强大的嵌入式系统上做一个很酷的事情,比如UART / SPI接口,因此调用printf()会将数据打印出UART。 Simarly,您可以通过调用scanf()来读取UART缓冲区中的数据。

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

你能在简单的嵌入式系统上使用fopen()吗?如果是,那么who / where / when是“FILE”然后创建的(就我现在而言,fopen()没有malloc()文件的空间,你也没有指定多少)?或者您是否需要具有FAT文件支持的操作系统。如果是这样,http://ultra-embedded.com/?fat_filelib之类的东西会起作用吗?会不会使用FreeRTOS帮助?

4 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

在Keil编译器上,stdio库旨在允许用户以任何所需的方式定义__FILE结构。像fprintf这样的函数将执行对fputc的一系列调用,它将接收传递给fprintf的指针的副本。可以定义fopen之类的内容来“创建”__FILE并通过任何所需的方式填充其成员(如果一次只打开一个文件,可以简单地填写字段一个静态实例并返回)。变量__stdin__stdout__stderror同样可以根据需要定义(stdin定义为__stdin,同样stdoutstderror)。