#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年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!
要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289)
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!