Micropython 扩展C模块<HelloWorld>

开发环境

  • MCU:Pico1(无wifi版)
  • 使用固件:自编译版本
  • 开发环境:MacBook Pro Sonoma 14.5
  • 开发工具:Thonny 4.1.6
  • 开发语言:MicroPython 1.24

执行示例

  1. 在github上获取micropython,我使用的1.24版本(开发版生成固件暂时有问题)
  2. 可以在找到“micropython/examples/usercmodule/cexample”文件夹,这是官方给的一个示例,包括三个文件“examplemodule.c”、“micropython.cmake”、“micropython.mk”,可以直接执行如下指令,即可将该模块加入到固件中,就可以直接使用了。
# 在micropython目录下执行
make -j -C ports/rp2 BOARD=PICO USER_C_MODULES=../../examples/usercmodule/cexample/micropython.cmake

改造学习

  • 在micropython同级目录创建了一个myModules文件夹,再创建了一个myHello文件夹,目录结构如下:
-micropython
-MyModules
--myhello
---hello.c
---micropython.cmake
---micropython.mk
  • micropython.mk文件初探
# 设置目录
CHELLO_MOD_DIR := $(USERMOD_DIR)# 将咱们的C模块加入到 SRC_USERMOD中.
SRC_USERMOD += $(CHELLO_MOD_DIR)/hello.c
  • micropython.cmake文件初探
# 创建我们的C模块库
add_library(usermod_hello INTERFACE)# 把我们的模块加入到库中
target_sources(usermod_hello INTERFACE${CMAKE_CURRENT_LIST_DIR}/hello.c
)# 把我们的模块加入到目录中
target_include_directories(usermod_hello INTERFACE${CMAKE_CURRENT_LIST_DIR}
)# 把我们的模块链接到库中
target_link_libraries(usermod INTERFACE usermod_hello)
  • hello.c文件初探
// 需要用到的包
#include "py/runtime.h"
#include <string.h>// 这是原来例子里带的一个加法函数
static mp_obj_t add_ints(mp_obj_t a_obj, mp_obj_t b_obj) {int a = mp_obj_get_int(a_obj);int b = mp_obj_get_int(b_obj);return mp_obj_new_int(a + b);
}
// 和上边这个函数是配套的,需要输入两个参数所以函数名带了个“2”
static MP_DEFINE_CONST_FUN_OBJ_2(add_ints_obj, add_ints);// 这是我新增的一个函数,实现返回一个字符串的操作
static mp_obj_t hello() {char str[] = "Hello, World!";return mp_obj_new_str(str, strlen(str));
}
// 和上边这个函数是配套的,不需要输入参数所以函数名带了个“0”
static MP_DEFINE_CONST_FUN_OBJ_0(hello_obj, hello);// 配置模块属性,这里需要注意xxhello,将会是我们在python中调用函数时需要import的名字
static const mp_rom_map_elem_t example_module_globals_table[] = {{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_xxhello) },{ MP_ROM_QSTR(MP_QSTR_add_ints), MP_ROM_PTR(&add_ints_obj) },{ MP_ROM_QSTR(MP_QSTR_hello), MP_ROM_PTR(&hello_obj) },
};
static MP_DEFINE_CONST_DICT(example_module_globals, example_module_globals_table);// 注意里边的元素都是环环相扣的引用
const mp_obj_module_t example_user_cmodule = {.base = { &mp_type_module },.globals = (mp_obj_dict_t *)&example_module_globals,
};// 注意里边的元素都是环环相扣的引用
MP_REGISTER_MODULE(MP_QSTR_xxhello, example_user_cmodule);

执行测试

  • 重新打包编译烧录并执行代码,执行如下

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/488056.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

0002.简易酒店管理系统后台

一.系统架构 springmvcjsplayuimysql 二.功能特性 简单易学习&#xff0c;虽然版本比较老但是部署方便&#xff0c;tomcat环境即可启用&#xff1b;代码简洁&#xff0c;前后端代码提供可统一学习&#xff1b;祝愿您能成尽快为一位合格的程序员&#xff0c;愿世界没有BUG; …

Android 车载虚拟化底层技术-Kernel 5.10 -Android12(multi-cards)技术实现

详细代码实现见 Android Display Graphics系列文章-汇总​​​​​​Android Display Graphics系列文章-汇总 Android Display Graphics系列文章-汇总 Android Display Graphics系列文章-汇总 本文主要包括部分&#xff1a; 一、Android12的Kernel 5.10版本 1.1 Kernel 5…

「Mac玩转仓颉内测版50」小学奥数篇13 - 动态规划入门

本篇将通过 Python 和 Cangjie 双语介绍动态规划的基本概念&#xff0c;并解决一个经典问题&#xff1a;斐波那契数列。学生将学习如何使用动态规划优化递归计算&#xff0c;并掌握编程中的重要算法思想。 关键词 小学奥数Python Cangjie动态规划斐波那契数列 一、题目描述 …

MySQL(数据类型)

目录 1. 数值类型 2. bit类型 3.小数类型 3. 字符串类型 4 日期和时间类型 5. enum和set 1. 数值类型 对标C语言&#xff1a; tinyint->char(1字节)&#xff1a; 有符号&#xff1a;127 ~ 255 无符号&#xff1a;0 ~ -128。 smalli…

1. Flink自定义Source

一. Source 简介 DataStream是Flink的低级API&#xff0c;用于进行数据的实时处理&#xff0c;Flink编程模型分为Source、Transformation、Sink三个部分&#xff0c;如下图所示。 默认Flink提供了大量的内置Source&#xff0c;常见的Source如下&#xff1a; 基于文件的Sour…

