STM32GPIO输入实战-按键key模板及移植
STM32GPIO输入实战-按键key模板及移植
- 一,按键模板展示
- 二,按键模板逻辑
- 1,准备工作:头文件与全局变量
- 2,读取硬件状态:key_read_raw()
- 3,核心处理:`key_process_simple()` 的四行代码
- 三,HAL_GPIO_ReadPin()解读
- 1, 功能与作用
- 2,参数拆解
- 3,返回结果
- 4,应用场景
- 5,硬件抽象层
- 四,按键模板移植
- 1,模板移植
- 2,移植修改
一,按键模板展示
“key_app.c”
#include "key_app.h"uint8_t key_val,key_old,key_down,key_up;uint8_t key_read()
{uint8_t temp = 0;if(HAL_GPIO_ReadPin(GPIOB, key1_Pin) == GPIO_PIN_RESET) temp = 1; if(HAL_GPIO_ReadPin(GPIOB, key2_Pin) == GPIO_PIN_RESET) temp = 2; if(HAL_GPIO_ReadPin(GPIOB, key3_Pin) == GPIO_PIN_RESET) temp = 3; if(HAL_GPIO_ReadPin(GPIOB, key4_Pin) == GPIO_PIN_RESET) temp = 4; if(HAL_GPIO_ReadPin(GPIOD, key5_Pin) == GPIO_PIN_RESET) temp = 5; if(HAL_GPIO_ReadPin(GPIOD, key6_Pin) == GPIO_PIN_RESET) temp = 6; return temp;
}void key_task()
{key_val = key_read();key_down = key_val & (key_old ^ key_val);key_up = ~key_val & (key_old ^ key_val);key_old = key_val;if(key_down == 1){ucLed[0] ^= 1;}}
“key_app.h”
#ifndef __KEY_APP_H__
#define __KEY_APP_H__#include "mydefine.h"void key_task(void);#endif
移植时需要修改引脚
二,按键模板逻辑
上面的模板是我在51单片机中使用的,它仅用四行核心代码实现的按键处理,它非常适合资源极其有限,或者只需要判断按键"按下"和"松开"两种状态的简单场景。虽然简洁,但牺牲了去抖动和复杂功能。
1,准备工作:头文件与全局变量
假设我们有一个 key_app.h 文件,包含了必要的 HAL 库定义。我们需要几个全局变量来存储按键的状态信息:
#include "key_app.h"uint8_t key_val,key_old,key_down,key_up;
或者
#include "key_app.h" // 包含必要的定义// 使用更明确的变量名
uint8_t g_key_current_state = 0; // 当前按键值 (哪个键按下? 0代表无)
uint8_t g_key_previous_state = 0; // 上一次循环检测到的按键值
uint8_t g_key_pressed_flag = 0; // 按键按下的标志 (哪个键刚被按下?)
uint8_t g_key_released_flag = 0; // 按键释放的标志 (哪个键刚被释放?)
2,读取硬件状态:key_read_raw()
这个函数直接与硬件打交道,读取引脚电平。假设按键按下时引脚为低电平 (GPIO_PIN_RESET)。我们给函数加上 “raw” 后缀,强调它读取的是未经处理的原始状态。
// 读取按键原始状态 (无去抖)
uint8_t key_read_raw(void) {uint8_t key_value = 0; // 初始化为0 (无按键)// 假设 KEY1-3 在 GPIOB, KEY4 在 GPIOAif(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == GPIO_PIN_RESET) key_value = 1; // KEY1if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == GPIO_PIN_RESET) key_value = 2; // KEY2if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2) == GPIO_PIN_RESET) key_value = 3; // KEY3if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET) key_value = 4; // KEY4 (WK_UP)return key_value; // 返回当前按下的按键编号 (1-4),或 0
}
警告: 这是最基础的读取,完全没有考虑按键抖动。在实际硬件上,按键按下和松开的瞬间,物理触点会快速通断多次,导致电平跳变。这个函数可能会在一次"按下"中读到多次0和1的交替。此方法仅适用于对实时性要求不高、能容忍偶尔误判或抖动不明显的场合。
3,核心处理:key_process_simple()
的四行代码
这四行代码利用位运算,巧妙地捕捉状态变化:
// 极简按键处理函数
void key_process_simple(void) {// 1. 读取当前原始状态g_key_current_state = key_read_raw();// 2. 检测哪些键【刚刚按下】(之前是0/未按,现在是1/按下)// - (g_key_previous_state ^ g_key_current_state) 找出所有状态变化的位// - & g_key_current_state 保留那些当前状态为1 (按下) 的变化位g_key_pressed_flag = g_key_current_state & (g_key_previous_state ^ g_key_current_state);// 3. 检测哪些键【刚刚释放】(之前是1/按下,现在是0/未按)// - (g_key_previous_state ^ g_key_current_state) 同样找出所有状态变化的位// - & ~g_key_current_state (或 & g_key_previous_state) 保留那些当前状态为0 (释放) 的变化位g_key_released_flag = ~g_key_current_state & (g_key_previous_state ^ g_key_current_state);// 等效写法: g_key_released_flag = g_key_previous_state & (g_key_previous_state ^ g_key_current_state);// 4. 更新上一次的状态,为下一次比较做准备g_key_previous_state = g_key_current_state;
}
如何使用?
在程序的初始化部分调用一次 key_process_simple() (或手动将 g_key_previous_state 初始化为 key_read_raw() 的结果)。
在主循环或定时器中断(推荐,如每 10-20ms)中周期性地调用 key_process_simple()。
在需要检查按键的地方,检查 g_key_pressed_flag 和 g_key_released_flag 的值。例如,if (g_key_pressed_flag == 1) { /* KEY1 被按下了 */ }。记得在处理完标志后将其清零,避免重复触发。
这种方法的优点是代码量极少,逻辑直接;缺点是抗干扰能力差,无法区分长按、短按、双击等复杂操作。
也可以
key_val = key_read();key_down = key_val & (key_old ^ key_val);key_up = ~key_val & (key_old ^ key_val);key_old = key_val;
三,HAL_GPIO_ReadPin()解读
前面的 key_read_raw() 函数用到了 HAL_GPIO_ReadPin()。这是 STMicroelectronics 公司提供的 HAL (硬件抽象层) 库中的一个标准函数。理解它是进行 GPIO 输入操作的基础。
1, 功能与作用
一句话概括: 读取指定 GPIO 引脚当前的电平是高 (High / 1) 还是低 (Low / 0)。
官方定义 (函数原型):
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
这里的 GPIO_PinState 是一个枚举类型,定义了两种可能的状态。
2,参数拆解
GPIO_TypeDef *GPIOx: 这是指向 GPIO 端口寄存器结构体的指针。你需要告诉函数你想操作哪个"大门"(端口),比如 GPIOA, GPIOB 等。这些宏通常在芯片对应的 HAL 库头文件中定义。
uint16_t GPIO_Pin: 这是一个 16 位的无符号整数,用来指定你要读取这个"大门"上的哪个"小门"(具体的引脚)。例如 GPIO_PIN_0, GPIO_PIN_1, …, GPIO_PIN_15。这些也是预定义的宏,对应引脚编号。
3,返回结果
函数执行后,会返回一个 GPIO_PinState 类型的值,代表读取到的引脚状态:
GPIO_PIN_SET: 表示引脚当前是高电平。通常数值上等于 1。
GPIO_PIN_RESET: 表示引脚当前是低电平。通常数值上等于 0。
你可以直接用 ==
来比较返回值,例如 if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET)
。
下面是GPIO_PinState的定义
typedef enum
{GPIO_PIN_RESET = 0,GPIO_PIN_SET
}GPIO_PinState;
4,应用场景
作为读取引脚状态的基础,它无处不在:
按键检测: 判断按键是否被按下(检测是高还是低)。
传感器状态读取: 获取数字传感器(如霍尔传感器、红外对管)的输出信号。
状态指示灯确认: (较少见)读取某个引脚是否被外部拉高/拉低。
简单通信协议: 在软件模拟 I2C、SPI 或自定义协议时,读取数据线或状态线。
5,硬件抽象层
我们调用 HAL_GPIO_ReadPin() 时,实际上 HAL 库为我们做了这些事:
- 定位寄存器: 根据你传入的 GPIOx (如 GPIOA),找到对应端口的输入数据寄存器 (IDR - Input Data Register) 的内存地址。
- 读取与位操作: 读取整个 IDR 寄存器的值。然后,根据你传入的 GPIO_Pin (如 GPIO_PIN_5),通过位掩码 (Bit Masking) 和位移 (Bit Shifting) 操作,精确地提取出代表该引脚状态的那一位 (0 或 1)。
- 返回标准状态: 将提取出的 0 或 1 转换为标准的 GPIO_PIN_RESET 或 GPIO_PIN_SET 枚举值返回。
HAL 库的意义就在于此:它屏蔽了底层寄存器的复杂细节,提供了一套统一、易用的接口。即使未来 ST 公司推出了新的芯片,只要它们遵循 HAL 标准,你的代码(理论上)只需要很小的改动就能移植过去,这就是硬件抽象的好处。
四,按键模板移植
有了前面led的移植经验,移植按键将快很多
1,模板移植
打开要移植的工程APP文件,将上面展示的按键.c.h文件粘贴过来
打开CubeMX,根据原理图生成GPIO输入相关代码
我的原理图为:引脚被上拉,所以选上拉输入模式,引脚有6个即A0,A1,C0,C1,C2,C3
在CubeMX中选择引脚为输入模式
选择上拉输入,标签/宏定义随意
点击生成代码,生成完毕后,关闭(我的工程已经打开)
回到工程,重新加载
确定更换芯片
停止等待
更换芯片
每次重新生成代码时,都需要重新选择芯片
将桌面上的key文件添加的keil,移植完毕
2,移植修改
移植完毕后发现ucLed在key_app.c中没有定义,key_app.c引用key_app.h文件
而key_app.h只引用了mydefine.h(这里会包含所有自定义头文件)
跳转到mydefine.h,它调用了所有头文件,包括led相关的头文件,但是依旧包led相关变量未定义的错,
因为led_app.h只声明了led相关的函数,没有声明ucLed变量
只需将led_app.c中的ucLed引用过来即可(用extern)
此时编译不在报错,但是为了让其他底层使用key_app.c中的函数,需要将key的头文件也添加到mydefine.h中
接下来修改引脚
在main.h中可以看到CubeMX生成的引脚宏定义
但是直接将key模板移植过来时,模板的引脚和我们使用的引脚不匹配
修改模板引脚成为我们需要的引脚
最后在调度器中加上任务函数
修改完毕
相关文章:
STM32GPIO输入实战-按键key模板及移植
STM32GPIO输入实战-按键key模板及移植 一,按键模板展示二,按键模板逻辑1,准备工作:头文件与全局变量2,读取硬件状态:key_read_raw()3,核心处理:key_process_simple() 的四行代码 三,…...
LeetCode 1128.等价多米诺骨牌对的数量:计数
【LetMeFly】1128.等价多米诺骨牌对的数量:计数 力扣题目链接:https://leetcode.cn/problems/number-of-equivalent-domino-pairs/ 给你一组多米诺骨牌 dominoes 。 形式上,dominoes[i] [a, b] 与 dominoes[j] [c, d] 等价 当且仅当 (a …...
Spring MVC设计与实现
DispatcherServlet的初始化与请求处理流程 初始化阶段 Servlet 生命周期触发:当 Web 容器(如 Tomcat)启动时,根据注解/配置,DispatcherServlet 的 init() 方法被调用。 初始化 WebApplicationContext 根 WebApplicat…...
日语学习-日语知识点小记-进阶-JLPT-N1阶段(1):语法单词
日语学习-日语知识点小记-进阶-JLPT-N1阶段(1):语法单词 1、前言(1)情况说明(2)工程师的信仰(3)高级语法N1语法和难点一、N1语法学习内容(高级语法ÿ…...
stm32week14
stm32学习 十.GPIO 2.基本结构 基本结构: F1与其它的的最大区别是上下拉电阻的位置 施密特触发器是一种整形电路,可以将非标准方波,整形成方波 图中MOS管的输出规则: 3.8中工作模式 ①输入浮空: 上下拉电阻均不工…...
WPF中Binding
绑定ViewModel中的数据 添加数据上下文 方法一:在XAML中添加 <Window.DataContext><local:MainWindowViewModel /> </Window.DataContext>方法二:在界面层的cs文件中添加 this.DataContext new MainWindowViewModel();绑定 publ…...
Google Agent space时代,浅谈Agent2Agent (A2A) 协议和挑战!
如果说去年Google Cloud大会大家还在数“AI”这个词被提了多少次,那么今年,绝对是“Agent”的主场!开发者主题演讲几乎被它“刷屏”,展区的许多 Demo 也都号称是 Agent 应用。 但我得诚实地说,大会现场关于 Agents 的 …...
爬虫的应用
在自然语言处理(NLP)领域,文本数据的预处理是至关重要的基础环节。它如同工匠雕琢璞玉前的打磨工作,直接影响后续模型分析与挖掘的效果。本文将基于 Python,以电商平台的差评和优质评价文本数据为例,详细展…...
力扣面试150题--相同的树
Day 41 题目描述 做法 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right…...
Java后端开发day40--异常File
(以下内容全部来自上述课程) 异常 异常:异常就是代表程序出现的问题 1. 异常的分类 1.1 Error 代表的是系统级别的错误(属于严重问题) 系统一旦出现问题,sun公司会把这些错误封装成Error对象。 Error…...
集成算法学习
集成算法通过组合多个弱学习器提升模型性能,以下是核心内容详解: 一、核心思想 - 组合优势:结合多个简单模型(如决策树),通过“少数服从多数”或“加权平均”等策略,降低方差、偏差或过拟合风险…...
工业认知智能:从数据分析到知识创造
工业认知智能:从数据分析到知识创造 引言 当前制造业面临的知识管理困境令人震惊:68%的工艺知识存储于老员工头脑中,30%的企业因知识传承断层导致质量事故。麦肯锡研究显示,应用认知智能技术的企业,其工艺创新速度提升3-5倍。本文将系统阐述工业认知智能的"感知-理…...
8.1 Python+Docker+企业微信集成实战:自动化报告生成与CI/CD部署全攻略
Python+Docker+企业微信集成实战:自动化报告生成与CI/CD部署全攻略 关键词:PDF报告生成, Word文档自动化, 企业微信集成, Docker容器化, CI/CD流水线 1. 多格式报告生成实战 通过扩展报告输出格式,满足不同用户的文档需求。我们使用Python生态的成熟库实现PDF/Word生成,并…...
25.5.4数据结构|哈夫曼树 学习笔记
知识点前言 一、搞清楚概念 ●权:___________ ●带权路径长度:__________ WPL所有的叶子结点的权值*路径长度之和 ●前缀编码:____________ 二、构造哈夫曼树 n个带权值的结点,构造哈夫曼树算法: 1、转化成n棵树组成的…...
统计学中的p值是什么?怎么使用?
李升伟 整理 在统计学中,p值(p-value)是帮助研究者判断假设检验结果是否具有统计显著性的重要指标。以下是关于p值的详细解释和使用方法: 1. p值的定义 p值表示在原假设(H0)为真的情况下,观察…...
22:一维码与二维码区别
一维码(条形码) 一维条码即指条码条和空的排列规则,常用的一维码的码制包括:EAN码、39码、交叉25码、UPC码、128码、93码,ISBN码,及Codabar(库德巴码)等。 条码是由一组规则排列的条…...
Java学习手册:SQL 优化技巧
一、SQL 查询优化 选择合适的索引列 :索引可以显著提高查询速度,但需要选择合适的列来创建索引。通常,对于频繁作为查询条件的列、连接操作的列以及排序或分组操作的列,应该考虑创建索引。例如,在一个订单表中…...
《Vue3学习手记8》
vue3中的一些API shallowRef ( ) 和shallowReactive ( ) shallowRef (浅层响应式) 1.作用:创建一个响应式数据,但只对顶层属性进行响应式处理。 2.用法: const originalref(...) const original2shallowRef(original) 3.特点:只跟踪引用值的变化,不关心…...
平衡二叉搜索树模拟实现1-------AVL树(插入,删除,查找)
本章目标 1.AVL树的概念 2.AVL树的模拟实现 1.AVL树的概念 1.AVL树是最先被发明的平衡二叉搜索树,AVL树是一颗空树或者具有以下的性质 它的左右子树都是AVL树,并且左右高度差不超过1,AVL树是一颗高度平衡二叉搜索树,通过高度差去控制平衡 2.为什么高度差是1? 当结点个数为8…...
运算放大器的主要技术指标
运放(运算放大器)是一种基础电子器件,具有输入阻抗高、开环放大倍数大、输入端电流小、同相端与反相端电压几乎相等等特点。在选型时,需要考虑技术指标如输入失调电压、输入失调电压漂移、输入失调电流、共模抑制比、压摆率、建立…...
51单片机入门教程——每个音符对应的重装载值
前言 本教程基于B站江协科技课程进行个人学习整理,专为拥有C语言基础的零基础入门51单片机新手设计。既帮助解决因时间差导致的设备迭代调试难题,也助力新手快速掌握51单片机核心知识,实现从C语言理论到单片机实践应用的高效过渡 。...
新一代智能座舱娱乐系统软件架构设计文档
一 文档概述 本文档描述了基于Android系统与多模态大模型融合的新一代智能座舱娱乐系统的软件架构设计。该系统将通过深度学习的个性化适配、多模态感知融合和持续自进化能力,重新定义人车交互体验。 二 整体架构设计 2.1 分层架构视图 系统采用五层垂直架构与三…...
深度优先搜索(DFS)与广度优先搜索(BFS):图与树遍历的两大利器
深度优先搜索(DFS)与广度优先搜索(BFS):图与树遍历的两大利器 在数据结构与算法的世界中,深度优先搜索(DFS)和广度优先搜索(BFS)是两种非常经典的遍历算法。…...
比较 TensorFlow 和 PyTorch
TensorFlow和PyTorch是深度学习领域中两个非常流行的开源机器学习框架,下面为你详细介绍。 1. 历史与背景 TensorFlow:由Google开发和维护,于2015年开源。因其强大的生产能力和广泛的工具支持,在工业界得到了广泛应用。PyTorch&…...
jeecg查询指定时间
jeecg查询指定时间 ApiOperation(value"请假表-分页列表查询", notes"请假表-分页列表查询")GetMapping(value "/list")public Result<IPage<MlLeaveRequest>> queryPageList(MlLeaveRequest mlLeaveRequest,RequestParam(name&qu…...
无人机视觉:连接像素与现实世界 —— 像素与GPS坐标双向转换指南
在无人机航拍应用中,一个核心的需求是将图像上的某个点与现实世界中的地理位置精确对应起来。无论是目标跟踪、地图测绘还是农情监测,理解图像像素与其对应的经纬度(GPS坐标)之间的关系至关重要。本文将详细介绍如何实现单个像素坐…...
php study 网站出现404 - Page Not Found 未找到
最近在用php study搭建本地网站时,出现了404 - Page Not Found 未找到的情况,解决方式如下: 第一种:在wp 后台固定链接设置中修改链接形式 第二种:没有安装伪静态! 小皮面板中 设置--配置文件--编辑你所搭建的网站 在红色框框处…...
互联网大厂Java求职面试:核心技术点深度解析
互联网大厂Java求职面试:核心技术点深度解析 在互联网大厂的Java岗位面试中,技术总监级别的面试官通常会从实际业务场景出发,层层深入地考察候选人的技术能力。本文通过一个严肃专业的技术总监与搞笑但有技术潜力的程序员郑薪苦之间的互动对…...
【Java idea配置】
IntelliJ IDEA创建类时自动生成注释 /** * program: ${PROJECT_NAME} * * since: jdk1.8 * * description: ${description} * * author: ${USER} * * create: ${YEAR}-${MONTH}-${DAY} ${HOUR}:${MINUTE} **/自动导入和自动移除无用导入 idea彩色日志不生效 调试日志输出 在…...
[GESP202503 四级] 二阶矩阵c++
题目描述 小 A 有一个 n 行 m 列的矩阵 A。 小 A 认为一个 22 的矩阵 D 是好的,当且仅当 。其中 表示矩阵 D 的第 i 行第 j 列的元素。 小 A 想知道 A 中有多少个好的子矩阵。 输入 第一行,两个正整数 n,m。 接下来 n 行,每行 m 个整数…...
PyQt5基本介绍
PyQt5是基于Digia公司强大图形框架Qt5的python接口,由一组python模块构成。是一个用于创建桌面应用程序的Python库,它是Qt图形用户界面工具包的Python绑定。 Qt是一个跨平台的C库,提供了一套丰富的工具和功能,用于开发图形用户界…...
Spring AI 实战:第十章、Spring AI RAG之博学多才
引言:从“博闻强记”到“博学多才” 在人工智能的发展历程中,大语言模型(LLM)已经展现了惊人的“博闻强记”能力——它们能写诗、编码、解答常识问题,甚至模拟人类对话。然而,当面对专业领域知识或实时更新的信息时,这些模型往往会暴露其局限性:要么“一本正经地胡说八…...
Runnable 组件生命周期监听器与使用场景
Runnable 生命周期监听器 1.1 监听机制演进 在 LangChain 框架中,Runnable 组件提供两种监控方案: 传统模式:通过 config callbacks 参数传递回调配置增强模式:使用 with_listeners() 方法实现生命周期订阅 …...
五、shell脚本--函数与脚本结构:搭积木,让脚本更有条理
随着我们的脚本越来越长、越来越复杂,直接把所有命令堆在一起会变得难以阅读和维护。这时候,函数 (Function) 就派上大用场了! 函数就像一个可以重复使用的代码块,你可以给它起个名字,然后在脚本的任何地方通过名字来…...
单调栈与单调队列(c艹)、可视化Qt?
单调栈和单调队列的区别在于 ChatGLM 单调栈和单调队列都是数据结构中用于处理序列问题的工具,它们在处理问题时具有不同的特性和应用场景。以下是单调栈和单调队列的主要区别: 定义: 单调栈:是一种特殊的栈,其中的元…...
哈夫曼树和哈夫曼编码
哈夫曼编码一般用来对字符串进行编码格式的表示。其中要克服的最大问题,莫过于就是一串由0或者1组成的编码,你无法区分哪些01组成的编码部分是属于哪些字符的,因此哈夫曼编码的出现解决了这个问题。 在介绍哈夫曼编码之前,先介绍…...
基于 AI 的人像修复与编辑技术:CompleteMe 系统的研究与应用
概述 加利福尼亚大学默塞德分校与 Adobe 的新合作在人像补全领域取得了突破性进展——人像补全是一项备受关注的任务,旨在“揭示”人像中被遮挡或隐藏的部分,可用于虚拟试穿、动画制作和照片编辑等场景。 除了修复损坏的图像或根据用户意愿更改图像外&a…...
spring 使用FactoryBean注入bean
spring 使用FactoryBean注入bean 1、介绍 通常是ApplicationContext,就是IOC容器,ApplicationContext是BeanFactory的实现类,是spring最核心的接口。用getBean来加载bean。BeanFactory相当于是IOC的基础类。而FactoryBean是另一个东西&a…...
AI 编程日报 · 2025 年 5 月 04 日|GitHub Copilot Agent 模式发布,Ultralytics 优化训练效率
1、OpenAI 确认 GPT-4o“谄媚”个性更新已完全回滚 OpenAI 官方已确认,先前推送的一项旨在改进 GPT-4o 模型个性的更新已被完全撤销。该更新最初目标是提升模型的智能与个性,使其交互更直观有效,但实际效果却导致模型表现出过度“谄媚”和“…...
C++ STL简介:构建高效程序的基石
0. 引言 在现代软件开发领域,C语言凭借其强大的性能和灵活性占据着重要地位。而C标准模板库(Standard Template Library,简称STL)作为C标准库的核心组件,更是开发者手中不可或缺的利器。它犹如一座知识宝库࿰…...
大模型(LLMs)RAG 版面分析——文本分块面
大模型(LLMs)RAG 版面分析——文本分块面 一、为什么需要对文本分块? 二、能不能介绍一下常见的文本分块方法? 2.1 一般的文本分块方法 2.2 正则拆分的文本分块方法 2.3 Spacy Text Splitter 方法 2.4 基于 langchain 的 Cha…...
系统思考:核心价值与竞争力
最近,设计师的小伙伴跟我提到,行业内竞争越来越激烈,大家都开始拼命降价。但从系统思考的角度来看,我想说一句话:“人多的地方,不要去。” 为什么这么说?在竞争愈发激烈的环境中,我…...
【RocketMQ Broker 相关源码】- broker 启动源码(2)
文章目录 1. 前言2. 创建 DefaultMessageStore3. DefaultMessageStore#load3.1 CommitLog#load3.2 loadConsumeQueue 加载 ConsumeQueue 文件3.3 创建 StoreCheckpoint3.4 indexService.load 加载 IndexFile 文件3.5 recover 文件恢复3.6 延时消息服务加载 4. registerProcesso…...
mysql中int(1) 和 int(10) 有什么区别?
困惑 最近遇到个问题,有个表的要加个user_id字段,user_id字段可能很大,于是我提mysql工单alter table xxx ADD user_id int(1)。领导看到我的sql工单,于是说:这int(1)怕是不够用吧,接下来是一通解…...
jetson orin nano super AI模型部署之路(八)tensorrt C++ api介绍
我们基于tensorrt-cpp-api这个仓库介绍。这个仓库的代码是一个非常不错的tensorrt的cpp api实现,可基于此开发自己的项目。 我们从src/main.cpp开始按顺序说明。 一、首先是声明我们创建tensorrt model的参数。 // Specify our GPU inference configuration optio…...
渗透测试中扫描成熟CMS目录的意义与技术实践
在渗透测试领域,面对一个成熟且“看似安全”的CMS(如WordPress、Drupal),许多初级测试者常陷入误区:认为核心代码经过严格审计的CMS无需深入排查。然而,目录扫描(Directory Bruteforcing&#x…...
数字信号处理学习笔记--Chapter 1 离散时间信号与系统
1 离散时间信号与系统 包含以下内容: (1)离散时间信号--序列 (2)离散时间系统 (3)常系数线性差分方程 (4)连续时间信号的抽样 2 离散时间信号--序列 为了便于计算机对信号…...
LeetCode 热题 100 994. 腐烂的橘子
LeetCode 热题 100 | 994. 腐烂的橘子 大家好,今天我们来解决一道经典的算法题——腐烂的橘子。这道题在LeetCode上被标记为中等难度,要求我们计算网格中所有新鲜橘子腐烂所需的最小分钟数,或者返回不可能的情况。下面我将详细讲解解题思路&…...
软考-软件设计师中级备考 11、计算机网络
1、计算机网络的分类 按分布范围分类 局域网(LAN):覆盖范围通常在几百米到几千米以内,一般用于连接一个建筑物内或一个园区内的计算机设备,如学校的校园网、企业的办公楼网络等。其特点是传输速率高、延迟低、误码率低…...
NHANES指标推荐:LC9
文章题目:Association between lifes crucial 9 and kidney stones: a population-based study DOI:10.3389/fmed.2025.1558628 中文标题:生命的关键 9 与肾结石之间的关联:一项基于人群的研究 发表杂志:Front Med 影响…...