当前位置: 首页 > news >正文

QMK机械键盘固件开发指南:从源码到实践

QMK机械键盘固件开发指南:从源码到实践

前言

QMK(Quantum Mechanical Keyboard)是一款开源的键盘固件,支持众多自定义键盘的功能配置。通过QMK,您可以完全掌控键盘的每一个按键,实现复杂的宏指令、多层按键映射、RGB灯效等高级功能。本教程将带您从零开始构建一个基础的QMK键盘固件,使您的键盘真正实现个性化定制。

一、QMK项目文件结构

在开始编写固件代码前,我们需要先了解QMK的文件结构。对于每一个键盘项目,我们需要在keyboards文件夹下创建特定的文件和文件夹。

1.1 基本结构

keyboards/
└── your_keyboard_name/       # 键盘名称(全小写,无空格,无特殊符号)├── rules.mk              # MCU类型、Bootloader选择及功能开关配置├── config.h              # 硬件参数配置├── info.json             # USB VID/PID、制造商信息等├── your_keyboard_name.h  # 键盘矩阵定义├── your_keyboard_name.c  # 键盘核心功能实现└── keymaps/              # 键盘映射文件夹└── default/          # 默认键盘映射└── keymap.c      # 按键功能定义

1.2 文件命名规则

关于命名规则,有几点需要特别注意:

  1. 键盘名称文件夹必须全部小写,不能包含空格和特殊符号(下划线除外)
  2. .h.c文件的名称应与最深层文件夹名称一致
  3. 例如:如果键盘文件夹结构为keyboards/modelo75/costume/,则对应的文件应命名为costume.hcostume.c,而非modelo75.h

1.3 ARM架构专用文件

对于使用ARM架构芯片(如STM32系列)的键盘,还需要两个额外的文件:

  • mcuconf.h - MCU配置文件
  • halconf.h - HAL层配置文件

注意:这两个文件对于AVR架构(如ATmega32U4)的键盘不是必需的。

二、创建键盘固件项目

现在,让我们一步步创建一个完整的键盘固件项目。本教程以一个名为"Modelo75"的75%布局键盘为例。

2.1 创建项目文件夹

首先,在QMK固件的keyboards目录下创建一个新文件夹:

# 进入QMK固件目录
cd qmk_firmware# 创建键盘文件夹
mkdir keyboards/modelo75

2.2 编写 rules.mk 文件

rules.mk是项目的核心配置文件,用于指定MCU类型、Bootloader以及各种功能开关。

# MCU名称
MCU = STM32F103
# 注释:芯片型号# Bootloader选择
BOOTLOADER = stm32duino
# 注释:F103需要使用stm32duino bootloader,因为它原生不支持USB DFU# 功能开关
NKRO_ENABLE = yes       # 启用全键无冲
EXTRAKEY_ENABLE = yes   # 启用音频控制和系统控制
# LTO_ENABLE = yes      # 链接时优化,可减小固件体积(对于Flash空间小的MCU有用)

扩展知识:LTO(Link Time Optimization)是一种编译优化技术,可以在链接阶段对整个程序进行优化,减小固件体积并提高执行效率。对于Flash空间有限的AVR系列MCU(如ATmega32U4),启用LTO非常有用。

2.3 定义键盘矩阵 (modelo75.h)

键盘矩阵文件定义了键盘的物理布局,是固件开发中最重要的文件之一。这个文件将指导QMK如何理解您的键盘按键排列。

#pragma once#include "quantum.h"/* 这个宏防止头文件被重复包含 *//* 定义键盘布局 */
#define LAYOUT( \K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, \K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, \K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212,       K214, \K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311,       K313, K314, \K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410,       K412, K413, K414, \K500, K501, K502,                   K506,                   K510, K511, K512, K513, K514  \
) { \{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014 }, \{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114 }, \{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, KC_NO, K214 }, \{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, KC_NO, K313, K314 }, \{ K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, KC_NO, K412, K413, K414 }, \{ K500, K501, K502, KC_NO, KC_NO, KC_NO, K506, KC_NO, KC_NO, KC_NO, K510, K511, K512, K513, K514 }  \
}

