为micropython启用文件系统(4)

博主在为Micropython启用文件系统时遇到无法导入模块的问题,经过排查发现并非fatfs或SD卡问题,而是mp_lexer_new_from_file()函数的实现问题。通过开启MICROPY_READER_VFS和MICROPY_ENABLE_COMPILER宏,成功解决模块导入错误。后续计划实现通过USB MSD访问SD卡,以便更方便地管理文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为micropython启用文件系统(4)

还是不能导入模块?

中间遇到了各种问题,最后调到这种程度了。经过测试,都已经可以通过open()函数读SD卡上的readme.txt文件了,为啥还是不能import hello.py ?

网上搜搜python 的“OSError:2”,对应是“没有这样的文件或目录”,但是直接在repl打开SD卡中同hello.py同目录下的readme.txt是OK的啊。而且通过打桩分析发现,在执行import hello时,也执行了SD卡的读操作,并且也读了hello.py文件

再在micropython的源码里找,看是谁打印了“OSError:2”,啥也没找到。

这个时候又注意到main.c中的mp_lexer_new_from_file()函数,从字面上看,这个函数就是从文件中读取内容的。下个printf打个桩试试。果不其然,在import时调用了这个函数。

在这里插入图片描述
还好,不是fatfs和sd卡的问题,这里的OSError是代码里的mp_raise_OSError(MP_ENOENT)抛出来的。这个函数也是OSError,有门路。

再全局搜一下,看一个有效的mp_lexer_new_from_file()是怎么实现的。

D:_git_repos\micropython_su\micropython-1.16\py\lexer.c:
735 #if MICROPY_READER_POSIX || MICROPY_READER_VFS
736
737: mp_lexer_t *mp_lexer_new_from_file(const char *filename) {
738 mp_reader_t reader;
739 mp_reader_new_file(&reader, filename);

所有的板级port的实现都是返回空。但是py/lexer.c 中竟然有标准实现,需要要打开“MICROPY_READER_VFS”宏而已。赶紧关掉假的mp_lexer_new_from_file(),配置对应的宏开关,用真的实现替换上。

在lexer.c文件中,所有代码都要求打开MICROPY_ENABLE_COMPILER。我原来的移植没加上,现在在 ports/mm32/mportconfig.h 文件中加上:

#define MICROPY_READER_VFS             (1) /* enable mp_lexer_new_from_file() in lexer.c */
#define MICROPY_ENABLE_COMPILER        (1) /* enable lexer.c */

问题解决了。
在这里插入图片描述
在这里插入图片描述

后记

经过各种查阅资料、代码和尝试,好不容易调通了,急急忙忙出差到深圳支持展会和拜访客户。临回上海的晚上,好不容易静下心来复盘,打算记录开发过程的时候,有一些过程已经记不住了,比较可惜。后面会再移植到别的芯片上,到时再参考这里的思路,从零开始再实践一次。以后做成标准操作流程,就别想太多了。只有等到以后有空分析代码时,才会看到内部的原理。只能说,这次调试各种尝试,也是被逼急了一通找,再加上有点运道,走的弯路很少。顺藤摸瓜追代码的过程非常有价值,不断接近真相的感觉很好,这也是我最想记录的过程。

接下来的工作,就剩下usb的部分了。micropython内部集成tinyusb,所以做法跟fatfs类似。但是我要实现通过usb msd访问sd卡,这样就不需要每次都把SD卡拔下来,插到读卡器上拖拽文件了。这个功能也简单,甚至同micropython也没啥关系,全部是硬件操作,准备一个初始化函数和一个中断服务程序就好。需要考虑的是,看能不能把cdc uart也搞起来。。。

  • END
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值