【Linux】Petalinux驱动开发基础
基于Petalinux做Linux驱动开发。
部分图片和经验来源于网络,若有侵权麻烦联系我删除,主要是做笔记的时候忘记写来源了,做完笔记很久才写博客。
专栏目录:记录自己的嵌入式学习之路-CSDN博客
目录
1 一个完整的Linux系统(针对Zynq)
1.1 PS部分
1.2 PL部分(若没用到PL就不需要这个部分):
2 Petalinux的内核源码获取
3 系统编译过程
4 NFS挂载根文件系统(Rootfs)的条件
5 交叉编译
6 驱动模块的开发
6.1 驱动的运行方式
6.2 file_operations结构体
6.3 驱动模块的加载和卸载
6.4 一个驱动程序必须有的东西
6.5 字符设备的注册和注销
6.6 一个字符设备驱动必须有的东西
6.7 设备号
6.8 内核空间与用户空间
7 地址映射
7.1 相关函数
8 设备树
8.1 是什么
8.2 为什么
8.3 设备树相关概念
8.4 一个典型的设备树文件
8.5 设备树节点的基本格式
8.6 节点属性
8.7 特殊节点
8.8 如何定位一个节点
8.9 内核启动过程中设备树的解析过程
8.10 如何添加一个设备树节点
8.11 如何引用一个节点
8.12 驱动与设备树交互的函数
8.13 设备树使用注意事项
9 内核的内存申请
9.1 常见的作用域
9.2 驱动程序中常使用static的原因
9.3 动态内存申请
9.4 kmalloc函数
9.5 kzalloc函数
9.6 vmalloc函数
9.7 devm_kmalloc/devm_kzalloc函数
9.8 devm_kmalloc_array/kmalloc_array
10 驱动与用户空间的交互函数
10.1 read函数
10.2 write函数
10.3 unlocked_ioctl
10.4 对比
11 ioctl详解
11.1 ioctl协议的命令组成
11.2 ioctl的宏
11.3 用于输入输出的时候需要注意的点
12 Linux开发常用的头文件
12.1 驱动开发头文件
12.2 Linux应用开发头文件
13 Linux驱动开发常用的宏
1 一个完整的Linux系统(针对Zynq)
1.1 PS部分
五大要素:
(1)fsbl(First Stage Boot Loader) -> zynq_fsbl.elf
负责初始化PS部分的硬件并加载第二阶段的引导加载程序。
(2)uboot(Universal Boot Loader) -> u-boot.elf、boot.scr(boot引导)
Bootloader 是在操作系统运行之前执行的一段小程序。通过这段小程序,可以初始化硬件设备、建立内存空间的映射表,从而建立适当的系统软硬件环境,为最终调用操作系统内核做好准备。
boot.scr文件则是用于给uboot执行和启动相关的行为的脚本,其中包含了加载内核、设备树、根文件系统等操作,我个人感觉和uboot中的bootm、bootz等命令类似。而这个文件整体又和uboot中bootargs、bootcmd这两个环境变量的作用类似。
(3)设备树文件 -> system.dtb
一种描述硬件的数据结构。
(4)linux内核 -> image.ub、(zImage)、(uImage)
内核是Linux系统的核心,负责管理系统的硬件和软件资源。其中,image.ub可以直接通过uboot上的bootm命令进行Linux的引导启动,也是放在SD卡BOOT分区就能自动引导的内核镜像文件;zImage是一种经过gzip压缩的Linux内核镜像格式;uImage是U-Boot引导加载程序专用的内核镜像格式。它是在zImage或Image(不加压缩的内核镜像)的基础上加上一个U-Boot头部信息(U-BootHeader),使U-Boot能够识别并加载内核镜像。
注:image.ub其实包含了system.bit,zImage,system.dtb三者。
(5)根文件系统 -> rootfs.tar.gz
根文件系统提供了操作系统运行所需的文件和程序。
1.2 PL部分(若没用到PL就不需要这个部分):
(1)比特流(Bitstream)文件 -> system.bit
FPGA的配置文件,用于初始化PL部分的硬件。
2 Petalinux的内核源码获取
进行驱动开发时往往需要Linux的源码,但在Xilinx的Github中不一定有指定版本(petalinux编译时的版本)的Linux内核源码,例petalinux 2023.1的6.1.5版本的内核就没有打包在那里。
而petalinux编译的过程中,默认是会删除掉其解压出来的源码的。要拿到它编译的源码,可以修改<plnx_proj>/project-spec/meta-user/conf/petalinuxbsp.conf,加上RM_WORK_EXCLUDE += "linux-xlnx",编译后可以在<plnx_proj>/build/tmp/work-shared/zynq-generic-7z020/kernel-source中获取源码。
若需要uboot源码,则加上RM_WORK_EXCLUDE += “u-boot-xlnx”。
3 系统编译过程
普通的petalinux开发,最后会将fsbl、比特流文件、uboot、设备树这四个部分都打包到一个BOOT.BIN的文件中去。常用命令是:
petalinux-package --boot --fsbl --fpga --u-boot –-force
若进行Linux驱动开发,设备树文件、linux内核、根文件系统以及比特流文件都是有可能经常发生改动的,因此要尽量将这些分离出来。
(1)首先,是在编译时,仅将fsbl和uboot编译并打包进BOOT.BIN中,因为这两个文件基本不会变:
petalinux-build -c bootloader //编译fsbl
petalinux-build -c u-boot //编译uboot
petalinux-package --boot --fsbl --u-boot --dtb no –force//打包两者进BOOT.BIN,并放过其他成员。
(2)其次,是petalinux-build后修改boot.scr,因为以这样的方式编译出来的boot.scr脚本的内容是不对的,具体就是:
将部分对uImage的操作改为对zImage的操作(这里主要就是不使用image.ub改用zImage了);
并添加对system.bit的操作(添加关于比特流的内容是因为没有将比特流打包进BOOT.BIN,过程中生成的boot.sc也因此没有与其相关的操作,所以要手动添加);
具体可以看正点原子的教程或看正常用petalinux整合编译时的boot.scr文件,这里其实就是将其修改为正常boot.scr该有的样子。最后是将原版改名为boot.cmd.default,并删掉第一行(包含乱码的行)再使用以下命令重新生成为boot.scr:
mkimage -c none -A arm -T script -d boot.cmd.default boot.scr
要重新生成一个boot.scr的理由也很简单,就是因为boot.scr文件的头部带有一些生成的二进制数据,直接修改boot.scr是不行的。
(3)接着,给Linux源码增加设备树文件,从上面编译到的文件中取(路径为<petalinux项目根目录>/components/plnx_workspace/device-tree/device-tree),具体需要pcw.dtsi,pl.dtsi,system-top.dts,zynq-7000.dtsi和system-conf.dtsi这五个。将其放置到源码/arch/arm/boot/dts目录中并根据需要对system-user.dtsi和该目录下的MAKEFILE进行修改。
(4)然后,利用make xilinx_zynq_defconfig命令设置内核配置;并使用make -j8编译内核。该步会在arch/arm/boot中生成所需的内核镜像文件zImage,在arch/arm/boot/dts生成设备树二进制文件system-top.dtb。若仅修改了设备树文件,可以仅编译它,用命令make dts。
(5)其后,回到petalinux项目中,用petalinux-config -c rootfs命令和petalinux-build -c rootfs命令配置并编译根文件系统得到rootfs.tar.gz。
(6)最后,在SD卡的BOOT分区,放入文件。用BOOT.BIN,boot.scr,system.bit,zImage,system.dtb五个文件代替普通Petalinux开发的BOOT.BIN,boot.scr和image.ub三个文件的方案:
BOOT.BIN :来自步骤(1),是仅包含fsbl和uboot的启动引导文件;
boot.scr :来自步骤(2),是添加比特流操作行为且更改boot内核行为后的boot脚本;
system.bit :来自步骤(1),是petalinux项目生成的比特流文件;
zImage :来自步骤(4),是Linux内核;
system.dtb :来自步骤(4),由system-top.dtb文件改名获得,是设备树二进制文件。
(7)最最后,将根文件系统解压后放入SD卡的rootfs分区:
rootfs.tar.gz :来自步骤(5),根文件系统的压缩包。
(附加)使用NFS挂载根文件系统会更好,因为不用经常将SD卡拿出来修改rootfs分区,而boot分区则是进入Linux后随便改,反正进系统后该分区就没有实际的用处了。
4 NFS挂载根文件系统(Rootfs)的条件
(1)Ubuntu安装NFS
sudo apt install nfs-kernel-server
(2)Ubuntu一个创建NFS的挂载路径
假设为/home/xxx/workspace/nfs
(3)Ubuntu修改NFS配置文件
sudo vi /etc/exports
在文件末添加如下内容:
/home/xxx/workspace/nfs *(rw,sync,no_root_squash)
(4)Ubuntu重启rpcbind服务和NFS服务(其实重启系统最好)
sudo /etc/init.d/rpcbind restart
sudo systemctl start nfs-kernel-server.service
(5)网络硬件设置
Zynq开发板(用网线PS口)与Ubuntu(用网络桥接)连接到同一路由器上。
(6)Ubuntu网络软件设置
通过ifconfig命令查看Ubuntu的局域网IP地址、网关地址、掩码等。
(7)Zynq网络软件设置
开机并在倒计时前回车进入uboot,使用dhcp命令自动获取IP,依次使用以下命令将相关配置写入开发板,具体IP要根据实际情况更改:
setenv ipaddr 192.168.100.10 //开发板 ip 地址
setenv gatewayip 192.168.100.1 //开发板网关
setenv netmask 255.255.255.0 //开发板 ip 地址掩码
setenv serverip 192.168.100.2 //ubuntu ip地址
最后使用saveenv命令将其保存。
(8)Zynq boot命令参数设置
使用以下命令设置boot要执行的参数:
setenv bootargs 'console=ttyPS0,115200 root=/dev/nfs rw nfsroot=192.168.100.2:/home/XXX/RootFS_NFS,nfsvers=3 ip=192.168.100.10:192.168.100.2:192.168.100.1:255.255.255.0::eth0:off'
最后使用saveenv命令保存。
至此,设置完毕。后续调试时,只有boot分区需要提前放好在SD卡中,rootfs直接解压在Ubuntu的/home/xxx/workspace/nfs/rootfs目录后,打开Zynq开发板就能自动挂载根文件系统。
5 交叉编译
当主机平台(运行编译器的平台)和目标平台(产生的程序将在其上运行的平台)不兼容时,该过程就叫做交叉编译。
petalinux装好后的编译环境:
由none可以看出,这些编译器是没有编译linux的能力的。而Petalinux在构建linux系统过程中会编译生成linux交叉编译工具链,然后使用其构建 linux 系统,可以在Petalinux工程下使用“find . -name "arm-xilinx-linux-gnueabi-gcc"”命令找到相应的痕迹:
需要拿到交叉编译的SDK,需要对某一个petalinux项目执行petalinux-build --sdk,编译好的sdk安装脚本是/项目/image/linux中的sdk.sh,安装到某一地方后安装程序会提示后续需要配置sdk环境的命令,可以写个别名放到~/.bashrc中方便使用。
安装了SDK后的arm包:
6 驱动模块的开发
6.1 驱动的运行方式
(1)编译进内核;
(2)编译成模块,在内核启动后使用insmod命令加载驱动模块;
一般在调试开发时是编译成模块,开发完成后就可以在编译成模块和编译进内核中选择了。
6.2 file_operations结构体
位于Linux内核/include/linux/fs.h中,其中fs是file system的缩写。该结构体是Linux内核驱动操作函数集合。
6.3 驱动模块的加载和卸载
(1)加载
insmod:加载指定的.ko模块,但不能解决模块的依赖关系,比如 drv.ko依赖 first.ko这个模块,就必须先使用 insmod命令加载 first.ko这个模块,然后再加载 drv.ko 这个模块;
modprobe(推荐):modprobe 会分析模块的依赖关系,然后将所有依赖的模块都加载到内核中,因此 modprobe命令相比 insmod 要智能一些。其次modprobe还有错误检查、错误报告等功能;
注意:modprobe命令默认会去/lib/modules/<kernel-version>目录中查找模块,如果没有的话需要自行创建,如petalinux2020.2就需要创建/lib/modules/5.4.0-150-generic目录。
注意:使用modprobe命令前,需先运行depmod建立系统的模块依赖关系。
(2)卸载
rmmod(推荐):卸载某个模块;
modprobe:卸载某个模块及其依赖的模块,而因为该模块依赖的模块也有可能在被其他模块所使用,卸载会出问题,所以不推荐使用modprobe来卸载模块;
6.4 一个驱动程序必须有的东西
(1) 驱动入口函数:static int __init xxx_init(void)
(2) 驱动出口函数:static void __exit xxx_exit(void)
(3) 指定驱动入口函数的语句:module_init(xxx_init); // 指定后加载模块就会自动运行驱动入口函数
(4) 指定驱动出口函数的语句:module_exit(xxx_exit); // 指定后卸载模块就会自动运行驱动出口函数
(5) 开源许可证类型:MODULE_LICENSE(str) //添加模块LICENSE信息(必须)
(6) 作者信息:MODULE_AUTHOR(str
相关文章:
【Linux】Petalinux驱动开发基础
基于Petalinux做Linux驱动开发。 部分图片和经验来源于网络,若有侵权麻烦联系我删除,主要是做笔记的时候忘记写来源了,做完笔记很久才写博客。 专栏目录:记录自己的嵌入式学习之路-CSDN博客 目录 1 一个完整的Linux系统(针对Zynq) 1.1 PS部分 1.2 PL部分(若…...
提升办公效率的PDF转图片实用工具
软件介绍 这款专注于PDF文档处理的工具功能单一但实用,能够将PDF文件内容智能提取并自动拼接成长图,为用户提供便捷的图片化文档处理方案,无需复杂设置即可轻松上手。 简洁直观的用户界面 软件界面设计简洁清爽,没有任何多余…...
动态库与ELF加载
目录 动态库 ELF格式 ELF和后缀的区别 什么是目标文件 ELF文件中的地址--虚拟地址 动静态库和可执行文件 动态库ELF加载 为什么编译时静态库需要指定库?而运行时不需要指定库的,但是动态库需要呢? 总结: 动态库 动态库制作需要的.o文件需要使…...
算法每日一题 | 入门-顺序结构-数字反转
数字反转 题目描述 输入一个不小于 且小于 ,同时包括小数点后一位的一个浮点数,例如 ,要求把这个数字翻转过来,变成 并输出。 输入格式 一行一个浮点数 输出格式 一行一个浮点数 输入输出样例 #1 输入 #1 123.4输出 #1 …...
ROS2学习笔记|实现订阅消息并朗读的详细步骤
本教程将详细介绍如何使用 ROS 2 实现一个节点订阅另一个节点发布的消息,并将接收到的消息通过 espeakng 库进行朗读的完整流程。以下步骤假设你已经安装好了 ROS 2 环境(以 ROS 2 Humble 为例),并熟悉基本的 Linux 操作。 注意&…...
【Hot 100】 146. LRU 缓存
目录 引言LRU 缓存官方解题LRU实现📌 实现步骤分解步骤 1:定义双向链表节点步骤 2:创建伪头尾节点(关键设计)步骤 3:实现链表基础操作操作 1:添加节点到头部操作 2:移除任意节点 步骤…...
web应用开发说明文档
工程目录结构 FACTORY--bin #网络流可执行程序 参考后文1.1部分文字说明webrtc-streamer--deployment #部署相关的配置--mysql #参考1.3 mysql数据库详细说明--conf #存放mysql的配置文件--data #存放pem加密…...
快速搜索与管理PDF文档的专业工具
软件介绍 在处理大量PDF文档时,专业的文档管理工具能显著提升工作效率。这款工具能够帮助用户快速检索PDF内容,并提供了便捷的合并与拆分功能,让复杂的PDF操作变得简单高效。 多文件内容检索能力 不同于传统PDF阅读器的单文件搜索局…...
在GPU集群上使用Megatron-LM进行高效的大规模语言模型训练
摘要 大型语言模型在多个任务中已取得了最先进的准确率。然而,训练这些模型的效率仍然面临挑战,原因有二:a) GPU内存容量有限,即使在多GPU服务器上也无法容纳大型模型;b) 所需的计算操作数量可能导致不现实的训练时间。因此,提出了新的模型并行方法,如张量并行和流水线…...
NocoDB:开源的 Airtable 替代方案
NocoDB:开源的 Airtable 替代方案 什么是 NocoDB?NocoDB 的主要特点丰富的电子表格界面工作流自动化应用商店程序化访问 NocoDB 的应用场景使用 Docker 部署 NocoDB1. 创建数据目录2. 运行 Docker 容器3. 访问 NocoDB 注意事项总结 什么是 NocoDB&#x…...
关于Python:7. Python数据库操作
一、sqlite3(轻量级本地数据库) sqlite3 是 Python 内置的模块,用于操作 SQLite 数据库。 SQLite 是一个轻量级、零配置的关系型数据库系统,整个数据库保存在一个文件中,适合小型项目和本地存储。 SQLite 不需要安装…...
修改ollama.service都可以实现什么?
通过修改 ollama.service 系统服务单元文件,可以实现以下核心配置变更: 一、网络与访问控制 监听地址与端口 通过 Environment="OLLAMA_HOST=0.0.0.0:11434" 修改服务绑定的 IP 和端口: 0.0.0.0 允许所有网络接口访问(默认仅限本地 127.0.0.1)。示例:改为 0.0.…...
k8s笔记——kubebuilder工作流程
kubebuilder工作流程 Kubebuilder 工作流程详解 Kubebuilder 是 Kubernetes 官方推荐的 Operator 开发框架,用于构建基于 Custom Resource Definitions (CRD) 的控制器。以下是其核心工作流程的完整说明: 1. 初始化项目 # 创建项目目录 mkdir my-opera…...
长江学者答辩ppt美化_特聘教授_校企联聘学者_青年长江学者PPT案例模板
WordinPPT / 持续为双一流高校、科研院所、企业等提供PPT制作系统服务。 长江学者特聘教授 “长江学者奖励计划”中的一类,是高层次人才计划的重要组成部分,旨在吸引和培养具有国际领先水平的学科带头人。特聘教授需全职在国内高校工作,是高…...
Vscode/Code-Server 安装中文包——CI/CD
前言 啊好多人问我怎么还不更新,其实本月是已经写了一篇测评的,但是鉴于过于超前会给产品带来不好的影响,所以就没有公开。那么既然这样本月就再更新一篇。 首先 声明 一点,安装中文包的初衷不是看不懂英文,也不是对…...
【信息系统项目管理师-论文真题】2012上半年论文详解(包括解题思路和写作要点)
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 试题1:论信息系统工程的风险管理1、写作要点2、解题思路对项目风险的认识和项目风险管理的基本过程、主要方法、工具信息系统项目最主要的风险是什么试题2:论信息系统工程项目可行性研究1、写作要点2、解题思…...
PowerPC架构详解:定义、应用及特点
一、PowerPC架构的定义 PowerPC(Performance Optimization With Enhanced RISC – Performance Computing) 是一种由IBM、摩托罗拉(现NXP)和苹果于1991年联合开发的精简指令集(RISC)处理器架构,…...
IP伪装、代理池与分布式爬虫
一、动态代理IP应用:代理池的获取、选择与使用 代理池技术的核心是通过动态切换IP地址,让爬虫看起来像不同用户在访问网站,从而规避封禁。 (一)代理池的获取途径 1. 免费代理:低成本但高风险 免费代理可…...
【Arthas】火焰图优化应用CPU(问题原因:获取调用栈)
优化场景总结归纳 1. 问题背景 现象:在公共搜索功能中,火焰图分析发现 获取Java调用栈(StackTrace) 占用了约 6%的CPU(日常流量下),系统高负载时占比更高。原因: 每次外部API调用时…...
回溯算法详解(Java实现):从组合到排列的全面解析
引言 回溯算法是一种强大的算法思想,广泛应用于解决各种组合优化问题。它通过系统性地尝试所有可能的解,并在发现当前路径无法得到解时立即回溯,从而高效地找到问题的解。在本文中,我们将深入探讨回溯算法的核心思想、三要素、通…...
【BLE】【nRF Connect】 精讲nRF Connect自动化测试套件(宏录制、XML脚本)
目录 前言 1. nRF Connect自动化测试介绍 1.1. nRF connect宏录制功能介绍 1.2. 电脑端XML方式 1.3 实际应用案例 1.3.1 BLE 稳定性测试 1.3.2 设备固件更新(DFU)测试 1.3.3 批量设备配置 1.4 操作步骤 1.5 注意事项 2. nRF Connect日志记录 2.1. 日志记录功能 …...
springboot war包tomcat中运行报错,启动过滤器异常,一个或多个筛选器启动失败。
错误信息: "level": "ERROR", "thread": "localhost-startStop-1", "class": "o.a.c.c.C.[.[localhost].[/Crmeb-admin]", …...
基于开源AI大模型与AI智能名片S2B2C商城小程序的线上活动执行优化研究
摘要:本文以开源AI大模型、AI智能名片及S2B2C商城小程序为技术载体,探讨线上活动执行阶段的效能提升路径。通过分析某科技展会案例,发现AI智能名片可将参会者信息采集效率提升60%,S2B2C商城小程序的21链动模式使活动裂变传播速度提…...
解决奥壹oelove婚恋原生小程序上架问题,彻底解决解对问题增强版旗舰版通用
现在很多客户还不了解OElove小程序上架流程!因为很多用户对技术无感!随意上架工作都是要靠官方来辅助!这样在在二开性就会失去很多主动权!本人商业用户有全新原生态小程序源码(注意:这是原生非Uniapp&#…...
Java SE(7)——类和对象(二)
1.包(package) 1.1 包的定义 在Java中,包是一种用于组织和管理类,接口和其他包的机制。主要作用是防止命名冲突,并提供一种访问控制机制 1.2 package关键字 package关键字的主要作用是声明当前类在哪个包里面。 当然,用户也可以…...
Python 装饰器优化策略模式:电商促销折扣的优雅解法
问题背景:促销策略的重复陷阱 在电商促销系统中,我们曾面临这样的痛点: promos [fidelity_promo, bulk_item_promo, large_order_promo] # 6.1节原始方案 def best_promo(order):return max(promo(order) for promo in promos)当新增new…...
redis延时队列详细介绍
Redis延时队列是一种利用Redis数据结构的功能来实现延时任务调度的方法。在Redis中,常用的数据结构包括List(列表)和Sorted Set(有序集合)。延时队列通常是通过有序集合来实现的。 具体实现步骤如下: 将延…...
PHP 开发工程师如何借助 DeepSeek 提升工作效率
在当今数字化时代,PHP 开发工程师面临着不断提高工作效率和应对复杂项目需求的挑战。DeepSeek 作为一款先进的人工智能工具,为 PHP 开发工程师提供了一系列强大的功能,能够显著助力其日常工作。从代码生成与优化,到文档撰写和知识…...
Vibe Coding 新时代:AI 辅助编程完全指南
第一章:什么是 Vibe Coding?AI 编程的新范式 在传统编程的世界里,程序员需要掌握语法、算法和框架,一行一行地编写代码。但随着人工智能的快速发展,一种全新的编程方式正在兴起——这就是 Vibe Coding(氛围编程)。 Vibe Coding 的定义 Vibe Coding 是由 AI 研究者 An…...
Oracle RAC ‘Metrics Global Cache Blocks Lost‘告警解决处理
1. 引言: 前段时间鄙人检查处理过Oracle RAC Metrics Global Cache Blocks Lost’告警,在此总结分享下针对该报警的原因分析及处理办法。 2. 具体事件 通过排查发现造成该告警的原因是共享存储控制器损坏导致的。由于发生已经有段时间了,没…...
Go语言入门基础:协程
第21章 协程 目录 21.1 启动Go协程 协程的概念与特点启动协程的方法及示例协程执行顺序的控制 21.2 通道 通道类型及表示方式21.2.1 实例化通道21.2.2 数据缓冲21.2.3 单向通道21.2.4 通道与select语句 21.3 互斥锁 协程并发访问的逻辑问题互斥锁的使用示例 21.4 WaitGroup类…...
Servlet+tomcat
serverlet 定义:是一个接口,定义了java类被浏览器(tomcat识别)的规则 所以我们需要自定义一个类,实现severlet接口复写方法 通过配置类实现路径和servlet的对应关系 执行原理 当用户在浏览器输入路径,会…...
中间件和组件
文章目录 1. 前言2. 中间件介绍3. 组件介绍4. 区别对比5. 简单类比6. 总结 中间件和组件 1. 前言 中间件和组件是软件开发中两个重要的概念,但它们的定位和作用完全不同。中间件解决的事通信、跨系统、安全等问题,组件是解决具体业务模块,提高…...
piccolo-large-zh-v2 和 bge-m3哪个效果好?
环境: piccolo-large-zh-v2 bge-m3 问题描述: piccolo-large-zh-v2 和 bge-m3哪个效果好? 解决方案: 比较Piccolo-large-zh-v2(商汤)与BGE-M3(智源)的效果时,需结合…...
《告别试错式开发:TDD的精准质量锻造术》
深度解锁TDD:应用开发的创新密钥 在应用开发的复杂版图中,如何雕琢出高质量、高可靠性的应用,始终是开发者们不懈探索的核心命题。测试驱动开发(TDD),作为一种颠覆性的开发理念与方法,正逐渐成…...
哈希函数详解(SHA-2系列、SHA-3系列、SM3国密)案例:构建简单的区块链——密码学基础
文章目录 一、密码哈希函数概述1.1 哈希函数的基本概念1.2 哈希函数在数据安全中的应用 二、SHA-2系列算法详解2.1 SHA-2的起源与发展2.2 SHA-256技术细节与实现2.3 SHA-384和SHA-512的特点2.4 SHA-2系列算法的安全性评估 三、SHA-3系列算法详解3.1 SHA-3的起源与设计理念3.2 K…...
CUDA输出“hello world”
在我们学习任何一门编程语言的时候, 无疑当我们真正用其输出“hello world”的时候, 我们已经成功入门, 接下来要做的就是从入门到放弃了😆 接下来我们通过对比C和CUDA来学习CUDA的运行逻辑: C中的hello worldCUDA中的hello world文本编辑器编写源代码, 比如vscod…...
计算机视觉与深度学习 | 视觉里程计算法综述(传统+深度)
视觉里程计算法综述 1. 算法分类与原理1.1 传统几何方法1.2 深度学习方法2. 关键公式与模型2.1 本征矩阵分解2.2 深度学习模型架构3. 代码实现与开源项目3.1 传统方法实现3.2 深度学习方法实现4. 挑战与未来方向总结传统视觉里程计算法综述1. 算法分类与核心原理1.1 特征点法1.…...
c++ 函数参数传递
C 中的值传递和地址传递 在 C 中,函数参数传递主要有两种方式:值传递和地址传递(指针传递和引用传递都属于地址传递的变体)。 1. 值传递 特点 函数接收的是实参的副本对形参的修改不会影响原始变量适用于小型数据(…...
计算机视觉与深度学习 | 什么是图像金字塔?
图像金字塔详解 图像金字塔 图像金字塔详解1. **定义**2. **原理与公式****2.1 高斯金字塔****2.2 拉普拉斯金字塔**3. **代码示例****3.1 使用OpenCV实现****3.2 手动实现高斯模糊与降采样**4. **应用场景**5. **关键点总结**1. 定义 图像金字塔是一种多尺度图像表示方法,将…...
AI超级智能体教程(五)---自定义advisor扩展+结构化json输出
文章目录 1.自定义拦截器1.2自定义Advisor1.2打断点调试过程1.3Re-reading Advisor自定义实现 2.恋爱报告开发--json结构化输出2.1原理介绍2.1代码实现2.3编写测试用例2.4结构化输出效果 1.自定义拦截器 1.2自定义Advisor spring里面的这个默认的是SimpleloggerAdvisor&#…...
ActiveMQ 集群搭建与高可用方案设计(一)
一、引言 在当今分布式系统盛行的时代,消息中间件扮演着至关重要的角色,而 ActiveMQ 作为一款开源的、功能强大的消息中间件,在众多项目中得到了广泛应用。它支持多种消息传输协议,如 JMS、AMQP、MQTT 等 ,能够方便地实…...
MySQL数据操作全攻略:DML增删改与DQL高级查询实战指南
知识点4【MySQL的DDL】 DDL:主要管理数据库、表、列等操作。 库→表(二维)→列(一维) 数据表的第一行是 列名称 数据库是由一张或多张表组成 我们先学习在数据库中创建数据表 0、常见的数据类型: 1、…...
RabbitMQ 中的六大工作模式介绍与使用
文章目录 简单队列(Simple Queue)模式配置类定义消费者定义发送消息测试消费 工作队列(Work Queues)模式配置类定义消费者定义发送消息测试消费负载均衡调优 发布/订阅(Publish/Subscribe)模式配置类定义消…...
一种基于重建前检测的实孔径雷达实时角超分辨方法——论文阅读
一种基于重建前检测的实孔径雷达实时角超分辨方法 1. 专利的研究目标与实际问题意义2. 专利提出的新方法、模型与公式2.1 重建前检测(DBR)与数据裁剪2.1.1 回波模型与检测准则2.1.2 数据裁剪效果2.2 数据自适应迭代更新2.2.1 代价函数与迭代公式2.2.2 矩阵递归更新2.3 正则化…...
代购平台如何“说本地话,穿本地衣”
当海外消费者点开一个代购商城,看到满屏机械翻译的中式文案,他们大概率会默默关闭页面。还有数据显示,不符合本地审美的页面设计会导致70%的潜在客户流失,而专业的本地化改造能让订单转化率提升3倍以上。 01 AI翻译:让…...
C++调试(叁):编译qBreakpad并使用其生成Dump文件
目录 1.前言 2.生成Dump文件的第三方库 3.第三方库下载链接 4.编译qBreakpad 5.VS中使用qBreakpad 6.qBreakpad测试程序 前言 在第二篇文章中,我主要讲解了如何使用SetUnhandledExceptionFilter函数设置程序的异常回调,在设置的回调函数中调用MiniDumpWr…...
0基础 | STM32 | TB6612电机驱动使用
TB6612介绍及使用 单片机通过驱动板连接至电机 原因:单品机I/O口输出电流I小 驱动板:从外部引入高电压,控制电机驱动 电源部分 VM:电机驱动电源输入,输入电压范围建议为3.7~12V GND:逻辑电…...
Cycleresearcher:通过自动化评审改进自动化研究
1、引言 迄今为止,整个科学发现过程自动化的挑战在很大程度上仍未解决,特别是在生成和改进符合同行评审工作高标准的研究成果方面。此外,很少有工作涉及迭代反馈的整合,这对保持学术的健全性和新奇至关重要。当前的模型往往难以适…...
深入理解Redis SDS:高性能字符串的终极设计指南
📍 文章提示 10分钟掌握Redis核心字符串设计 | 从底层结构到源码实现,揭秘SDS如何解决C字符串七大缺陷,通过20手绘图示与可运行的C代码案例,助你彻底理解二进制安全、自动扩容等核心机制,文末附实战优化技巧ÿ…...