首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >microPython源码分析.2

microPython源码分析.2

作者头像
云深无际
发布2021-04-14 10:25:15
发布2021-04-14 10:25:15
1.3K0
举报
文章被收录于专栏:云深之无迹云深之无迹

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

这个目录里面是一些驱动

底层驱动

类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这个任务的堆栈

以及堆内存

代码语言:javascript
复制
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有关系的

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

代码语言:javascript
复制
https://docs.espressif.com/projects/esp-idf/en/latest/esp32/
代码语言:javascript
复制
https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/index.html
代码语言:javascript
复制
https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/get-started/index.html
代码语言:javascript
复制
https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/index.html

得,还得看这个

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

代码语言:javascript
复制
https://docs.espressif.com/projects/esp-idf/en/latest/esp32/esp-idf-en-v4.4-dev-744-g1cb31e5-esp32.pdf
代码语言:javascript
复制
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的联系太深了,所以这里安装一下,然后就要重要的文件

代码语言:javascript
复制
https://github.com/espressif/esp-idf

处理成这个样子

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

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

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-04-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云深之无迹 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档