microPython源码分析.2

这个目录里面是最小的实现

这个目录里面是一些驱动

底层驱动

类Unix上面用于编译py的编译器

Python的核心实现

STM32上面的mpy实现

Unix上面的mpy实现

upip,DFU这些工具的实现

这些大概就是完整的目录,因为我们都知道mpy是一门脚本语言

在运行的时候是运行在一个虚拟机上面的

即使是mpy也不例外,所以我们的py目录下的文件是最主要的

就像这个样子的

我们再打开这个ESP32的目录,其实你第一个hello打印出来的时候就知道

一个完整的C程序一定只有一个main入口,所以我们分析从这里开始是正确的,我们沿着它一步步的看下去~在图中还有一个makefile的文件

同级目录下还有一个模块的文件夹

先看我们的符号树,了解函数的多少

再看头文件

  1. 标准的c实现,打印等

  2. ESP32 IDF里面的文件,这里所以需要多加功课

  3. 然后就是mpy的实现了

接着是一段宏定义,用来初始化rtos

看这个

里面的TCB_t的全称为Task Control Block,也就是任务控制块

然后是mp这个任务的堆栈

以及堆内存

void mp_task(void *pvParameter){ volatile uint32_t sp = (uint32_t)get_sp();#if MICROPY_PY_THREAD// micropy_py_thread mp_thread_init(&mp_task_stack[0], MP_TASK_STACK_LEN);#endif uart_init();
soft_reset: // initialise the stack pointer for the main thread mp_stack_set_top((void *)sp); mp_stack_set_limit(MP_TASK_STACK_SIZE - 1024); gc_init(mp_task_heap, mp_task_heap + sizeof(mp_task_heap)); mp_init(); mp_obj_list_init(mp_sys_path, 0); mp_obj_list_append(mp_sys_path, MP_OBJ_NEW_QSTR(MP_QSTR_)); mp_obj_list_append(mp_sys_path, MP_OBJ_NEW_QSTR(MP_QSTR__slash_lib)); mp_obj_list_init(mp_sys_argv, 0);    readline_init0(); // 初始化外围设备    machine_pins_init(); // run boot-up scripts pyexec_frozen_module("_boot.py"); pyexec_file("boot.py"); if (pyexec_mode_kind == PYEXEC_MODE_FRIENDLY_REPL) { pyexec_file("main.py");    } for (;;) { if (pyexec_mode_kind == PYEXEC_MODE_RAW_REPL) { if (pyexec_raw_repl() != 0) { break; } } else { if (pyexec_friendly_repl() != 0) { break; } } }
#if MICROPY_PY_THREAD mp_thread_deinit();#endif
mp_hal_stdout_tx_str("PYB: soft reboot\r\n");
// 取消外围设备初始化 machine_pins_deinit();
mp_deinit(); fflush(stdout); goto soft_reset;}

因为在esp32 ,mpy就是一个单独的线程

使用线程第一步就是建立线程,这个函数用来干这个事情

把无关的板子打包一下

内容少了些

这个线程端口在这里

先看头文件

里面还内置了四个头文件,都是和ESP32的rtos有关系的

这个是线程头文件里面的签名

https://docs.espressif.com/projects/esp-idf/en/latest/esp32/
https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/index.html
https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/get-started/index.html
https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/index.html

得,还得看这个

还是忍不住发这个,就是官方的开发方式

https://docs.espressif.com/projects/esp-idf/en/latest/esp32/esp-idf-en-v4.4-dev-744-g1cb31e5-esp32.pdf
https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/esp-idf-zh_CN-v4.4-dev-744-g1cb31e5-esp32.pdf

同时也可以下载这个手册来看,都一样。都是英语

在main文件里面关于初始化线程堆栈的函数在这个mp的配置文件里面

里面和IDF的联系太深了,所以这里安装一下,然后就要重要的文件

https://github.com/espressif/esp-idf

处理成这个样子

这个时候我们的头文件,除了一开始的标准C打不开,其它都可以

线程的初始化函数找到了一个,初始化一个旋转锁,以及设置一个状态

这个是更加详细的初始化的过程

因为我们的板子在使用的时候是一个串口的命令行,所以串口的初始化必不可少,这里也相应的进行了初始化

(0)

相关推荐