microPython源码分析.2
这个目录里面是最小的实现
这个目录里面是一些驱动
底层驱动
类Unix上面用于编译py的编译器
Python的核心实现
STM32上面的mpy实现
Unix上面的mpy实现
upip,DFU这些工具的实现
这些大概就是完整的目录,因为我们都知道mpy是一门脚本语言
在运行的时候是运行在一个虚拟机上面的
即使是mpy也不例外,所以我们的py目录下的文件是最主要的
就像这个样子的
我们再打开这个ESP32的目录,其实你第一个hello打印出来的时候就知道
一个完整的C程序一定只有一个main入口,所以我们分析从这里开始是正确的,我们沿着它一步步的看下去~在图中还有一个makefile的文件
同级目录下还有一个模块的文件夹
先看我们的符号树,了解函数的多少
再看头文件
标准的c实现,打印等
ESP32 IDF里面的文件,这里所以需要多加功课
然后就是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打不开,其它都可以
线程的初始化函数找到了一个,初始化一个旋转锁,以及设置一个状态
这个是更加详细的初始化的过程
因为我们的板子在使用的时候是一个串口的命令行,所以串口的初始化必不可少,这里也相应的进行了初始化