Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
MicroPython
粗浅理解Micropython原理(一)
发布于 2021-05-25 17:54:36 浏览:1277
订阅该版
[tocm] # 1. 概述 Micropython是对Python3的一种高效实现,包括了部分Python标准库,针对MCU等资源受限的场景进行了优化。 Python语言语法简洁直观,容易上手,是目前最炙手可热的编程语言之一。而Micropython提供了使用Python语言操控硬件设备的接口,在STEAM教育等领域广受欢迎。 ## 1.1 编译还是解释 虽然Python语言编程对用户友好,但是其执行效率问题也经常被部分人诟病,因其是一种“解释型”语言。与“解释型”语言相对的是“编译型”语言,比如C语言。C语言的程序要经过编译器编译生成可执行的二进制机器码,然后CPU就可以直接读取执行。而“解释型”语言,比如Shell脚本,执行前一般不需要编译过程,而是“边解释边执行”。 不严谨地说,“编译型”语言与“解释型”语言的区别是,它把解释的工作丢给了编译器。 不过,严格来说,Python语言并不是纯粹的“解释型”语言,Python程序的执行过程其实包括了先编译再解释的过程。只不过这里的编译并没有把Python语句编译成CPU可以直接执行的机器码,而是编译成了一种平台无关的格式,称为`bytecode`。`bytecode`再被虚拟机解释为平台相关的操作并执行。 # 2. Micropython语句:从开始到结束 一条Micropython语句,无论来自REPL(交互式Shell)、文件还是`eval`函数,要产生预期的结果,都会经过以下生命周期: 1. 解析:从语句到解析树 2. 编译:从解析树到`bytecode` 3. 执行:虚拟机解释执行`bytecode` 这个过程由`parse_compile_execute`函数(`lib/utils/pyexec.c`)实现: ```c /* lib/utils/pyexec.c */ STATIC int parse_compile_execute(const void *source, mp_parse_input_kind_t input_kind, int exec_flags) { ... nlr_buf_t nlr; if (nlr_push(&nlr) == 0) { mp_obj_t module_fun; ... { #if MICROPY_ENABLE_COMPILER mp_lexer_t *lex; if (exec_flags & EXEC_FLAG_SOURCE_IS_VSTR) { const vstr_t *vstr = source; lex = mp_lexer_new_from_str_len(MP_QSTR__lt_stdin_gt_, vstr->buf, vstr->len, 0); } else if (exec_flags & EXEC_FLAG_SOURCE_IS_FILENAME) { lex = mp_lexer_new_from_file(source); } else { lex = (mp_lexer_t *)source; } // source is a lexer, parse and compile the script qstr source_name = lex->source_name; mp_parse_tree_t parse_tree = mp_parse(lex, input_kind); module_fun = mp_compile(&parse_tree, source_name, exec_flags & EXEC_FLAG_IS_REPL); #else mp_raise_msg(&mp_type_RuntimeError, MP_ERROR_TEXT("script compilation not supported")); #endif } // execute code mp_hal_set_interrupt_char(CHAR_CTRL_C); // allow ctrl-C to interrupt us #if MICROPY_REPL_INFO start = mp_hal_ticks_ms(); #endif mp_call_function_0(module_fun); mp_hal_set_interrupt_char(-1); // disable interrupt mp_handle_pending(true); // handle any pending exceptions (and any callbacks) nlr_pop(); ret = 1; if (exec_flags & EXEC_FLAG_PRINT_EOF) { mp_hal_stdout_tx_strn("\x04", 1); } } else { ... } ... return ret; } ``` - `mp_parse`为解析过程 - `mp_compile`为编译过程 - `mp_call_function_0`为执行过程
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
Remember
这家伙很懒,什么也没写!
文章
4
回答
60
被采纳
16
关注TA
发私信
相关文章
1
请问rt-thread有没有移植micropython呢
2
micropython import 文件名的方式执行脚本问题
3
第一篇:Micropython 的起源和发展
4
第二篇:RT-Thread Micropython 简介
5
第三篇:RT-Thread Micropython 快速入门
6
第四篇:Micropython DIY 项目汇总
7
第五篇:Micropython 教程和资源
8
第六篇: RT-Thread MicroPython 学习经验和学习路线
9
RT-Thread MicroPython 最新开发板固件汇总【已失效】
10
有Mpy专门的板块啦~
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
机器人操作系统 (ROS2) 和 RT-Thread 通信
4
国产MCU移植系列教程汇总,欢迎查看!
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
LWIP
Env
SPI
Bootloader
AT
ART-Pi
Hardfault
CAN总线
FinSH
USB
文件系统
RT-Thread
DMA
SCons
线程
RT-Thread Nano
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
ota在线升级
WIZnet_W5500
I2C_IIC
UART
flash
cubemx
packages_软件包
freemodbus
潘多拉开发板_Pandora
PWM
定时器
ADC
BSP
中断
keil_MDK
编译报错
socket
MicroPython
GD32
msh
Debug
ulog
SDIO总线
SFUD
rt_mq_消息队列_msg_queue
C++_cpp
本月问答贡献
xiaorui
7
个答案
3
次被采纳
sakumisu
4
个答案
3
次被采纳
三世执戟
31
个答案
1
次被采纳
梦笑真美
18
个答案
1
次被采纳
踩姑娘的小蘑菇
14
个答案
1
次被采纳
本月文章贡献
Z_Y
2
篇文章
5
次点赞
Alipay
2
篇文章
3
次点赞
2345vor
2
篇文章
1
次点赞
比特饼干
1
篇文章
6
次点赞
Lu_盼盼
1
篇文章
3
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部