- 为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_reposmicropython_sumicropython-1.16pylexer.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) #define MICROPY_ENABLE_COMPILER (1)
问题解决了。
经过各种查阅资料、代码和尝试,好不容易调通了,急急忙忙出差到深圳支持展会和拜访客户。临回上海的晚上,好不容易静下心来复盘,打算记录开发过程的时候,有一些过程已经记不住了,比较可惜。后面会再移植到别的芯片上,到时再参考这里的思路,从零开始再实践一次。以后做成标准操作流程,就别想太多了。只有等到以后有空分析代码时,才会看到内部的原理。只能说,这次调试各种尝试,也是被逼急了一通找,再加上有点运道,走的弯路很少。顺藤摸瓜追代码的过程非常有价值,不断接近真相的感觉很好,这也是我最想记录的过程。
接下来的工作,就剩下usb的部分了。micropython内部集成tinyusb,所以做法跟fatfs类似。但是我要实现通过usb msd访问sd卡,这样就不需要每次都把SD卡拔下来,插到读卡器上拖拽文件了。这个功能也简单,甚至同micropython也没啥关系,全部是硬件操作,准备一个初始化函数和一个中断服务程序就好。需要考虑的是,看能不能把cdc uart也搞起来。。。
- END