microPython的源码解析之 emitinlinethumb

#include <stdarg.h> // 包含可变参数列表宏
#include <assert.h> // 包含断言宏

// 包含MicroPython特定的头文件
#include “py/emit.h”
#include “py/asmthumb.h”

// 如果定义了MICROPY_EMIT_INLINE_THUMB,则编译以下代码
#if MICROPY_EMIT_INLINE_THUMB

// 定义一个枚举类型pn_kind_t,包含所有可能的解析节点类型
typedef enum {

// 定义具有编译函数的规则
#define DEF_RULE(rule, comp, kind, …) PN_##rule,
#define DEF_RULE_NC(rule, kind, …) PN_##rule,
#include “py/grammar.h” // 包含MicroPython语法规则
#undef DEF_RULE
#undef DEF_RULE_NC
PN_const_object, // 特殊的节点,用于表示一个常量Python对象
// 定义没有编译函数的规则
#define DEF_RULE(rule, comp, kind, …)
#define DEF_RULE_NC(rule, kind, …) PN_##rule,
#include “py/grammar.h”
#undef DEF_RULE
#undef DEF_RULE_NC
} pn_kind_t;

// 定义一个结构体emit_inline_asm_t,用于存储内联汇编的上下文信息
struct _emit_inline_asm_t {

asm\_thumb\_t as; // 存储Thumb汇编器的上下文
uint16\_t pass; // 当前编译通过的编号
mp\_obj\_t \*error_slot; // 存储错误信息的对象指针
mp\_uint\_t max_num_labels; // 最大标签数量
qstr \*label_lookup; // 标签查找表

};

// 如果定义了MICROPY_DYNAMIC_COMPILER,则编译以下代码
#if MICROPY_DYNAMIC_COMPILER

// 检查是否可以在当前架构下使用浮点数
static inline bool emit_inline_thumb_allow_float(emit_inline_asm_t *emit) {

return MP_NATIVE_ARCH_ARMV7EMSP <= mp_dynamic_compiler.native_arch
       && mp_dynamic_compiler.native_arch <= MP_NATIVE_ARCH_ARMV7EMDP;

}

// 如果没有定义MICROPY_DYNAMIC_COMPILER,则使用预定义的宏
#else

static inline bool emit_inline_thumb_allow_float(emit_inline_asm_t *emit) {

return MICROPY_EMIT_INLINE_THUMB_FLOAT;

}

#endif

// 定义一个函数,用于生成错误信息
static void emit_inline_thumb_error_msg(emit_inline_asm_t *emit, mp_rom_error_text_t msg) {

\*emit->error_slot = mp\_obj\_new\_exception\_msg(&mp_type_SyntaxError, msg);

}

// 定义一个函数,用于设置错误异常
static void emit_inline_thumb_error_exc(emit_inline_asm_t *emit, mp_obj_t exc) {

\*emit->error_slot = exc;

}

// 定义一个函数,用于创建一个新的内联汇编上下文
emit_inline_asm_t *emit_inline_thumb_new(mp_uint_t max_num_labels) {

// 分配内存并初始化新的内联汇编上下文
emit\_inline\_asm\_t \*emit = m\_new\_obj(emit\_inline\_asm\_t);
memset(&emit->as, 0, sizeof(emit->as));
mp\_asm\_base\_init(&emit->as.base, max_num_labels);
emit->max_num_labels = max_num_labels;
emit->label_lookup = m\_new(qstr, max_num_labels);
return emit;

}

// 定义一个函数,用于释放内联汇编上下文占用的内存
void emit_inline_thumb_free(emit_inline_asm_t *emit) {

m\_del(qstr, emit->label_lookup, emit->max_num_labels);
mp\_asm\_base\_deinit(&emit->as.base, false);
m\_del\_obj(emit\_inline\_asm\_t, emit);

}

// 定义一个函数,用于开始一个新的编译通过
static void emit_inline_thumb_start_pass(emit_inline_asm_t *emit, pass_kind_t pass, mp_obj_t *error_slot) {

// 设置当前通过编号和错误槽,初始化标签查找表
emit->pass = pass;
emit->error_slot = error_slot;
if (emit->pass == MP_PASS_CODE_SIZE) {

    memset(emit->label_lookup, 0, emit->max_num_labels \* sizeof(qstr));
}
mp\_asm\_base\_start\_pass(&emit->as.base, pass == MP_PASS_EMIT ? MP_ASM_PASS_EMIT : MP_ASM_PASS_COMPUTE);
asm\_thumb\_entry(&emit->as, 0);

}

// 定义一个函数,用于结束当前的编译通过
static void emit_inline_thumb_end_pass(emit_inline_asm_t *emit, mp_uint_t type_sig) {

// 退出Thumb汇编器并结束当前的编译通过
asm\_thumb\_exit(&emit->as);
asm\_thumb\_end\_pass(&emit->as);

}

// 定义一个函数,用于计算参数的数量

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!

要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289)

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值