- 博客(59)
- 收藏
- 关注
原创 传统检索:BM25 及其变体与 DocT5query 检索算法对比
查询“神经网络原理”分解为词“神经”“网络”“原理”,文档得分基于优化后的 IDF 和默认参数,排名靠前文档为包含查询词的适中长度文档。: 查询“深度学习”通过翻译模型扩展为“deep learning”“神经网络”,文档包含扩展词的得分更高,排名更准确。: 查询“深度学习应用”分解为词“深度”“学习”“应用”,长文档因非线性归一化获得更公平的得分,排名更均衡。: BM25 的变体,优化文档长度归一化,引入非线性长度惩罚,减少对短文档的偏见,适合长文档检索。待定DocT5query。
2025-04-17 21:51:15
880
原创 3.Qt-基础布局以及事件
QHBoxLayout (Horizontal): 水平布局。QGridLayout: 网格布局。QVBoxLayout (Vertical): 垂直布局。QPushButton: 按钮。它是触发信号(Signal)的最常用控件。QLineEdit: 单行输入框。它通常是静态的,用户不能编辑。把控件“扔”进布局管理器里,让布局管理器帮我们设置位置。QMessageBox: 弹窗提示(报错、警告、询问)。要重写(Override)父类的虚函数。QColorDialog: 选颜色。
2025-12-06 14:42:44
127
原创 2.Qt-基础核心以及信号与槽
任何使用信号与槽的类,必须在类声明的私有部分(private)添加 Q_OBJECT 宏。这会告诉 Qt 的元对象编译器(MOC)为这个类生成额外的代码。创建时候选Qt Console Application (Qt 控制台应用程序)。QHash: 哈希表(查找速度比 QMap 快,但无序)。它会自动处理空格、自动换行,并且能直接打印 Qt 的对象。常用功能:格式化字符串、数字转换、拼接、分割。QList: Qt 中最通用的列表容器。QMap: 键值对映射(基于红黑树)。
2025-12-05 21:17:44
197
原创 16-Linux驱动开发-多核通信中的并发控制
比较维度原子操作 (Atomic Operations)自旋锁 (Spinlock)互斥体 (Mutex)定义与核心概念最小的不可分割指令序列。由硬件保证操作在执行过程中绝不会被中断,中间状态对外不可见。一种基于忙等待 (Busy-Wait) 的多线程同步锁机制。当获取锁失败时,执行单元不会挂起,而是在循环中不断检测锁状态。一种基于调度机制 (Sleep-Wait) 的互斥锁机制。当获取锁失败时,执行单元会主动放弃 CPU,进入睡眠状态等待唤醒。底层实现原理依赖 CPU 指令集架构 (ISA)。
2025-12-03 09:39:46
1009
原创 15-Linux驱动开发-PWM子系统
底层的寄存器操作(PWM控制器驱动)通常由芯片厂商(如 NXP, Rockchip 等)写好了,但作为驱动开发者,我们需要知道如何获取 PWM 设备、配置参数以及开启输出。
2025-11-29 19:17:33
248
原创 14-Linux驱动开发-输入子系统
Linux输入子系统(Input Subsystem)极大地简化了驱动开发的复杂度,让开发者只需关注硬件交互和事件上报,而无需关心数据如何传递给用户空间。
2025-11-29 16:20:35
203
原创 13-Linux驱动开发-中断子系统
顶半部/底半部机制的核心,就是把“紧急的硬件响应”和“耗时的软件处理”剥离开来,保证系统对外界事件始终保持高响应速度。Cortex-M4(MCU部分): 跑实时操作系统(RTOS)或裸机,追求极低的延迟。Cortex-A7(MPU部分): 跑 Linux,追求高吞吐量和多任务管理。驱动的生命周期分为两个层次:模块的加载/卸载,和设备的打开/关闭。顶半部 (Top Half):button_irq_hander。底半部 (Bottom Half):work_hander。这里是真正的硬件操作。
2025-11-29 15:47:20
322
原创 12-Linux驱动开发- SPI子系统
D/C (Data/Command): 高电平发数据,低电平发命令。为 SSD1306 OLED 编写一个字符设备驱动。RES (Reset): 复位引脚。高级 API (构建消息)简易 API (常用)
2025-11-28 21:04:05
364
原创 11-Linux驱动开发-I2C子系统–mpu6050简单数据透传驱动
告诉内核,在 I2C1 总线上有一个地址为 0x68 的设备,请加载名为 fire,i2c_mpu6050 的驱动程序来管理它。如果没有这个文件,i2c1 可能处于关闭状态 (disabled),或者引脚被挪作他用(比如被当成普通 GPIO)。MPU6050 是一款运动处理传感器,它集成了3轴MEMS陀螺仪,3轴MEMS加速度计。Linux 为了通用性,将 I2C 驱动分成了三层,实现了主机控制器与外设的解耦。上述只实现了查询式(Polling)I2C 数据透传。
2025-11-26 21:57:02
477
原创 10-Linux驱动开发-Pinctrl 子系统和 GPIO 子系统
Linux 内核说: “你不用自己算地址!告诉我你想做什么(比如:我要把这个脚设为高电平),剩下的由我来做。” 即:Linux 把引脚的操作分成了两类pinctrl 子系统是由芯片厂商来实现的,用于帮助我们管理芯片引脚并自动完成引脚的初始化,而我们要做的只是在设备树中按照规定的格式写出想要的配置参数即可。相当于菜单。1;1;2;2;它定义了板子上有哪些设备,并从菜单里勾选了这些设备需要的引脚配置。
2025-11-25 22:29:56
301
原创 9-Linux驱动开发-设备树=>设备树插件实现 RGB 灯驱动
dts.dtb.dts.dtbo&gpioa&gpioa设备树插件,顾名思义新建插入。我们不用改设备树源码只需要在内核源码的arch/arm/boot/dts/overlays/ 目录下新建一个.dts作为插件,编译后内核能够动态加载它。如果您编译插件时报错:Reference to non-existent node or label “gpioa”(找不到标签 gpioa)。要使用绝对路径引用法。
2025-11-24 21:31:29
181
1
原创 8-Linux驱动开发-设备树
而您在自己的板级文件(myboard.dts)里,只是想*“开启”或“修改”某个设备。如果我想在文件的外面或者另一个文件里修改它,写全路径太累了。编写一个简单的 Platform Driver,在 probe 函数中读取上面定义的所有属性。传递运行时的参数,告诉内核启动参数是什么,以及 printk 的打印信息应该从哪个串口吐出来。注意:如果节点内部有 reg 属性,那么 @ 后面的数字必须和 reg 里的起始地址一致。以后只需要写 &gpioa 就能找到这个节点,不用写 gpio@50002000。
2025-11-22 16:50:34
94
原创 7-Linux驱动开发-平台设备驱动
在现代 Linux 中,这部分 C 代码通常被 .dts 设备树文件取代了(内核会解析 dts 自动帮你完成上述步骤)/home/kun/kernal_code/ebf_linux_kernel-ebf_4.19_star/drivers/base/platform.c源码部分。, platform 总线的 match 函数指针,该函数指针指向的函数将负责实现平台总线和平台设备的匹配过程。struct platform_device描述一个具体硬件设备(如 LED、蜂鸣器)的核心结构体。
2025-11-21 22:27:59
80
原创 6-Linux驱动开发-设备模型
dev/ 下的设备文件(通过 cdev 创建)相当于数据通道(用来传大量数据),/sys/ 下的属性文件相当于控制面板(用来查看状态、开关功能、调整参数)向总线添加(移除)一个设备(驱动)时,便会在对应的列表上添加新的节点,同时对挂载在该总线的驱动以及设备进行匹配,在匹配过程中会忽略掉那些已经有驱动匹配的设备。连接处理器和设备之间的桥梁,总线驱动则负责实现总线的各种行为,其管理着两个链表,分别是添加到该总线的。上述三种属性的每一种具体使用方法,流程如下:定义读,定义写,宏定义,注册,注销。
2025-11-21 19:59:48
93
原创 Linux应用开发-13-POSIX共享内存(补充)
POSIX 共享内存 (Writer 和 Reader)共享内存写入者 (shm_writer.c)共享内存读取者 (shm_reader.c)POSIX 共享内存函数需要链接 librt 库(实时库)。arm-gcc shm_writer.c -o writer -lrtarm-gcc shm_reader.c -o reader -lrt
2025-11-19 21:17:45
106
原创 Linux应用开发-11-POSIX消息队列(补充)
常用头文件POSIX 消息队列 (Sender 和 Receiver)消息队列发送者 (mq_sender.c)消息队列接收者 (mq_receiver.c)编译时候POSIX 消息队列函数需要链接 librt 库(实时库)。arm-gcc mq_sender.c -o sender -lrtarm-gcc mq_receiver.c -o receiver -lrt
2025-11-19 20:57:04
125
原创 5-Linux驱动开发-关于LED的字符设备
在有操作系统时,驱动程序是连接硬件和内核的“桥梁”,不仅要包含操作寄存器的代码,还必须实现一套由操作系统规定的标准接口(如read/write),嵌入内核后让上层应用能通过统一的系统调用来访问硬件。高速,高吞吐量,在 STM32MP157 中,分为 AHB1, AHB2, AHB3, AHB4, AHB5, AHB6,连接高速外设(USB, DMA, GPIO)。低速,低功耗,针对简单的外设优化,有APB1, APB2, APB3, APB4, APB5,连接通信接口(UART串口, I2C, SPI)
2025-11-18 21:26:33
777
原创 4-Linux驱动开发-字符设备驱动
说明:Linux 是文件型系统,所有硬件都会在对应的目录 (/dev) 下面用相应的文件表示。特点是访问文件的方式访问设备。
2025-11-16 19:47:48
387
原创 3-Linux驱动开发-简单内核模块代码详解
calculation.ko依赖parametermodule.ko中的参数itype和定义的函数(EXPORT_SYMBOL暴露的)make后生成了相关文件。
2025-11-15 16:17:49
227
原创 2-Linux驱动开发-内核;内核模块;设备树;设备树插件
对比项设备树 (Device Tree)设备树插件 (Device Tree Overlay)作用主蓝图 (完整的硬件地图)补丁 (对主蓝图的“修改”或“补充”)源码示例编译方式make dtbs 会自动找到。需将 .dts 放入 overlays/ 目录,并修改 overlays/Makefile 进行登记。编译命令make … dtbs (同一个命令,它会“顺带”编译插件)编译产物stm32mp157a-basic.dtb (.dtb 文件)
2025-11-14 20:09:53
1160
原创 1-Linux驱动开发-内核模块介绍
内核模块,经过编译,最终形成.ko 为后缀的 ELF (Excutable And Linking Format) 文件。内核模块LKM (Loadable Kernel Module) 是一种在内核运行时加载代码来实现特定功能的机制。模块被加载后,就成为内核的一部分,在内核空间运行,但它本身不被编译进内核映像中。为了解决 Linux 宏内核架构下,将所有驱动编入内核导致其过于“臃肿”的问题。1.lsmod (List Modules):列出(List)当前已经加载到内核中的所有模块。
2025-11-11 20:18:39
1051
原创 Linux应用开发-18- select、poll、epoll
单个进程就可以同时处理 多个网络连接的 I/O,select、poll、epoll 等函数(操作系统内核处理,进程不用耗费资源去轮询)会不断的 轮询它们所负责的所有 socket ,当某个 socket 有数据到达了,就通知用户进程。它请内核“监视”三组文件描述符(FD):readfds(想读的), writefds(想写的), exceptfds(关心异常的)。Synchronous在同步文件 I/O 中,线程启动 I/O 操作,并立即进入等待状态,直到 I/O 请求完成。I/O 操作中的数据。
2025-11-09 22:42:20
609
原创 Linux应用开发-17-套接字
IPC (进程间通信)有System V以及POSIX IPC两大体系,所有进程都运行在同一台 Linux 机器上。它们通过共享这台机器的内核资源(如内存、文件系统)来进行通信。套接字(Socket)目的是进行“跨机器通信”。
2025-11-08 18:56:06
472
原创 Linux应用开发-16-POSIX 互斥锁
演示信号量没有归属权。[notifier_thread] 可以 sem_post(V操作),而 [main] 线程可以 sem_wait(P操作)。pthread_mutex_t(互斥锁)通过设置递归属性,可以安全地被同一个线程连续加锁两次,而不会死锁。演示互斥锁有归属权。[main] 线程上锁,[thief_thread] 尝试解锁,操作会失败。sem_t(初始值为1)不能被同一个线程连续wait两次,否则会立即死锁。锁的两种方式:静态初始化和动态初始化。互斥锁的测试 (失败)
2025-11-08 15:55:35
350
原创 Linux应用开发-15-POSIX 信号量
Linux 同时支持两种标准。包含多个sem_initsem_opensem_waitsem_postsem_closesem_unlinksemgetsemopsemctlsemopsemctlsem_init()sem_open()key_tftok()sem_unlinkipcrmSEM_UNDOsemopSEM_UNDO。
2025-11-08 14:08:04
708
原创 Linux应用开发-13-SystemV共享内存
优点:使用共享内存进行进程间通过访存进行通信,函数接口简单,系统中的任意进程都可以对共享内存进行读写操作。缺点:共享内存没有提供同步的机制,要借助其他的手段(如信号量、互斥量等)来进行进程间的同步工作。将 shmget() 创建的内核内存块,“连接” (Attach) 到当前进程的虚拟地址空间中。shmat() 的逆操作。它将共享内存从当前进程的虚拟地址空间中“分离” (Detach)。向内核申请(创建)一块指定大小的共享内存,或者获取一个已存在的共享内存的ID。用于控制共享内存的状态,主要的是删除它。
2025-11-07 10:44:54
260
原创 Linux应用开发-12-system-V IPC 信号量
信号量:本质上是一个计数器,用于协调多进程间对共享数据对象的读取,它不以传送数据为主要目的,它主要是用来保护共享资源,信号量等待和发送信号,有两种操作PV:P 操作是申请资源,V 操作是释放资源。
2025-11-06 22:33:43
186
原创 Linux应用开发-11-SystemV消息队列
msgget() - (获取/创建消息队列)msgctl() - (控制消息队列)msgsnd() - (发送消息)msgrcv() - (接收消息)
2025-11-06 21:29:43
735
原创 Linux应用开发-10-管道
它在内核的内存中创建,没有任何文件系统路径,因此只能被“继承”了它的文件描述符的进程(即 fork() 出来的子进程)访问。管道的优势在于,它可以传输大量的、连续的“数据流”(一整篇文章或一个命令的所有输出结果)。结果:grep 会读取从管道传来的每一行(即每个进程信息),如果某一行包含 “root” 字符串,grep 就会把这一行打印出来。它允许数据从一个进程的输出端*,直接“流向”另一个进程的输入端。“写入者”写入数据:另一个 fifo_writer 进程调用 write(),成功将数据写入了管道。
2025-11-06 20:23:26
831
原创 Linux应用开发-9-信号
软中断信号,用于通知进程发生了异步事件,它是 Linux 系统响应某些条件而产生的一个事件kill -l查看系统中支持的信号种类(具体信息自行查阅)信号核心区别:非实时信号 - 实时信号,关键在于“是否排队”。
2025-11-05 22:31:03
698
原创 Linux应用开发-8-进程
ls 命令会把它当作一个单一的、名字很奇怪的(包含分号的)文件名去尝试打开,结果只会是“文件未找到”。:终止进程之前,会执行一系列“清理”工作,会刷新(Flushing)I/O 缓冲区,确保在进程死亡前,把这块缓冲区里所有剩余的数据全部写入到它们的目标位置(如文件或屏幕)。wait() 要与 fork() 配套出现,如果在使用 fork() 之前调用 wait(),wait() 的返回值则为-1,正。-----共有两种方法:system() , fork() + exec()。fork():克隆。
2025-11-05 20:54:13
1013
原创 Linux应用开发-7-串口通讯与终端设备
主要控制四大方面的行为1.物理层参数 (Hardware Parameters):定义最基本的电气信号规则。波特率 (Baud Rate):通信双方的速度,必须完全一致。数据位 (Data Bits):一帧数据包含多少个bit(通常是8)。停止位 (Stop Bits):一帧数据的结束标记(通常是1位)。校验位 (Parity Bit):用于简单的数据错误检测(通常是无校验)。2.输入数据处理 (Input Processing):定义内核在将接收到的数据交给应用程序之前,要对数据做的预处理。
2025-11-01 22:36:49
1068
原创 Linux应用开发-5-STM32MP157开发板上控制LED和KEY
注:trigger决定了这个LED由谁来控制。brightness控制LED的亮灭。/dev/input/by-path目录查看具体的硬件设备。传统方式 (sysfs)通过文件操纵操作LED灯。再MobaXterm上检查系统LED类。
2025-10-31 19:30:46
342
原创 Linux应用开发-6-GPIO系统控制蜂鸣器
General Purpose I/O(通用输入输出端口),MCU/CPU 可控制的引脚,基本的是高低电平输入检测和输出。
2025-10-31 19:22:30
676
原创 Linux应用开发-4-STM32MP157开发板上使用VS Code 进行远程开发
在Windows的VS Code里写代码,代码实时保存在Ubuntu虚拟机上,在VS Code的终端里一键编译,编译好的程序瞬间出现在STM32MP157上,然后可以直接在板子上运行和单步调试。配置正确的 COM 端口号(可以在Windows的设备管理器里查看)和波特率(JZ2440通常是 115200)。登录成功后,在串口终端里,手动输入 ifconfig,就可以找到这个网络接口eth0。最初准备,虚拟机,Windows,硬件-都在同一个网段里面(见上述详细操作)防火墙-高级设置-入站规则-新建规则。
2025-09-08 14:26:53
986
原创 linux应用开发-1-环境构建
在一个资源丰富的平台上(主机 Host)进行所有的开发工作(编码、编译、链接、调试),然后将生成的可执行文件、系统镜像等部署到资源受限的另一个平台(目标机 Target)上运行。
2025-09-01 11:23:31
443
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