技巧:使用Excel等电子表格工具可以快速生成键盘矩阵布局。您可以在Excel中创建一个与键盘行列对应的表格,填入键位标识符,然后复制到代码中进行格式调整。

2.4 创建键盘C文件 (modelo75.c)

对于基础功能,这个文件可以非常简单:

#include "modelo75.h"/* 键盘特定功能的实现可以放在这里 */
/* 例如RGB矩阵效果、旋钮功能等 */

2.5 配置硬件参数 (config.h)

config.h文件包含了键盘硬件相关的配置,如矩阵尺寸、引脚定义等:

#pragma once#include "config_common.h"/* 键盘矩阵尺寸 */
#define MATRIX_ROWS 6
#define MATRIX_COLS 15/* 键盘矩阵引脚定义 */
#define MATRIX_ROW_PINS { B5, B4, B3, A15, A2, A1 }
#define MATRIX_COL_PINS { A0, A3, A4, A5, A6, A7, B0, B1, B10, B11, B12, B13, B14, B15, B9 }/* 二极管方向 */
#define DIODE_DIRECTION COL2ROW

2.6 创建USB和设备信息 (info.json)

在QMK 0.19版本后,需要在info.json文件中定义USB相关信息:

{"keyboard_name": "Modelo75","manufacturer": "YourName","url": "","maintainer": "YourName","usb": {"vid": "0xF055","pid": "0x7501","device_version": "0.0.1"}
}

注意:VID(厂商ID)和PID(产品ID)应该是唯一的。对于个人项目,可以使用随机的16进制数值,但要避免与商业产品冲突。

2.7 ARM架构特定文件

如果使用STM32等ARM架构芯片,还需要添加以下两个文件:

mcuconf.h:

#pragma once#include_next <mcuconf.h>

halconf.h:

#pragma once#include_next <halconf.h>

2.8 创建默认按键映射

现在创建键盘映射目录和默认映射文件:

mkdir -p keyboards/modelo75/keymaps/default
touch keyboards/modelo75/keymaps/default/keymap.c

编辑keymap.c文件,定义键盘的默认按键功能:

#include QMK_KEYBOARD_H/* 层定义 */
enum layer_names {_BASE,    // 基础层_FN       // 功能层
};const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {/* 基础层 (0) */[_BASE] = LAYOUT(KC_ESC,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  KC_PSCR, KC_DEL,KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_MINS, KC_EQL,  KC_BSPC, KC_HOME,KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP,KC_CAPS, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT,          KC_ENT,  KC_PGDN,KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH,          KC_RSFT, KC_UP,   KC_END,KC_LCTL, KC_LGUI, KC_LALT,                            KC_SPC,                    MO(_FN), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT),/* 功能层 (1) */[_FN] = LAYOUT(KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,RGB_TOG, RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, RGB_RMOD,RGB_HUD, RGB_SAD, RGB_VAD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, QK_BOOT, KC_TRNS, KC_MUTE, KC_VOLD, KC_VOLU, KC_TRNS,          KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS,                            KC_TRNS,                   KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS)
};

三、层与键码详解

QMK的强大功能之一是支持多层按键映射,借助层切换功能,您可以在有限的物理按键上实现几乎无限的功能。

3.1 常用层切换键码

以下是QMK中用于层控制的常用键码:

键码说明
DF(n)将层n设为默认层
MO(n)按住时临时切换到层n,松开后返回
OSL(n)单击后下一个按键从层n生效,然后返回
LM(n,mod)类似MO(n),但同时应用指定的mod修饰符
LT(n,kc)按住时临时切换到层n,单击时发送KC键码
TG(n)切换层n的开启/关闭状态
TO(n)直接切换到层n
TT(n)点按功能类似MO,多次点击保持层n开启

3.2 特殊键码举例

