|
前言 之前使用esp32,里面用到了sd卡,使用的fatfs文件系统,搭配上esp32的虚拟文件系统vfs,直接可以使用标准库的文件io操作,c和c++都可以,用的是十分的爽。来到stm32上,也想实现这一套,于是研究了一下,其归根到底还是和半主机模式——semihost有关,通过对标准库关键底层函数的重写,就能够成功使用文件io操作。 实现可以通过rte实现,关闭microlib,启用cmsis compiler里面的功能,即可完成,但我向来不喜欢用rte,所以单独将其摘了出来,做成了8个文件。 需要注意的点有:当使用remove和rename这两个标准库的函数时,rte自带的文件并没有将这两个函数包括,因此需要你自己定义这两个函数,当然,本示例中已经定义好了。 还有一个需要注意的点,由于使用的是keil,所以重定义的底层函数都是以_sys打头的,如果改成gcc,应该是直接以下划线打头,比如在keil里_sys_write,在gcc里应该是_write,但具体是不是这样,因为只尝试了keil,所以并不清楚。 是下面是8个文件的文件名。 retarget_fs.h retarget_stderr.h retarget_stdin.h retarget_stdout.h retarget_tty.h retarget_io.h retarget_io.c retarget.c
本示例使用stm32h7b0vbt6作为开发,使用OSPI外设操控w25q128,使用反客提供的w25q64库,使用FAL作为文件抽象层,使用LittleFS作为底层文件系统,用以实现标准库的文件io操作,与此同时顺便实现了printf的重写。当然还顺便重写了一下malloc和free,使用freertos的函数进行实现。 本示例中的标准库重载函数都由chatgpt生成,并使用chatgpt生成测试函数,且成功通过了测试,但并未在生产环境中部署,请谨慎使用。测试函数只使用了C标准库的文件io函数。
|