当前位置: 首页 > article >正文

stm32编译过程剖析 MicroPython openmv运行逻辑分析 MicroPython和传统c语言编译的比较 头脑风暴

首先来讲讲机器码,任何编译手段到最后烧录应用于芯片处理器的都是机器码  比如在某个架构下,二进制码0x33448899677代表的是str,也就是汇编里面的写入操作,然后他后面的一个参数是我要写入的地址也是二进制码,然后还有一个是他要写入的值也是二定制,而这个0x334488996677代表的实际芯片执行的底层操作就是写入,这就是机器码,你可以理解成机器码就是一张表指示出什么样的二进制对应什么样的操作,所以不同架构下,他们的机器码是不同的。有可能换一个架构,他的写入操作对应的二进制是0x767676887878,也就是机器嘛,不同他们每个操作对应的二进制,表示也有可能不同。

首先,机器码确实是特定于处理器架构的二进制指令,每条指令对应一个或多个操作。例如,x86、ARMM、IPS等架构的机器码。不同每个操作码(opcode)定义了操作类型,如MOV、ADD等,而操作数则了指定寄存器、内存地址或立即数。
用户举的例子中,0x3344代表写入操作,后面跟地址和数值。这可能过于。实际上简化,指令的结构更复杂,操作码可能占用字节多个,操作数的编码方式也因架构而
异。,例如ARM的指令长度固定为32位或16位(Thumb模
式),而x86使用可变长度指令。
需要指令解释格式,包括操作码和操作数的结构,以及不同架构的差异。例如,在ARM架构中,MOV指令的编码可能包括条件码、目标寄存器、源操作数等信息。此外,内存访问指令(如STR、LDR)涉及地址计算和寻址模式,
这些都会影响机器码的编码。

机器码的组成:

graph TD 
A[机器码指令] --> B操作[码Opcode]
A --> C[操作数Operands]
B --> D[操作指定类型]
C --> E[寄存器编号]
C F[ -->内存地址]
C --> G[立即数]

所以你可以这样认为,任何编译手段都是将我电脑语言编译成我芯片所使用的机器码,再烧录到芯片里面再去执行

接下来我们聊一聊MicroPython和传统c语言对嵌入式的开发他们之间的区别

传统c语言开发是直接把代码编译成特定机器码再烧录到我的单片机里面然后他直接进行该代码,但是我的Micropython它是逐行运行也就是说我stm32micropython固件烧录的代码其实是解释器,它的功能是去读取作为文件焙烧炉进来的Python代码(可以认为解释器就是实际烧录的代码)而运行的Python代码是作为文件保存的,他需要经过解释器生成一条条实际运行的代码再执行真正的特定架构机器码,他会一条一条解释要运行的Python代码文件,对这一行一行代码进行一行一行的执行分析,分析出我想要做的操作然后再一行一行传给我的内核去执行对应机器码

MicroPython的基本架构是这样的

graph TD
    A[MicroPython架构] --> B[Python 3语法解析器]
    A --> C[紧凑型运行时系统]
    A --> D[硬件抽象层HAL]
    B --> E[字节码编译器]
    C --> F[内存管理优化]
    D --> G[芯片级驱动适配]

 

所以你可以从里面看到它里面的主要架构就是解释器,也就是解析器,它的作用就是翻译我们的Python代码直接生成字节码,然后再生成我的机器码

而传统的c语言对嵌入式的编译,它是先生成汇编代码,然后再对他对汇编代码进行翻译成机器码

他们两个的步骤是不一样的

graph TB
subgraph 传统C开发流程
  A[C代码] --> B[编译器]
  B --> C[汇编代码]
  C --> D[机器码.bin]
  D --> E[直接执行]
end

subgraph MicroPython流程
  F[Python代码] --> G[生成AST]
  G --> H[编译为字节码.mpy]
  H --> I[存入文件系统]
  I --> J[解释器逐行执行]
end

经过上面的对比,你就应该知道字节码其实和汇编代码的功能是差不多 ,然后ast就替代了编译器编译出来的步骤

graph TB
subgraph 传统C开发
  A[C源代码] --> B[交叉编译]
  B --> C[机器码.bin]
  C --> D[直接烧录Flash]
  D --> E[CPU取指执行]
end

subgraph MicroPython实现
  F[解释器固件] --> G[包含C编译的runtime]
  H[Python脚本] --> I[转换为字节码.mpy]
  G --> J[文件系统存储]
  I --> J
  J --> K[逐行解释执行]
  K --> L[调用预编译的C函数]
end

而从上面的实现步骤,你就应该知道,我的实际的Python文件就是我要运行的。Python代码它是作为文件的形式存在我的芯片的存储中的,然后我的解释器是一行一行的去翻译我的Python代码文件,然后一行一行去执行我的Python代码对应的机器码操作。这样的话他对于图像或者说对于一些Python使用的操作对象方面会速度提高会提高,但是他的。效率降低20~30%


http://www.kler.cn/a/539307.html

相关文章:

  • Windows下AMD显卡在本地运行大语言模型(deepseek-r1)
  • Elasticsearch 生产集群部署终极方案
  • DeepSeek介绍,以及本地部署和API使用
  • Java | RESTful 接口规范
  • 【Pytorch实战教程】PyTorch中的Dataset用法详解
  • cs106x-lecture2(上)(Autumn 2017)
  • 本地部署DeepSeek-R1模型(新手保姆教程)
  • 树与二叉树的概念
  • Netty:高性能网络应用框架的深度解析
  • C++病毒
  • Chirpy3D:用于创意 3D 鸟类生成的连续部分潜在特征
  • Unity 基础编程
  • 334递增的三元子序列贪心算法(思路解析+源码)
  • feign Api接口中注解问题:not annotated with HTTP method type (ex. GET, POST)
  • 【系统设计】使用Spring Boot连接MySQL数据库
  • IT行业方向细分,如何做到专家水平——1.运维
  • MySQL时间类型相关总结(DATETIME, TIMESTAMP, DATE, TIME, YEAR)
  • CANoe工具使用技巧 --- 如何使用 “on ethernetPacket “事件处理程序
  • “深入浅出”系列之C++:(20)C++17
  • 四种垄断组织形式的简洁解释-AI
  • DevOps 与站点可靠性工程的比较
  • 小红书提出新面部视频交换方法DynamicFace,可生成高质量且一致的视频面部图像。
  • C++ -- 异常
  • 解密编程语言的执行机制:从解释到编译的进化
  • 数据库高安全—审计追踪:传统审计统一审计
  • 8.Python 面向对象(类和对象):定义类、类的构成、类的__init__()方法、创建对象、理解self