QMK提供了许多特殊键码,以下是一些常用的例子:

  • QK_BOOT:进入Bootloader模式,可用于刷新固件
  • RGB_TOG:开关RGB灯效
  • RGB_MOD:切换RGB灯效模式
  • KC_MUTE:系统静音
  • KC_VOLD/KC_VOLU:音量减/增

四、编译和烧录固件

完成所有文件的创建和编辑后,就可以编译并烧录固件了。

4.1 编译固件

使用以下命令编译固件:

qmk compile -kb modelo75 -km default

如果您有多级目录,需要指定完整路径:

qmk compile -kb your_folder/modelo75 -km default

4.2 烧录固件

编译成功后,固件文件会生成在.build文件夹中。根据MCU类型,文件格式可能是.hex.bin.uf2

使用QMK Toolbox或命令行工具烧录固件:

qmk flash -kb modelo75 -km default

重要提示:烧录固件前,需要将键盘设置为Bootloader模式。这通常可以通过按下键盘上的RESET按钮,或在PCB上短接RESET和GND引脚实现。

五、扩展功能与进阶技巧

5.1 快速构建键盘矩阵的Excel技巧

创建键盘矩阵是固件开发中最繁琐的工作之一。使用Excel可以大大简化这一过程:

  1. 创建一个与键盘行列数相匹配的表格
  2. 按照行列顺序填入键位标识符(如K000, K001等)
  3. 在单元格间添加逗号分隔符
  4. 复制整个表格数据到代码编辑器
  5. 使用查找替换功能调整格式

5.2 代码优化与调试技巧

  1. 保持代码整洁:适当的缩进和注释可以使代码更易于阅读和维护
  2. 模块化设计:将复杂功能拆分为单独的函数,提高代码可维护性
  3. 使用条件编译:对于可选功能,使用条件编译可以减小固件体积
  4. 日志输出:在调试复杂问题时,可以使用printdprintf函数输出调试信息

5.3 常见问题解决方案

  1. 编译错误:检查括号、逗号是否正确,确保所有必需文件都已创建
  2. 按键不响应:检查键盘矩阵定义是否正确,二极管方向是否设置正确
  3. 层切换问题:确认层切换键的位置和功能是否正确配置
  4. 固件太大:尝试启用LTO,或禁用不需要的功能
  5. USB不识别:检查VID/PID配置,确保已正确设置USB参数

六、结语

通过本教程,您已经学习了如何从零开始创建QMK键盘固件。这只是QMK功能的冰山一角,随着您的深入学习,还可以探索更多高级功能,如RGB灯光效果、OLED显示、旋钮编码器控制等。

持续学习QMK文档和社区资源,将帮助您进一步掌握键盘固件开发技术,创造出完全符合个人需求的独特键盘体验。

如果您在开发过程中遇到任何问题,欢迎在评论区留言交流,也可以加入QMK官方Discord社区获取更多帮助。


参考资源

  • QMK官方文档
  • QMK GitHub仓库
  • 键码列表
  • QMK设置指南

相关文章:

QMK机械键盘固件开发指南:从源码到实践

QMK机械键盘固件开发指南&#xff1a;从源码到实践 前言 QMK&#xff08;Quantum Mechanical Keyboard&#xff09;是一款开源的键盘固件&#xff0c;支持众多自定义键盘的功能配置。通过QMK&#xff0c;您可以完全掌控键盘的每一个按键&#xff0c;实现复杂的宏指令、多层按…...

Unity SpriteMask(精灵遮罩)

&#x1f3c6; 个人愚见&#xff0c;没事写写笔记 &#x1f3c6;《博客内容》&#xff1a;Unity3D开发内容 &#x1f3c6;&#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f50e;SpriteMask&#xff1a;精灵遮罩 &#x1f4a1;作用就是对精灵图片产生遮罩&#xff0c…...

AdaBoost算法详解:原理、实现与应用指南