运维新手入门——KVM(Beginner‘s Guide to Operations and Maintenance - kvm)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…

一个功能强大的视频翻译和本地化配音工具,支持影视级双语字幕/视频配音

家好&#xff0c;今天给大家分享一个功能强大的视频翻译和本地化配音工具VideoLingo&#xff0c;旨在为用户提供高质量的字幕和配音服务&#xff0c;让全世界的知识能够跨越语言的障碍共享。 项目介绍 VideoLingo项目的开发旨在解决视频内容创作者和翻译者面临的跨语言障碍问题…

力扣-图论-9【算法学习day.59】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非…

doxygen–自动生成文档工具

原文地址&#xff1a;doxygen–自动生成文档工具 – 无敌牛 欢迎参观我的个人博客&#xff1a;无敌牛 – 技术/著作/典籍/分享等 简介 doxygen是软件开发中广泛使用的文档生成工具。它可以从源代码注释中自动生成文档&#xff0c;解析类、函数、参数相关信息&#xff0c;并生…

上市公司投资效率Biddle模型数据(包括最终数据、原始数据及构造说明)2003-2022年

一、计算方式&#xff1a;参考《Journal of accounting and economics》Biddle G C&#xff0c;构建Biddle模型使用企业投资对成长机会的回归模型来估计企业的投资效率&#xff0c;这里成长机会用销售增长率来衡量。回归模型如下图所示: 二、资料范围&#xff1a;包括原始数据…

用JavaScript实现一个贪吃蛇游戏

原理如下&#xff0c;贪吃蛇的蛇身就是一个数组&#xff0c;数组中的每个元素都是一个坐标&#xff0c;蛇身每次移动时都会在数组前插入一个新坐标&#xff0c;并在数组尾部删掉一条记录&#xff0c;吃到食物后数组的尾部记录就不删。如果移到屏幕边缘会从屏幕的另一边出现。好…

【Canvas与光阑】立方体六彩光阑

【成图】 120*120的png图标 大小图&#xff1a; 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>立方体 六彩光阑 Draft2</…

[代码随想录14]二叉树的常用操作,翻转,对称,最大深度和最小深度,递归版本

前言 在二叉树的题目中&#xff0c;递归的解法无疑是是最简单和最好理解的&#xff0c;也能快速解题&#xff0c;本篇介绍一下递归的常见的二叉树题目。 题目链接 226. 翻转二叉树 - 力扣&#xff08;LeetCode&#xff09; 101. 对称二叉树 - 力扣&#xff08;LeetCode&#…

css基础记录

基础 选择器 复合选择器 后代选择器 div p {}; 类似如上,找到div中所有的后代,注意是所有的后代 子代选择器 > div > a 只选择div的儿子中有a的 并集选择器 用逗号,分隔 p,div,span,h1 { … } 一般一行写一个 CSS元素显示模式 分为块元素,行内元素 块元素 特点…

HDR视频技术之六:色调映射

图像显示技术的最终目的就是使得显示的图像效果尽量接近人们在自然界中观察到的对应的场景。 HDR 图像与视频有着更高的亮度、更深的位深、更广的色域&#xff0c;因此它无法在常见的普通显示器上显示。 入门级的显示器与播放设备&#xff08;例如普通人家使用的电视&#xff0…

《HTML 的变革之路:从过去到未来》

一、HTML 的发展历程 图片: HTML 从诞生至今&#xff0c;经历了多个版本的迭代。 &#xff08;一&#xff09;早期版本 HTML 3.2 在 1997 年 1 月 14 日成为 W3C 推荐标准&#xff0c;提供了表格、文字绕排和复杂数学元素显示等新特性&#xff0c;但因实现复杂且缺乏浏览器…

webrtc学习----前端推流拉流,局域网socket版,一对一

提示&#xff1a;局域网socket版 文章目录 [TOC](文章目录) 前言一、教程二、webrtc工作流程三、推流端四、拉流五、socket服务六、效果七、备注总结 前言 ‌‌‌‌‌WebRTC&#xff08;Web Real-Time Communication&#xff09;‌是一种实时通讯技术&#xff0c;允许网络应用或…

IMX6ULL开发板挂载 Ubuntu 的 NFS 目录,并以交叉编译得到的hello程序进行测试

首先参考博文 https://blog.csdn.net/wenhao_ir/article/details/144404637 使得IMX6ULL开发板、PC机上的USB网卡、VMware中的Ubuntu能互相Ping 通 然后开始将Ubuntu 的 NFS 目录挂载到Ubuntu中。 为什么挂载&#xff1f; 答&#xff1a;其实是把 Ubuntu中的某个目录通过NFS网…

Vscode 构建 uniapp vue3 + ts 微信小程序项目

前言 为什么要使用 Vscode 来开发构建 uniapp 项目&#xff1f;从个人角度来讲&#xff0c;仅是想要 Vscode 丰富的插件生态&#xff0c;以及最重要的优秀的 TtypeScript 类型检查支持&#xff0c;因为本人是 TS 重度使用者。 如果你更习惯使用 js 进行开发&#xff0c;使用 …

【Spark】Spark的两种核心Shuffle工作原理详解

Spark 的shuffle机制 一、Spark ShuffleManager 发展历程 Spark 1.1.0 之前 在 Spark 1.1.0 之前&#xff0c;Spark 使用 BlockStoreShuffleFetcher 来处理 Shuffle 操作。这个实现主要依赖于直接从 BlockManager 获取 Shuffle 数据&#xff0c;并通过网络进行交换。 Spark …