完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我们怎么为 MicroPython 扩展 C 模块了?当使用原生 MicroPython 进行开发时,你可能会遇到这样一些限制,比如官方没有实现自己想要的功能,或者你觉得这些实现不符合自己的工作需求。添加自己的 C 模块到 MicroPython 中是一个不错的选择,你可以按照自己的想法,设计适合自己的 Python 函数调用。
|
|
相关推荐
1个回答
|
|
为了帮助各位开发者快速添加 C 模块,RT-Thread 提供了相应的辅助工具 C 绑定代码自动生成器。该工具可以帮助开发者自动生成 C 代码和 MicroPython 之间的接口层,开发者只需将 C 语言编写的功能代码添加到指定位置,MicroPython 即可直接调用该功能。
Python 调用 C 函数的实现原理 C 语言和 Python 是两种完全不同的语言,如何使用 MicroPython 来调用 C 语言所实现的函数是许多小伙伴非常疑惑的地方。简单来说,这个问题的关键点在于,如何用 C 语言的形式在 MicroPython 源代码中表述函数的入参和出参。我举一个例子来讲解这个问题, 请观察如下 Python 函数: def add(a, b): return a + b该函数有两个入参,返回一个参数。此时如果能用 C 语言表示该 Python 函数的输入输出参数,就可以将一个实现该功能的 C 函数对接到 MicroPython 中。 添加用户函数到 MicroPython 假设上述函数的参数类型都为整形,通过自动生成器可以得到如下样板函数: STATIC mp_obj_t add( mp_obj_t arg_1_obj, mp_obj_t arg_2_obj) { mp_int_t arg_1 = mp_obj_get_int(arg_1_obj); /* 通过 Python 获取的第一个整形参数 arg_1 */ mp_int_t arg_2 = mp_obj_get_int(arg_2_obj); /* 通过 Python 获取的第二个整形参数 arg_2 */ mp_int_t ret_val; /* Your code start! */ ret_val = arg_1 + arg_2; /* 处理入参 arg_1 和 arg_2,并将结果赋给返回值 ret_val */ /* Your code end! */ return mp_obj_new_int(ret_val); /* 向 python 返回整形参数 ret_val */}MP_DEFINE_CONST_FUN_OBJ_2(add_obj, add);生成器会处理好需要导出到 MicroPython 的函数的入参和出参,而开发者只需要编写相应的代码来处理这些输入参数,并且把返回值赋给输出参数即可。 通过包含头文件的方式,可以调用先前编写的 C 函数来对输入参数进行处理,或者根据输入参数来执行相应的动作,添加控制硬件的驱动的原理也是一样的。 最终使用 Python 调用 C 函数的效果如下: >>> import userfunc>>> userfunc.add(666,777)1443添加用户模块到 MicroPython 添加用户模块到 MicroPython 中也不难,首先应当熟练掌握上述添加 C 函数的过程,然后参考 PR add module userfunc to MicroPython 来添加属于自己的模块,该 PR 实现了添加 userfunc 模块到 MicroPython 的功能,你可以按照同样的方式将自己编写的模块注册到 MicroPython 中,要注意仔细查看这个 PR 中修改的 4 个文件,不要漏掉修改的细节。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1004 浏览 0 评论
AI模型部署边缘设备的奇妙之旅:如何在边缘端部署OpenCV
3272 浏览 0 评论
tms320280021 adc采样波形,为什么adc采样频率上来波形就不好了?
1443 浏览 0 评论
2102 浏览 0 评论
1614 浏览 0 评论
75283 浏览 21 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-28 00:58 , Processed in 0.690018 second(s), Total 69, Slave 53 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (威廉希尔官方网站 图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号