AdaBoost算法详解&#xff1a;原理、实现与应用指南 1. 引言 在机器学习领域&#xff0c;AdaBoost&#xff08;Adaptive Boosting&#xff09; 是最早提出的集成学习&#xff08;Ensemble Learning&#xff09;**算法之一&#xff0c;由Yoav Freund和Robert Schapire于1995年…...

Flink流式计算核心:DataStream API与时间语义深度解析

本文将围绕Flink最核心的DataStream API展开&#xff0c;结合其独特的时间语义体系&#xff0c;深入解析Flink如何实现对无界流数据的精准控制&#xff0c;并通过真实业务场景案例演示其工程实践方法。 一、DataStream API&#xff1a;Flink处理无界流的“中枢神经” Flink的A…...

C# 方法的结构与执行详解

在编程世界里&#xff0c;方法是一块具有名称的代码&#xff0c;它就像是一个功能盒子&#xff0c;我们可以使用方法的名称从别的地方执行其中的代码&#xff0c;还能把数据传入方法并接收数据输出。方法是类的函数成员&#xff0c;主要由方法头和方法体两个部分构成。 方法头…...

《AI大模型应知应会100篇》第41篇:多轮对话设计:构建高效的交互式应用

第41篇&#xff1a;多轮对话设计&#xff1a;构建高效的交互式应用 摘要 在银行客服机器人突然准确回答出用户第7次追问的信用卡额度规则时&#xff0c;在医疗问诊系统记住患者既往病史的瞬间&#xff0c;多轮对话技术正在创造令人惊叹的交互体验。本文将以工业级案例为经&am…...

【Day 14】HarmonyOS分布式数据库实战

一、分布式数据库基础 1. 核心概念速记表 术语解释示例场景分布式数据库数据自动同步到同账号设备手机添加商品→平板立即显示KV数据模型键值对存储&#xff08;类似JSON&#xff09;{"cart_item1": {"name":"牛奶","price":10}}数据…...

terraform 删除资源前先校验资源是否存在关联资源

Terraform 删除资源前校验关联资源的解决方案 在使用 Terraform 进行资源删除操作时&#xff0c;确实存在直接删除可能影响关联资源的风险。以下是几种在删除前校验关联资源的方法&#xff1a; 1. 使用 Terraform Data Sources 进行预检查 在删除主资源前&#xff0c;可以通…...

如何免费使用 DeepSeek-Prover-V2?

近日,Deepseek 发布了一个新模型,这是一个在数学推理方面表现卓越的模型,即 DeepSeek Prover V2。 DeepSeek-Prover-V2 是一个专门使用 Lean 4 证明助手进行形式化定理证明的高级语言模型。 简单来说, DeepSeek-Prover-V2 旨在支持数学家和计算机科学家创建和验证形式化证…...

dify+ollama+知识库 部署

这篇文章的前提是已经部署了deepseek和ollama deepseek和ollama安装 代码、配置 本地电脑如果是Windows的话&#xff0c;需要安装Git # 拉取Dify代码 git clone https://github.com/langgenius/dify.git复制配置 进入dify\docker目录 复制.env.example到.env 复制.middlewa…...

补题:K - Magic Tree (Gym - 105231K)

来源&#xff1a;问题 - K - Codeforceshttps://codeforces.com/gym/105231/problem/K 题目描述&#xff1a; 一、题目分析 本题给定一个2行m列的网格&#xff0c;从(1, 1)格子开始进行深度优先搜索&#xff0c;每个格子可到达至少一个边相邻的格子且不重复访问&#xff0c;…...

文章记单词 | 第58篇(六级)

一&#xff0c;单词释义 naive&#xff1a;英 [naɪˈiːv , nɑːˈiːv] 美 [naɪˈiːv , nɑːˈiːv]&#xff0c;形容词&#xff0c;意为 “天真的&#xff1b;幼稚的&#xff1b;轻信的&#xff1b;易受骗的&#xff1b;无经验的&#xff1b;率真的&#xff1b;质朴的”…...

红利底波是什么意思?

