【树莓派驱动验证步骤】
终端操作和输出:
清理项目
ada@raspberrypi:~/mt3502 $ make clean
make -C /lib/modules/6.6.51+rpt-rpi-v8/build M=/home/ada/mt3502 clean
make[1]: 进入目录“/usr/src/linux-headers-6.6.51+rpt-rpi-v8”CLEAN /home/ada/mt3502/Module.symvers
make[1]: 离开目录“/usr/src/linux-headers-6.6.51+rpt-rpi-v8”
编译模块
ada@raspberrypi:~/mt3502 $ make
make -C /lib/modules/6.6.51+rpt-rpi-v8/build M=/home/ada/mt3502 modules
make[1]: 进入目录“/usr/src/linux-headers-6.6.51+rpt-rpi-v8”CC [M] /home/ada/mt3502/mt350x.oMODPOST /home/ada/mt3502/Module.symversCC [M] /home/ada/mt3502/mt350x.mod.oLD [M] /home/ada/mt3502/mt350x.ko
make[1]: 离开目录“/usr/src/linux-headers-6.6.51+rpt-rpi-v8”
卸载模块(未加载)
ada@raspberrypi:~/mt3502 $ sudo rmmod mt350x
rmmod: ERROR: Module mt350x is not currently loaded
编译设备树源文件
ada@raspberrypi:~/mt3502 $ dtc -@ -I dts -O dtb -o mt350x.dtbo mt350x.dts
加载设备树覆盖层
ada@raspberrypi:~/mt3502 $ sudo dtoverlay -l | grep mt350x
ada@raspberrypi:~/mt3502 $ sudo dtoverlay mt350x.dtbo
ada@raspberrypi:~/mt3502 $ sudo dtoverlay -l | grep mt350x
0: mt350x
加载内核模块
ada@raspberrypi:~/mt3502 $ lsmod | grep mt350x
ada@raspberrypi:~/mt3502 $ sudo insmod mt350x.ko
ada@raspberrypi:~/mt3502 $ lsmod | grep mt350x
mt350x 16384 0
说明
make clean
:清理项目中的编译生成文件。make
:编译内核模块。sudo rmmod mt350x
:尝试卸载模块(模块未加载时会报错)。dtc
:编译设备树源文件为.dtbo
文件。sudo dtoverlay
:加载设备树覆盖层。sudo insmod mt350x.ko
:加载内核模块。-
lsmod | grep mt350x
:检查模块是否已加载。
解决方案:
- 设备树内容示例:
设备树中需声明 I2C 设备地址和兼容性字符串,例如:/ {compatible = "raspberrypi,model";fragment@0 {target = <&i2c1>;__overlay__ {#address-cells = <1>;#size-cells = <0>;mt350x: mt350x@50 {compatible = "your-company,mt350x";reg = <0x50>; // I2C 设备地址};};}; };
- 关键点:
compatible
必须与驱动代码中的of_match_table
匹配。reg
指定设备的 I2C 地址(如0x50
)。
- 关键点:
2. 检查驱动代码
驱动代码(mt350x.c
)需要包含以下关键逻辑:
-
绑定设备树的
compatible
:static const struct of_device_id mt350x_of_match[] = {{ .compatible = "your-company,mt350x" },{}, }; MODULE_DEVICE_TABLE(of, mt350x_of_match);
-
注册 I2C 驱动:
static struct i2c_driver mt350x_driver = {.driver = {.name = "mt350x",.of_match_table = mt350x_of_match,},.probe = mt350x_probe,.remove = mt350x_remove, }; module_i2c_driver(mt350x_driver);
-
在
probe()
中创建设备节点:static int mt350x_probe(struct i2c_client *client, const struct i2c_device_id *id) {// 创建设备节点(例如 /dev/mt350x)dev = device_create(class, NULL, dev_num, NULL, "mt350x");// 初始化 I2C 通信...return 0; }
操作流程总结
-
设备树编译:
编译增量设备树源文件
安装设备树编译工具
sudo apt-get install device-tree-compiler
使用 dtc 进行编译
dtc -@ -I dts -O dtb -o mt350x.dtbo mt350x.dts
分析步骤:
检查设备树配置
- 确认是否已添加设备树覆盖:
如果你有.dts
或.dtbo
文件(如mt350x.dtbo
),需确保它已正确应用到系统中:# 查看已加载的设备树覆盖 sudo dtoverlay -l | grep mt350x
- 如果未加载,手动加载:
sudo dtoverlay mt350x.dtbo
- 如果未加载,手动加载:
- 确认是否已添加设备树覆盖:
-
加载驱动模块:
sudo rmmod mt350x sudo insmod mt350x.ko
分析步骤:
-
检查模块是否已加载:
运行以下命令,查看模块是否在已加载列表中:lsmod | grep mt350x
- 如果看到输出结果,说明模块已加载。
-
卸载已存在的模块:
如果模块已加载,使用rmmod
卸载它:sudo rmmod mt350x
- 注意:模块名可能不包含
.ko
后缀,直接使用mt350x
。
- 注意:模块名可能不包含
-
重新加载模块:
卸载成功后,再次尝试加载:sudo insmod mt350x.ko
验证模块是否正常工作:
虽然模块已加载,但你可能需要确认它是否按预期工作。以下是验证步骤:
-
查看内核日志:
运行以下命令,检查模块加载时的输出(可能有初始化信息或错误):dmesg | grep mt350x
- 如果看到类似
mt350x: module loaded successfully
的日志,说明一切正常。
- 如果看到类似
-
检查设备节点或接口:
- 如果这是一个设备驱动(例如字符设备),检查
/dev/
下是否生成了对应的设备文件:ls -l /dev/mt350x* # 替换为你的设备名
- 如果涉及网络或硬件接口,检查相关工具的输出(如
ifconfig
、i2cdetect
等)。
- 如果这是一个设备驱动(例如字符设备),检查
总结:
- 当前状态正常,模块已成功加载。
- 无需再次执行
insmod
,除非你修改了模块代码需要重新加载。 - 如需调试,优先通过
dmesg
查看内核日志。
-
-
验证设备节点和 I2C 地址:
ls /dev/mt350x* # 检查设备节点 sudo i2cdetect -y 1 # 检查 I2C 设备是否存在
常见问题
- 设备树未生效:确保
.dtbo
文件已复制到/boot/overlays/
并在/boot/config.txt
中添加dtoverlay=mt350x
。 - 驱动未绑定设备树:检查驱动代码中的
compatible
字符串是否与设备树一致。 - 权限问题:如果设备节点已创建但无访问权限,使用
sudo chmod 666 /dev/mt350x
。
调试步骤
1. 验证 I2C 设备是否被识别
-
检查 I2C 总线上的设备:
# 安装 i2c 工具 sudo apt install i2c-tools # 扫描 I2C 总线(假设设备挂在 i2c-1) sudo i2cdetect -y 1
- 输出中应显示设备地址(如
0x50
)为UU
或具体值。
- 输出中应显示设备地址(如
-
查看 sysfs 中的设备:
ls /sys/bus/i2c/devices/ # 查找类似 "1-0050" 的条目
2. 检查内核日志
即使 dmesg | grep mt350x
无输出,也可能有其他错误:
dmesg | tail -n 30 # 查看最近 30 条日志,搜索 "error" 或 "i2c"
问题原因分析:
-
仅加载内核模块不足以创建设备节点:
- I2C 设备通常需要 设备树(Device Tree) 或 手动注册 来声明设备地址和配置。
- 如果模块未绑定到具体的 I2C 设备节点,驱动可能无法触发
probe()
函数,导致设备节点未生成。
-
可能缺失的环节:
- 设备树中未定义该 I2C 设备的节点。
- 内核模块未正确关联到设备树的
compatible
字符串。 - 驱动代码中未注册字符设备或未调用创建设备节点的接口(如
device_create
)。
你可以通过以下命令让内核日志(包括你的驱动输出)持续实时显示:
1. 使用 dmesg
的 follow 模式
sudo dmesg -w
- 效果:实时显示新增的内核日志(按
Ctrl+C
退出)。 - 过滤特定关键字(如
mt350x
):sudo dmesg -w | grep mt350x
- 如果
grep
导致输出延迟,添加--line-buffered
参数:sudo dmesg -w | grep --line-buffered mt350x
- 如果
2. 使用 tail
跟踪日志文件
Debian 系统的内核日志通常保存在 /var/log/kern.log
或 /var/log/syslog
:
sudo tail -f /var/log/kern.log | grep mt350x
或
sudo tail -f /var/log/syslog | grep mt350x
3. 使用 journalctl
(systemd 系统)
sudo journalctl -f -k | grep mt350x
- 参数解释:
-f
:实时跟踪新日志。-k
:仅显示内核日志。
4. 在驱动代码中增加调试日志(可选)
如果日志输出频率不够,可以修改驱动代码(mt350x.c
)中的 printk
语句:
// 示例:在 mt350x_read_displacement 函数中添加更多信息
printk(KERN_INFO "mt350x: displacement=%d, direction=%d, steps=%d\n", displacement, motion_direction, motion_steps_detected);
重新编译并加载模块后,日志会更详细。
5. 调整日志级别(可选)
如果日志被屏蔽(如 printk
级别低于当前控制台日志级别),可以临时调整:
# 允许所有级别的日志显示
sudo dmesg -n debug
操作示例:
# 终端1:持续跟踪内核日志并过滤 mt350x
sudo dmesg -w | grep --line-buffered mt350x# 终端2:触发传感器动作(例如移动设备)
# 观察终端1的输出是否变化
常见问题:
- 无实时输出:确保传感器正在被物理操作(例如移动),或检查驱动代码中
printk
的触发条件。 - 日志过多:调整驱动代码中的打印频率(例如减少
msleep(512)
的间隔)。 - 权限问题:使用
sudo
执行命令。
如果问题依旧,建议检查驱动代码中的数据处理逻辑(例如 motion_direction
和 motion_steps_detected
是否被正确更新)。
相关文章:
【树莓派驱动验证步骤】
终端操作和输出: 清理项目 adaraspberrypi:~/mt3502 $ make clean make -C /lib/modules/6.6.51rpt-rpi-v8/build M/home/ada/mt3502 clean make[1]: 进入目录“/usr/src/linux-headers-6.6.51rpt-rpi-v8”CLEAN /home/ada/mt3502/Module.symvers make[1]: 离开…...
百度SEO和必应SEO优化方法
如需SEO服务,可以搜索:深圳市信科网络科技有限公司。 一、搜索引擎生态格局:流量入口的重新洗牌 2025 年,中国 PC 端搜索引擎市场正经历戏剧性变革。StatCounter 数据显示,必应凭借 Edge 浏览器的预装优势与 ChatGPT …...
2025年3月AI搜索发展动态与趋势分析:从技术革新到生态重构
025年3月AI搜索发展动态与趋势分析:从技术革新到生态重构 一、行业动态:巨头布局与技术升级 谷歌推出“AI模式”,重新定义搜索体验 谷歌上线全新“AI模式”,集成多模态交互与实时数据能力,用户可通过文本、图片或语音…...
封闭图形个数
0封闭图形个数 - 蓝桥云课 小蓝对蓝桥王国的数字大小规则十分感兴趣。现在,他将给定你n个数a1, a2, ..., an,请你按照蓝桥王国的数字大小规则,将这n数从小到大排序,并输出排序后结果。 输入格式 第一行包含一个整数n࿰…...
VSCode 抽风之 两个conda环境同时在被激活
出现了神奇的(toolsZCH)(base) 提示符,如下图所示: 原因大概是:conda 环境的双重激活:可能是 conda 环境没有被正确清理或初始化,导致 base 和 toolsZCH 同时被激活。 解决办法就是 :conda deactivate 两次…...
Django 生产环境静态文件处理
python manage.py collectstatic 是 Django 提供的一个非常重要的管理命令,用于将项目中的静态文件收集到一个指定的目录中。这在部署 Django 项目时尤其重要,因为静态文件需要被 Web 服务器(如 Nginx 或 Apache)提供服务…...
语法: result=frexp(value, exp);
FREXP()是C语言里的内部函数,根据需要了解。 语法: resultfrexp(value, &exp); 参数: value是一个浮点数; exp是一个有符号的整型数; 返回值: 返回值result是一个浮点数,其有效范围是 0.5(含)到 1.0(不含&…...
ArcGIS Pro 制作风台路径图:从数据到可视化
一、引言 台风,作为自然界极具破坏力的气象现象之一,其路径的精准预测与直观呈现对于防灾减灾工作至关重要。 在数字化时代,借助专业的地理信息系统(GIS)软件,如 ArcGIS Pro,我们能够高效地将…...
#pandas #python#数据标注 pd.crosstab()
题目: device_status.txt 存储了工业互联网平台上收集的设备运行状态数据,数 据中有以下内容: device_id:设备编号,字符串类型,长度为 8 status_time:状态时间,日期时间类型&…...
self Attention为何除以根号dk?(全新角度)
全网最独特解析:self Attention为何除根号dk? 一、假设条件:查询向量和键向量服从正态分布 假设查询向量 q i q_i qi和键向量 k j k_j kj的每个分量均为独立同分布的随机变量,且服从标准正态分布,即:…...
SpringBoot @Scheduled注解详解
Scheduled 是 Spring Framework 中用于实现定时任务的核心注解,能够方便地配置方法在特定时间或周期执行。以下是详细解析: 1. 启用定时任务 在 Spring Boot 中,需在配置类添加 EnableScheduling 注解以启用定时任务支持: Co…...
在大数据开发中spark是指什么?
hello宝子们...我们是艾斯视觉擅长ui设计和前端数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 在数字经济蓬勃发展的今天,数据已成为驱动商业决策、科学研究和城市治理的核心燃料。面对…...
从点灯开始的51单片机生活
陵谷纷纭新事改,筑台土石未应迟。 目录 sfr与sbit?不靠定时器的delay_ms延时函数所谓寄存器 sfr与sbit? 这第一课咱们主要来先理解一下sfr与sbit,以下可能是咱们这些新手朋友常见的点灯代码: #include<regx52.h&g…...
AI大模型落地:昆仑技术的东方解法
DeepSeek的横空出世,一举打破“算力封锁”的神话,标志着中国AI企业在AI大模型技术路径上取得彻底突破。 不过,DeepSeek等AI大模型的突破,固然大幅推动AI产业的整体发展,但算力基础设施能否跟上,也将决定未…...
Spring Boot 与 MyBatis Plus 整合 KWDB 实现 JDBC 数据访问
引言 本文主要介绍如何在 IDEA 中搭建一个使用 Maven 管理的 Spring Boot 应用项目工程,并结合在本地搭建的 KWDB 数据库(版本为:2.0.3)来演示 Spring Boot 与 MyBatis Plus 的集成,以及对 KWDB 数据库的数据操作…...
VSCode+arm-none-eabi-gcc交叉编译+CMake构建+OpenOCD(基于STM32的标准库/HAL库)
前言:什么是CMake? Answer:简而言之,CMake是Make的maker。 一、CMake的安装 进入CMake官网的下载地址Get the Software,根据系统安装对应的Binary distributions。 或者在CMake——国内镜像获取二进制镜像安装包。 …...
MarsCode AI实战:利用DeepSeek 快速搭建你的口语学习搭子
资料来源:火山引擎-开发者社区 成品抢先看! 自从MarsCode AI Chat模型全新升级,接入 Deepseek-R1、Deepseek-V3和豆包大模型1.5 三大模型,越来越多朋友注意到了AI编程能给我们带来的无限可能,也开始跃跃欲试想要尝试从…...
导出的使用
一.导出的具体使用步骤 1.在web开发中,导出是很常见的一个功能,当我进行个人项目练习的时候,导出的时候无法控制列宽以及居中样式,后续发现导出插件无法进行修改,整个插件较为简便易懂的同时,对于EX的控制…...
【OCR】总结github上开源 OCR 工具:让文字识别更简单
前言 在数字化的时代,光学字符识别(OCR)技术成为了我们处理文档、图像文字信息的得力助手。它能够将图像中的文字信息转换为可编辑和可处理的文本数据,极大地提高了信息处理的效率。今天,我要给大家介绍一些优秀的开源…...
struts1+struts2项目兼容升级到了spring boot 2.7
原项目比较复杂,集成了各种框架(struts1 struts2 spring3等),趁工作之余练练手,学习一下springboot。大概花了一周时间才调通。 一、调整jar版本,寻找合适的版本。 第一步、首先原项目JDK6,要…...
Odoo 18 中的列表(list) 、表单(Form)、数据透视表、图表视图、看板视图、活动视图、日历视图等综合应用实例
Odoo 18 中的 视图应用实例 在 Odoo 中,视图是用户界面中表示业务对象的重要组成部分。无论您是扩展现有功能还是创建全新的功能,业务对象都至关重要。这些对象通过不同类型的视图向用户展示,而 Odoo 会根据 XML 描述动态生成这些视图。 列…...
单元测试mock
一、背景 现在有A类,B类,C类,A类依赖B类,依赖C类,如果想要测试A类中的某个方法的业务逻辑。A类依赖其他类,则把其他类给mock,然后A类需要真实对象。这样就可以测试A类中的方法。 举例:Ticket类需要调用Flight类和Pas…...
PDF文件转Markdown,基于开源项目marker
首先我们来问下deepseek 为啥要选marker呢 基于深度学习,一看就逼格拉满。搞科研必备,效果应该不会太差。跟其他的阿猫阿狗工具没法比。 看下官网 https://github.com/VikParuchuri/marker 一看头像是个印度佬,自吹——又快又好。…...
mysql中find_in_set()函数用法详解及增强函数
MySQL的 FIND_IN_SET()函数是一种特殊的函数,它主要用于搜索一个字符串在一个逗号分隔的字符串列表中的位置。 函数的基本语法 FIND_IN_SET(str, strlist) 其中,str是你想要查找的字符串,而 strlist是一个包含多个以逗号分隔的字符串的列表…...
深入理解 JavaScript/TypeScript 中的假值(Falsy Values)与逻辑判断 ✨
🕹️ 深入理解 JavaScript/TypeScript 中的假值(Falsy Values)与逻辑判断 在 JavaScript/TypeScript 开发中,if (!value) 是最常见的条件判断之一。它看似简单,却隐藏着语言的核心设计逻辑,也是许多开发者…...
批量合并 PPT 文件,支持合并成单个文件也支持按文件夹合并
合并多个 PPT 为一个 PPT 文档是我们经常会碰到的需求,合并后不仅更容易管理,在某些场景(比如批量打印)下也非常的有用,那当我们需要批量合并多个 PPT 文档地时候,我们有没有比较高效的方法呢?今…...
Java复习
在开篇前首先申明一下,本文虽不够系统,但复习够用,尤其是快速回忆( •̀ ω •́ )✧与提问。 主打一个速度。 本文将会从Java的基础语法、面向对象、API、字符串、集合、进阶...等六方面讲起。 一、Java的基础语法: 1、Java入门…...
keepalived+nginx+tomcat高可用
1.要求 角色主机名软件IP地址用户client192.168.72.90keepalivedvip192.168.72.100mastermasterkeepalived, nginx192.168.72.30backupbackupkeepalived, nginx192.168.72.32webtomcat1tomcat192.168.72.41webtomcat2tomcat192.168.72.42 1.搭建Tomcat 1.1下载jdk wget http…...
RK3568 Android11 sh366006驱动
sh366006.c /* 谁愿压抑心中怒愤冲动咒骂这虚与伪与假从没信要屈膝面对生命纵没有别人帮一生只靠我双手让我放声疯狂叫囔今天的他 呼风可改雨不可一世太嚣张 --《不可一世》Beyond */ #include <linux/module.h> #include <linux/init.h> #include <linux/fs.h…...
实现分布式锁需要考虑哪些问题?
🔒 什么是分布式锁? 分布式锁是在分布式系统中控制共享资源访问的机制,用于解决高并发场景下数据不一致、操作冲突等问题。核心目标是保证跨进程 / 跨节点的互斥性,常见实现方案包括:数据库锁、Redis 锁、ZooKeeper 锁…...
【UI设计】一些好用的免费图标素材网站
阿里巴巴矢量图标库https://www.iconfont.cn/国内最大的矢量图标库之一,拥有 800 万 图标资源。特色功能包括团队协作、多端适配、定制化编辑等,适合企业级项目、电商设计、中文产品开发等场景。IconParkhttps://iconpark.oceanengine.com/home字节跳动…...
mysql-大批量插入数据的三种方式和使用场景
1.批量插入三种方式 INSERT INTO … SELECTINSERT INTO … VALUES (…)LOAD DATA INFILE ‘/path/to/datafile.csv’ INTO TABLE table_name 2.批量插入 2.1 INSERT INTO … SELECT 用途:从另一个表中选择数据并插入到目标表中。 语法示例: INSERT …...
创建自己的github.io
1、创建GitHub账号 GitHub地址:https://github.com/ 点击Sign up创建账号 如果已创建,点击Sign in登录 2、创建仓库 假设Owner为username,则Repository name为username.github.io说明: 1、Owner为用户名 2、Repository name为仓…...
Oracle 常用语法汇总
系列文章目录 本文对Oracle 常用的语法进行汇总 文章目录 系列文章目录一、Oracle 表&表字段操作:1.1 DDL语句(数据定义语言)Create、Alter、Drop、Truncate:1.1.1 建表:建表:注释COMMENT :表中字段的约束:表中字…...
java小白日记38(集合-List)
List接口基本介绍 List接口是collection接口的子接口 (1)List集合类中元素有序(即添加顺序和取出顺序一致)、且可以重复 (2)List集合中的每个元素都有其对应的顺序索引,即支持索引 …...
高能ISP模块功能说明
先看一些常见缩写: BPS:Bayer processing segment CPP:Camera post processor DE:Detailed enhancement EIS:Electronic image stabilization IFE:Image front-end engine IPE:Image-proc…...
单臂路由实验
单臂路由实验 文章目录 单臂路由实验单臂路由简介工作原理优点与缺点应用场景 实验拓扑实验需求:实验步骤:1.PC 配置 IP 地址2.PC3 属于 Vlan10,PC4 属于 Vlan20,配置单臂路由实现 Vlan10 和 Vlan20 三层互通2.1.在 SW2 上创建 Vl…...
SpringMVC全局异常处理机制
异常处理机制 异常处理的两种方式: 编程式异常处理:是指在代码中显式地编写处理异常的逻辑。它通常涉及到对异常类型的检测及其处理,例如使用 try-catch 块来捕获异常,然后在 catch 块中编写特定的处理代码,或者在 f…...
UDS诊断、ECU刷写、自动化测试、车联网测试、DTC故障注入测试、坏境测试、可靠性测试、压力测试、性能测试等
每日直播时间:(直播方式:腾讯会议) 周一到周五:20:00-23:00 周六与周日:9:00-17:00 向进腾讯会议学习的,可以关注我并后台留言 直播内容ÿ…...
C++的常用容器嵌套
在 C 中,数据结构之间的嵌套是非常常见的,尤其是在处理复杂数据时。以下是几种最常用的数据结构嵌套方式及其典型应用场景的总结: 1. std::vector 嵌套 std::vector 定义:std::vector<std::vector<T>>。用途…...
Mac - Cursor 配置 + GPT 4.0/4.5/o1/o3/Deepseek Api 使用
前言 新换了电脑,所以需要新配置一些环境。已经安装好了Goland,但近期可能有GoJava前端的需求,所以使用Cursor。 除去学校各种奇奇怪怪,这已经是一年多来配置的第4台Windows和第四台Mac的Golang环境了。。。且是自己工作外买的第…...
【数据挖掘】Python基础环境安装配置
【数据挖掘】Python基础环境安装配置 一、摘要二、安装Python3.13.2三、安装Jupyter Notebook四、安装Numpy和Pandas以及matplotlib五、安装scikit-learn库和seaborn库 一、摘要 本文主要介绍如何在Windows上安装Python3.13.2,然后基于该Python版本安装Jupyter not…...
详解string类+迭代器
迭代器 概念:在 C 中,迭代器是访问容器(如数组、列表、向量、字符串等)元素的一种方式。迭代器提供了一种统一的接口,使得你可以使用相同的代码来遍历不同类型的容器。迭代器本质上是一个指针或者指针的封装࿰…...
OpenCV DNN 模块使用指南
OpenCV DNN 模块使用指南 一、模块概述 OpenCV 的 DNN(深度神经网络)模块为开发者提供了强大的深度学习功能,能够加载并运行多种格式的预训练深度学习模型。此模块广泛应用于图像分类、目标检测、语义分割等众多计算机视觉任务。接下来&…...
温度(Temperature)在大模型输出中的作用与底层原理
温度(Temperature)在大模型输出中的作用与底层原理 在深度学习领域,尤其是自然语言处理(NLP)中,大型语言模型(LLM)的输出生成通常依赖于概率分布的采样。温度(temperatu…...
智能汽车图像及视频处理方案,支持视频智能拍摄能力
美摄科技,作为智能汽车图像及视频处理领域的先行者,凭借其卓越的技术实力和前瞻性的设计理念,为全球智能汽车制造商带来了一场视觉盛宴的革新。我们自豪地推出——美摄科技智能汽车图像及视频处理方案,一个集高效性、智能化、画质…...
一文讲清 C++ CRTP(Curiously Recurring Template Pattern,奇异递归模板模式)
CRTP是 C 中的一种模板元编程技术,其核心原理是通过模板继承和静态多态,在编译期实现基类对派生类成员的访问,从而避免运行时虚函数调用的开销。 1. CRTP 的基本结构 CRTP 的核心思想是:基类是一个模板类,其模板参数…...
如何用Function Calling解锁OpenAI的「真实世界」交互能力?(附Node.js 实战)
一、Function Calling:大模型的「手脚延伸器」 1.1 核心定义 Function Calling是OpenAI在2023年6月13日推出的革命性功能(对应模型版本gpt-3.5-turbo-0613和gpt-4-0613),允许开发者通过自然语言指令触发预定义函数,实…...
MySQL:float,decimal(1)
会四舍五入 无符号浮点数 更改321zyy1下的salary 为float类型 decimal:...
基于DrissionPage的DY无水印视频采集
基于DrissionPage的Dy无水印视频采集技术解析 目录 一、项目背景与痛点分析 1.1 典型应用场景1.2 传统方案痛点对比1.3 需求分析流程图二、系统架构设计 2.1 核心架构图2.2 执行流程图解三、开发环境配置 3.1 版本要求3.2 环境搭建指南四、实现流程详解 4.1 主要处理阶段4.2 关…...