龙空技术网

移植Python到嵌入式平台(2)——Adding a Module

芯片与自由 171

前言:

如今看官们对“stm32移植python”都比较注意,朋友们都想要知道一些“stm32移植python”的相关知识。那么小编在网摘上搜集了一些有关“stm32移植python””的相关知识,希望各位老铁们能喜欢,姐妹们快快来了解一下吧!

用MicroPython的时候,你很可能需要你自己用C语言写库而不是其他Python实现。你也可能想用一个已经存在库,或者访问一些外围设备,但是默认的版本不支持。或者甚至仅仅想在更小的内存上运行的更快。为此,你将需要扩展已经存在的固件,用你自己的C代码。

添加你自己的源文件

为了添加你自己用C语言写的模块,你需要新建一个C文件,并且将其加入到Makefile文件中,以确保编译期间能被编译到。源文件列表保存在SRC_C变量中。参考其他文件加入即可,顺序不重要。现在仅仅是创建了个空的mymodule模块,编译一下看看有没有包含在firmware中。

SRC_C = \ main.c \ system_stm32.c \ stm32_it.c \ ... mymodule.c ...
创建一个Python模块

从C语言的角度来看,模块在Micropython中只是一个特定数据结构的结构体。打开mymodule.c文件,放入下面的代码。下面的代码定义了一个python模块。

#include "py/nlr.h"#include "py/obj.h"#include "py/runtime.h"#include "py/binary.h"#include "portmodules.h"STATIC const mp_map_elem_t mymodule_globals_table[] = { { MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_OBJ_NEW_QSTR(MP_QSTR_mymodule) },};STATIC MP_DEFINE_CONST_DICT ( mp_module_mymodule_globals, mymodule_globals_table);const mp_obj_module_t mp_module_mymodule = { .base = { &mp_type_module }, .globals = (mp_obj_dict_t*)&mp_module_mymodule_globals,};

现在,为了这个模块能够被import导入,我们需要添加它到mpconfigport.h文件。

extern const struct _mp_obj_module_t mp_module_mymodule;#define MICROPY_PORT_BUILTIN_MODULES \ { MP_OBJ_NEW_QSTR(MP_QSTR_umachine), (mp_obj_t)&machine_module }, \ ... { MP_OBJ_NEW_QSTR(MP_QSTR_mymodule), (mp_obj_t)&mp_module_mymodule }, \

接下来你可以试着编译这个固件,并烧入你的开发板。接下来你可以用import mymodule看到它被导入。

添加一个函数

现在让我们给模块添加一个简单的函数。让我们再一次编辑mymodule.c,并写入下面的代码。

#include <stdio.h>STATIC mp_obj_t mymodule_hello(void) { printf("Hello world!\n"); return mp_const_none;}STATIC MP_DEFINE_CONST_FUN_OBJ_0(mymodule_hello_obj, mymodule_hello);

这里创建了一个函数对象mymodule_hello_obj,调用的时候将执行mymodule_hello函数。

用下面的代码将这个函数对象加入我们的模块:

STATIC const mp_map_elem_t mymodule_globals_table[] = { { MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_OBJ_NEW_QSTR(MP_QSTR_mymodule) }, { MP_OBJ_NEW_QSTR(MP_QSTR_hello), (mp_obj_t)&mymodule_hello_obj },};
函数参数

上面添加了一个没有参数的函数。MP_DEFINE_CONST_FUN_OBJ_0用于定义一个没有参数的函数。MP_DEFINE_CONST_FUN_OBJ_1用于定义有一个参数的函数,

类添加方法在MicroPython中使用我们的模块

现在重新编译我们的移植代码,就可以在我们的开发板上使用我们定义的模块。比如像下面这样:

import mymodule;mymodule.hello ();a = mymodule.hellObj ( 12 );print (mymodule);mymodule.inc();print (mymodule);

标签: #stm32移植python