红利低波是一种结合了红利策略和低波策略的投资策略&#xff0c;主要选取股息率高且波动率低的股票进行投资&#xff0c;具有 “高收益低风险” 的特点&#xff0c;适合大多数投资者的权益资产配置。以下是具体介绍&#xff1a; 策略构成要素 红利策略 &#xff1a;关注股息率…...

缓存:缓解读库压力的高效方案与应用实践

在软件开发和系统设计中&#xff0c;使用缓存来缓解读库压力是一种常见且有效的优化策略&#xff0c;以下是具体的介绍&#xff1a; 一、缓存的基本概念 缓存是一种临时数据存储区域&#xff0c;它存储了经常访问的数据副本。当应用程序需要访问数据时&#xff0c;首先会检查…...

17. LangChain流式响应与实时交互:打造“类ChatGPT“体验

引言&#xff1a;从"等待加载"到"即时对话"的革命 2025年某在线教育平台的AI助教引入流式交互后&#xff0c;学生平均对话轮次提升3.2倍&#xff0c;完课率提高47%。本文将基于LangChain的异步流式架构&#xff0c;揭秘如何实现毫秒级响应的自然对话体验。…...

仿腾讯会议——服务器结构讲解

总功能 1、数据库类 1、进入mysql 2、查看当前数据库 2、线程池 3、网络类 阻塞和非阻塞是通过套接字来实现的&#xff0c;所以不能发送和接收的阻塞状态不同...

【笔记】深度学习模型训练的 GPU 内存优化之旅③:内存交换篇

开设此专题&#xff0c;目的一是梳理文献&#xff0c;目的二是分享知识。因为笔者读研期间的研究方向是单卡上的显存优化&#xff0c;所以最初思考的专题名称是“显存突围&#xff1a;深度学习模型训练的 GPU 内存优化之旅”&#xff0c;英文缩写是 “MLSys_GPU_Memory_Opt”。…...

(B题|矿山数据处理问题)2025年第二十二届五一数学建模竞赛(五一杯/五一赛)解题思路|完整代码论文集合

我是Tina表姐&#xff0c;毕业于中国人民大学&#xff0c;对数学建模的热爱让我在这一领域深耕多年。我的建模思路已经帮助了百余位学习者和参赛者在数学建模的道路上取得了显著的进步和成就。现在&#xff0c;我将这份宝贵的经验和知识凝练成一份全面的解题思路与代码论文集合…...

【2025最新】为什么用ElasticSearch?和传统数据库MySQL与什么区别?

Elasticsearch 深度解析&#xff1a;从原理到实践 一、为什么选择 Elasticsearch&#xff1f; 数据模型 Elasticsearch 是基于文档的搜索引擎&#xff0c;它使用 JSON 文档来存储数据。在 Elasticsearch 中&#xff0c;相关的数据通常存储在同一个文档中&#xff0c;而不是分散…...

华为云Astro大屏连接器创建操作实例:抽取物联网iotda影子设备数据的连接器创建

目录 样图(API连接器创建成功) 说明 操作场景(以Astro大屏抽取iotda影子参数为例) 实际操作步骤 新建连接器 设置基本信息。 接口鉴权方式,支持API鉴权、AK/SK、API Key和无身份验证 无身份验证 AK/SK认证(目前暂不能用) API Key认证(第三方使用) API鉴权认…...

C#泛型集合深度解析(九):掌握System.Collections.Generic的核心精髓

一、泛型集合革命:告别装箱拆箱的性能噩梦 1.1 泛型与非泛型集合性能对比 // 非泛型集合(ArrayList) ArrayList arrayList = new ArrayList(); arrayList.Add(100); // 装箱发生 int value = (int)arrayList[0]; // 拆箱发生// 泛型集合(List<T>) List<…...

人工智能-深度学习之卷积神经网络

深度学习 mlp弊端卷积神经网络图像卷积运算卷积神经网络的核心池化层实现维度缩减卷积神经网络卷积神经网络两大特点卷积运算导致的两个问题&#xff1a;图像填充&#xff08;padding&#xff09;结构组合问题经典CNN模型LeNet-5模型AlexNet模型VGG-16模型 经典的CNN模型用于新…...

《软件设计师》复习笔记(11.1)——生命周期、CMM、开发模型

目录 一、信息系统生命周期 系统规划阶段 系统分析阶段&#xff08;逻辑设计&#xff09; 系统设计阶段&#xff08;物理设计&#xff09; 系统实施阶段 系统运行与维护阶段 二、能力成熟度模型&#xff08;CMM/CMMI&#xff09; CMM 五级模型 CMMI 两种表示方法 真题…...

AI大模型基础设施:主流的几款开源AI大语言模型的本地部署成本

以下是对目前主流开源AI大语言模型&#xff08;如DeepSeek R1、LLaMA系列、Qwen等&#xff09;本地部署成本的详细分析&#xff0c;涵盖计算机硬件、显卡等成本&#xff0c;价格以美元计算。成本估算基于模型参数规模、硬件需求&#xff08;GPU、CPU、RAM、存储等&#xff09;以…...

Narendra自适应控制器设计

上一篇介绍了在系统结构中引入前馈和反馈的结构&#xff0c;然后利用李雅普诺夫稳定性理论设计MRACS&#xff0c;在基于输入输出形式中&#xff0c;利用李雅普诺夫稳定性设计的自适应率中包含了误差的导数&#xff0c;这降低了系统的抗干扰性&#xff0c;为了避免这一缺点&…...

为什么大模型偏爱Markdown

Markdown 的简洁之美 我们常见的文档格式&#xff0c;比如HTML、JSON、XML或者Markdown&#xff0c;Markdown是最简洁的。 比如要展示一行标题&#xff0c;相比复杂的HTML标签&#xff0c;使用Markdown我们只需要在文本前加个井号&#xff1a; <heading level“1”>这是…...

【kafka系列】消费者组

目录 消费者组功能点 1. 动态负载均衡 2. 容错高可用 3. 消费进度管理 4. 并行消费能力 5. 消费隔离性 其他要点 1. Rebalance过程详解 2. 位移提交的精确语义 3. 消费者限速策略 4. 跨机房消费设计 消费者组功能点 1. 动态负载均衡 核心机制&#xff1a;通过Rebal…...

2025五一杯数学建模C题:社交媒体平台用户分析问题;思路分析+模型代码

&#xff08;一&#xff09;问题背景 想象一下&#xff0c;社交媒体平台是一个充满活力的生态系统&#xff0c;博主们如同才华横溢的创作者&#xff0c;凭借专业知识或独特兴趣&#xff0c;精心打造出各种高质量内容&#xff0c;吸引着众多用户的目光。用户则像热情的参与者&a…...

Kotlin-运算符重载函数

在 Kotlin 里&#xff0c;运算符重载函数允许为自定义类型重新定义现有的运算符(如 -…)行为&#xff0c;从而让自定义类型能像内置类型那样使用运算符 文章目录 基本语法作用场景类对象数据类型接口 注意事项 基本语法 若要重载运算符&#xff0c;需要定义一个带有 operato…...

哈希表笔记(三)Java Hashmap

一、基本介绍 HashMap 是 Java 集合框架中的核心类之一&#xff0c;基于哈希表实现&#xff0c;提供了 Map 接口的主要实现。 1.1 主要特点 实现了 Map<K,V> 接口允许 null 键和 null 值&#xff08;不同于 Hashtable&#xff09;非同步实现&#xff08;非线程安全&am…...

2025五一杯C题五一杯数学建模思路代码文章教学:社交媒体平台用户分析问题

完整内容请看文章最下面的推广群 问题一详细分析&#xff1a;逐步思考与建模过程 第1步&#xff1a;问题理解与数学建模目标明确 目标明确&#xff1a; 平台希望根据2024年7月11日至7月20日的用户与博主交互数据&#xff0c;预测2024年7月21日各博主新增的关 注数&#xff0c;…...

2025五一数学建模竞赛B题完整分析论文(共42页)(含模型、可运行代码、数据)

2025年五一数学建模竞赛B题完整分析论文 摘 要 一、问题分析 二、问题重述 三、模型假设 四、符号定义 五、 模型建立与求解 5.1问题1 5.1.1问题1思路分析 5.1.2问题1模型建立 5.1.3问题1代码 5.1.4问题1求解结果 5.2问题2 5.2.1问题2思路分析 5.2.…...

[蓝桥杯 2021 省 AB] 砝码称重 Java

import java.util.*;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();int[] w new int[n 1];int sum 0; // 所有砝码重量之和for (int i 1; i < n; i) {w[i] sc.nextInt();sum w[i];}sc.close()…...

Linux 命令如何同时支持文件参数与管道输入?

文章目录 Linux 命令如何同时支持文件参数与管道输入&#xff1f;命令输入方式与管道机制概述常见输入控制方式常见使用示例程序实现思路&#xff1a;统一处理输入的方式判定输入来源的基本模式为何命令应支持参数与标准输入&#xff1f; GNU Coreutils wc 源码解析&#xff1a…...

Lucene多种数据类型使用说明

Lucene 作为一款高性能的全文检索引擎库&#xff0c;其核心功能围绕索引和搜索文本数据&#xff0c;但它也支持多种数据类型以满足复杂的应用场景。以下是 Lucene 支持的主要数据类型及其用途的详细说明&#xff1a; 1. 文本类型&#xff08;Text&#xff09; 用途&#xff1a;…...

使用CubeMX新建DMA工程——存储器到外设模式

目录 1、新建板级支持包 1、usart.c: 2、修改的地方&#xff1a;在usart.c中添加了这些 3、usart.h: 4、在usart.h中添加了这些&#xff1a; 5、dma.c: 6、dma.h: 2、修改main.c文件 1、在main.c文件中添加头文件 2、添加外部变量声明 3、添加简单延时函数 4、添加…...

基于Redis实现-附近商铺查询

基于Redis实现-附近查询 这个功能将使用到Redis中的GEO这种数据结构来实现。 1.GEO相关命令 GEO就是Geolocation的简写形式&#xff0c;代表地理坐标。Redis在3.2版本中加入到了对GEO的支持&#xff0c;允许存储地理坐标信息&#xff0c;帮助我们根据经纬度来检索数据&#…...

【Redis】Another Redis Desktop Manager 安装指南

目录 一、Another Redis Desktop Manager 介绍 ​二、下载安装指南 三、效果预览 一、Another Redis Desktop Manager 介绍 国人开发的更快、更好、更稳定的 Redis 桌面客户端工具&#xff0c;功能强大&#xff0c;支持集群、哨兵、SSL 认证、 树状视图、自定义格式化脚本等功…...

装饰器设计模式(Decorator Pattern)详解

装饰器设计模式(Decorator Pattern)详解 装饰器模式是一种结构型设计模式,它允许动态地向对象添加额外行为,而无需修改其原始类。这种模式通过包装对象的方式提供灵活的扩展功能替代继承。 1. 核心概念 (1)模式定义 装饰器模式:动态地给一个对象添加一些额外的职责,就…...

LiteOS与SLE透传实战案例

文章目录 硬件设计EDA 软件介绍创建元件及封装原理图绘制Layout元件焊接 软件设计LiteOS 入门核心概念TaskWorkflow参考 API&#xff08;参考 osal_task. h&#xff09; 时间片任务轮转练习&#xff1a;仿写 example/peripheral/blinkyQueue参考 API&#xff08;参考 osal_msgq…...

MCAL学习(1)——AutoSAR

1.了解AutoSAR及一些概念 AutoSAR是Automotive Open System Architecture ,汽车开放系统架构。 针对汽车ECU的软件开发架构。已经是汽车电子软件开发的标准。 OS服务&#xff1a;Freertos 整车厂&#xff08;OEM&#xff09;主要负责应用层算法 一级供应商&#xff1a;生产制…...

前端vue3项目学习

鸽王经过一个多月的学习&#xff08;断断续续吧&#xff0c;毕竟还有其他杂事&#xff09;&#xff0c;学的昏天黑地&#xff0c;终于把主线捋的差不多了。只能说&#xff0c;前端真不是人学的&#xff0c;涉及的语言语法太杂乱了&#xff0c;入门真的太难了。而后端&#xff0…...

ActiveMQ 性能优化与网络配置实战(二)

五、性能优化实战 5.1 基础配置调整 5.1.1 增加并发消费者 在 ActiveMQ 中&#xff0c;增加并发消费者是提高消息处理效率的重要手段之一。通过配置多个消费者并行处理消息&#xff0c;可以充分利用系统资源&#xff0c;加快消息的消费速度&#xff0c;从而提高系统的整体吞…...

Python 函数装饰器和闭包(装饰器基础知识)

本章内容&#xff1a; Python 如何计算装饰器句法 Python 如何判断变量是不是局部的 闭包存在的原因和工作原理 nonlocal 能解决什么问题 掌握这些基础知识后&#xff0c;我们可以进一步探讨装饰器&#xff1a; 实现行为良好的装饰器 标准库中有用的装饰器 实现一个参数化装饰器…...

“Everything“工具 是 Windows 上文件名搜索引擎神奇

01 Everything 和其他搜索引擎有何不同 轻量安装文件。 干净简洁的用户界面。 快速文件索引。 快速搜索。 快速启动。 最小资源使用。 轻量数据库。 实时更新。 官网&#xff1a;https://www.voidtools.com/zh-cn/downloads/ 通过网盘分享的文件&#xff1a;Every…...

【Machine Learning Q and AI 读书笔记】- 04 彩票假设

Machine Learning Q and AI 中文译名 大模型技术30讲&#xff0c;主要总结了大模型相关的技术要点&#xff0c;结合学术和工程化&#xff0c;对LLM从业者来说&#xff0c;是一份非常好的学习实践技术地图. 本文是Machine Learning Q and AI 读书笔记的第4篇&#xff0c;对应原…...

linux下安装ollama网不好怎么办?

文章目录 前言kkgithub下载脚本,而不是直接运行修改脚本修改权限还是不行?前言 今天想在linux上面更新一下ollama,于是去到官网: https://ollama.com/download/linux linux下安装ollama还是挺简单的: curl -fsSL https://ollama.com/install.sh | sh我也是特别嗨皮地就…...

(A题|支路车流量推测问题)2025年第二十二届五一数学建模竞赛(五一杯/五一赛)解题思路|完整代码论文集合

我是Tina表姐&#xff0c;毕业于中国人民大学&#xff0c;对数学建模的热爱让我在这一领域深耕多年。我的建模思路已经帮助了百余位学习者和参赛者在数学建模的道路上取得了显著的进步和成就。现在&#xff0c;我将这份宝贵的经验和知识凝练成一份全面的解题思路与代码论文集合…...

RDMA高性能网络通信实践

RDMA高性能网络通信实践 一、背景介绍二、方法设计A.实现方案B.关键技术点三、代码及注释四、注意事项一、背景介绍 远程直接内存访问(RDMA)技术通过绕过操作系统内核和CPU直接访问远程内存,实现了超低延迟、高吞吐量的网络通信。该技术广泛应用于高性能计算、分布式存储和…...

【LeetCode Hot100】图论篇

前言 本文用于整理LeetCode Hot100中题目解答&#xff0c;因题目比较简单且更多是为了面试快速写出正确思路&#xff0c;只做简单题意解读和一句话题解方便记忆。但代码会全部给出&#xff0c;方便大家整理代码思路。 200. 岛屿数量 一句话题意 求所有上下左右的‘1’的连通块…...