FLASHDB API分析
fdb_kvdb_init
函数详解
fdb_kvdb_init
是 FlashDB 框架中用于 初始化键值数据库(KVDB) 的核心接口,其功能涵盖底层存储配置、默认数据加载与多模式适配。以下从功能、参数、使用场景及注意事项展开分析:
一、功能与作用
-
数据库初始化
根据配置的存储模式(FAL 模式或文件模式)和分区信息,建立逻辑数据库与物理存储的映射关系。- FAL 模式:基于 Flash 抽象层(FAL)的分区表管理,将数据库绑定到指定 Flash 分区(如
"onchip_fdb"
)。 - 文件模式:在文件系统中创建数据库文件(如
"fdb_kvdb1"
),适用于 Linux 或支持文件操作的嵌入式系统。
- FAL 模式:基于 Flash 抽象层(FAL)的分区表管理,将数据库绑定到指定 Flash 分区(如
-
默认数据加载
首次初始化时,将预设的默认键值对(default_kv
)写入数据库,确保系统首次启动时具备基础配置(如初始化标志位或默认参数)。 -
资源管理
分配内存资源并初始化锁机制(如互斥锁或信号量),确保多线程环境下的数据一致性。
二、函数原型与参数
fdb_err_t fdb_kvdb_init( fdb_kvdb_t db, // 数据库对象指针 const char *name, // 数据库名称(如 "env") const char *path, // 存储路径(FAL模式:分区名;文件模式:目录路径) struct fdb_default_kv *default_kv, // 默认键值集合 void *user_data // 用户自定义数据(如锁句柄)
);
参数说明:
-
db
:指向fdb_kvdb_t
结构体的指针,用于操作数据库实例。 -
name
:数据库唯一标识符,用于多实例区分(如同时管理多个配置文件)。 -
path
:- FAL 模式:对应
fal_cfg.h
中的分区名(如"onchip_fdb"
)。 - 文件模式:数据库文件存储目录(如
"fdb_kvdb1"
)。
- FAL 模式:对应
-
default_kv
:首次初始化的默认键值集合,若为NULL
则不写入默认数据。 -
user_data
:传递自定义数据(如锁句柄),用于实现多线程安全。
返回值:
- 成功:返回
FDB_NO_ERR
。 - 失败:返回错误码(如
FDB_INIT_FAILED
或FDB_READ_ERR
)。
三、使用场景与示例
1. 嵌入式系统参数存储
在物联网设备中初始化环境变量数据库:
struct fdb_kvdb kvdb;
struct fdb_default_kv_node default_kv_table[] = { {"boot_count", &boot_count, sizeof(boot_count)}, {"device_id", "ABCD-1234", 10}
};
struct fdb_default_kv default_kv = { .kvs = default_kv_table, .num = sizeof(default_kv_table) / sizeof(default_kv_table[0])
}; // FAL 模式初始化(绑定片内Flash分区)
fdb_kvdb_init(&kvdb, "env", "onchip_fdb", &default_kv, NULL);
2. 文件模式下的日志存储
在 Linux 系统中创建日志数据库:
// 设置文件模式与存储路径
bool file_mode = true;
uint32_t db_max_size = 4096 * 4;
fdb_kvdb_control(&kvdb, FDB_KVDB_CTRL_SET_FILE_MODE, &file_mode);
fdb_kvdb_control(&kvdb, FDB_KVDB_CTRL_SET_MAX_SIZE, &db_max_size); // 初始化并创建目录
mkdir("fdb_kvdb1", 0777);
fdb_kvdb_init(&kvdb, "log_db", "fdb_kvdb1", NULL, &mutex);
四、配置与调试注意事项
-
模式选择与路径配置
- FAL 模式:需在
fal_cfg.h
中正确定义分区表,确保分区名与path
参数一致。 - 文件模式:路径需具备可写权限,且文件系统需提前挂载(如通过
mkfs
格式化)。
- FAL 模式:需在
-
扇区大小对齐
- 通过
fdb_kvdb_control
设置扇区大小(FDB_KVDB_CTRL_SET_SEC_SIZE
),需与 Flash 块大小对齐(如 Nor Flash 通常为 4096 字节)。 - 未对齐可能导致擦除异常或写入失败。
- 通过
-
锁机制实现
- 裸机系统可通过关闭中断实现原子操作(
__disable_irq()
/__enable_irq()
)。 - RTOS 平台需传递互斥锁句柄(如 FreeRTOS 的
xSemaphoreCreateMutex()
)。
- 裸机系统可通过关闭中断实现原子操作(
-
默认数据设计
- 默认键值集合应包含系统关键参数(如设备序列号、启动计数器),避免手动初始化。
五、常见问题与解决
-
初始化失败(返回非零错误码)
- 路径错误:检查 FAL 分区名或文件路径是否存在拼写错误(如
"onchip_fdb"
误写为"onchip_fbd"
)。 - 默认 KV 配置异常:确保
default_kv
结构体的kvs
数组和num
字段正确。
- 路径错误:检查 FAL 分区名或文件路径是否存在拼写错误(如
-
写入性能低下
- 扇区大小过小:增大扇区大小(如从 4KB 调整为 12KB)以支持大容量数据存储。
- 频繁擦写:通过磨损平衡算法分散写入位置,延长 Flash 寿命。
fdb_kv_get_blob
函数详解
1. 功能与作用
fdb_kv_get_blob
是 FlashDB 中用于 获取二进制大对象(Blob)类型键值对 的核心接口,其设计特点包括:
- 二进制数据支持:适用于存储非结构化数据(如传感器原始数据、加密密钥、固件片段等),与字符串类型 KV(
fdb_kv_get
)形成互补。 - 零拷贝优化:通过
fdb_blob_t
结构体直接操作 Flash 存储地址,避免数据在内存中的冗余复制,降低资源占用。 - 灵活数据访问:支持分段读取大容量数据(如视频流片段),适用于内存受限的嵌入式场景。
2. 函数原型与参数
size_t fdb_kv_get_blob( fdb_kvdb_t db, // 数据库对象指针 const char *key, // 目标键名 fdb_blob_t blob // 预初始化的 blob 对象
);
参数说明:
-
db
:通过fdb_kvdb_init
初始化的数据库实例,需确保已正确关联 Flash 分区或文件路径。 -
key
:键名字符串,需与写入时使用的键名完全匹配(区分大小写)。 -
blob
:通过fdb_blob_make
初始化的结构体,包含数据缓冲区指针和长度信息。
返回值:
- 成功:返回实际读取的字节数(
≥0
)。 - 失败:返回
0
(键不存在或缓冲区不足),需通过blob.saved.len
进一步诊断。
3. 使用场景与示例
场景 1:读取设备启动计数器
在嵌入式系统中持久化存储启动次数:
struct fdb_blob blob;
int boot_count = 0;
// 初始化 blob 对象,关联本地变量
fdb_kv_get_blob(kvdb, "boot_count", fdb_blob_make(&blob, &boot_count, sizeof(boot_count)));
if (blob.saved.len > 0) { FDB_INFO("Boot count: %d\n", boot_count); // 输出:Boot count: 36
}
场景 2:读取固件配置参数
从 Flash 中加载校准参数(如传感器偏移量):
c
c
复制
c
复制
uint8_t calibration_data[128];
struct fdb_blob blob;
size_t read_len = fdb_kv_get_blob(kvdb, "calib", fdb_blob_make(&blob, calibration_data, sizeof(calibration_data)));
if (read_len == sizeof(calibration_data)) { apply_calibration(calibration_data); // 应用校准数据
}
4. 配置与调试注意事项
-
内存预分配:
- 必须预先分配足够大小的缓冲区(
blob->buf
),否则会导致数据截断(blob.saved.len
大于blob->size
)。 - 建议通过
fdb_kv_get_obj
获取元数据后动态分配内存,避免静态缓冲区浪费。
- 必须预先分配足够大小的缓冲区(
-
错误处理:
- 检查
blob.saved.len
是否为正值,若为0
表示键不存在或读取失败。 - 使用
fdb_kv_print
打印数据库内容,辅助排查键名拼写错误。
- 检查
-
性能优化:
- 批量读取时按 Flash 扇区大小(
sec_size
)对齐,减少底层驱动调用次数。 - 结合
fdb_kv_iterator
遍历所有键,实现自动化数据加载。
- 批量读取时按 Flash 扇区大小(
5. 与 fdb_kv_get
的对比
特性 | fdb_kv_get_blob | fdb_kv_get |
---|---|---|
数据类型 | 二进制 Blob | 字符串 |
内存管理 | 需预分配缓冲区 | 自动分配(需手动释放) |
重入安全性 | 支持多线程/中断环境 | 非重入(依赖内部静态缓冲区) |
适用场景 | 大文件、结构体、加密数据 | 短文本、配置参数 |
扩展应用
- 固件差分升级:将增量升级包存储为 Blob,通过
fdb_blob_read
分块写入。 - 安全存储:结合加密算法在读取时动态解密,保护敏感数据(如 Wi-Fi 密码)。
总结
fdb_kv_get_blob
是 FlashDB 中实现 高效二进制数据管理 的核心接口,其设计兼顾了嵌入式系统的资源限制与复杂数据需求。开发者需重点关注 缓冲区预分配 和 错误校验机制,结合迭代器与多线程锁构建鲁棒的存储方案。
fdb_blob_make
函数详解
fdb_blob_make
是 FlashDB 框架中用于 创建并初始化二进制数据对象(Blob) 的核心接口,其功能涵盖内存管理优化与零拷贝操作支持。以下从功能、参数、使用场景及底层机制展开分析:
一、功能与作用
-
Blob 对象初始化
该函数将用户定义的缓冲区与 FlashDB 的fdb_blob_t
结构体绑定,形成可直接操作 Flash 存储的二进制数据对象。通过此方式,避免数据在内存中的冗余复制,降低系统资源消耗。- 零拷贝优化:直接引用用户提供的缓冲区地址,适用于内存受限的嵌入式场景(如传感器原始数据存储)。
- 元数据关联:记录数据长度、存储地址等关键信息,为后续读写操作提供上下文。
-
跨模式兼容
支持 FAL 模式(Flash 抽象层)与文件模式(如 Linux 文件系统),通过统一的接口适配不同存储介质。
二、函数原型与参数
fdb_blob_t fdb_blob_make(fdb_blob_t blob, // 目标 Blob 对象指针void *buf, // 用户缓冲区指针size_t size // 缓冲区容量(字节数)
);
参数说明:
-
blob
:指向fdb_blob_t
结构体的指针,用于保存初始化后的元数据。 -
buf
:用户预分配的缓冲区,用于存储从 Flash 读取或待写入的数据。 -
size
:缓冲区最大容量,需 ≥ 实际数据长度以防止截断。
返回值:
返回初始化后的 fdb_blob_t
指针,可直接用于 fdb_kv_get_blob
或 fdb_kv_set_blob
等函数。
三、使用场景与示例
1. 键值对读取(零拷贝模式)
uint8_t sensor_data[128];
struct fdb_blob blob;
// 将 sensor_data 缓冲区与 blob 对象绑定
fdb_kv_get_blob(kvdb, "sensor_calib", fdb_blob_make(&blob, sensor_data, sizeof(sensor_data)));
if (blob.saved.len > 0) {apply_calibration(sensor_data); // 直接使用缓冲区数据
}
此场景中,数据从 Flash 直接读取到 sensor_data
缓冲区,无需额外内存拷贝。
2. 动态内存分配场景
struct fdb_blob blob;
size_t data_size = fdb_kv_get_obj(kvdb, "firmware", NULL, 0); // 获取数据长度
uint8_t *dynamic_buf = (uint8_t *)malloc(data_size);
fdb_kv_get_blob(kvdb, "firmware", fdb_blob_make(&blob, dynamic_buf, data_size));
动态分配缓冲区后,通过 fdb_blob_make
确保数据按需加载,适用于大文件分块读取。
四、底层机制与配置要点
-
存储介质适配
- FAL 模式:调用
fal_partition_read
/fal_partition_write
直接操作 Flash 物理地址。 - 文件模式:通过
_fdb_file_read
/_fdb_file_write
实现文件系统级读写。
- FAL 模式:调用
-
缓冲区对齐要求
示例配置:
Flash 写入需按块大小(如 4KB)对齐。若缓冲区未对齐,可能触发底层驱动的自动填充或报错。#define FDB_WRITE_GRAN 4096 // 对齐到 4KB uint8_t __attribute__((aligned(FDB_WRITE_GRAN))) aligned_buffer[4096];
-
错误处理策略
- 缓冲区不足:当
blob.saved.len > size
时,返回实际读取长度,用户需重新分配更大缓冲区。 - 校验失败:结合 CRC 或哈希校验(需用户扩展),确保数据完整性。
- 缓冲区不足:当
总结
fdb_blob_make
是 FlashDB 实现 高效二进制数据管理 的关键接口,其设计特点包括零拷贝优化、跨模式兼容和灵活的内存管理。开发者需重点关注缓冲区生命周期管理及对齐要求,结合 fdb_kv_get_blob
和 fdb_kv_set_blob
构建高可靠存储方案。典型应用场景包括固件升级(网页 7)、传感器数据持久化(网页 8)等嵌入式存储需求。
相关文章:
FLASHDB API分析
fdb_kvdb_init 函数详解 fdb_kvdb_init 是 FlashDB 框架中用于 初始化键值数据库(KVDB) 的核心接口,其功能涵盖底层存储配置、默认数据加载与多模式适配。以下从功能、参数、使用场景及注意事项展开分析: 一、功能与作用 …...
使用 ABP vNext 集成 MinIO 构建高可用 BLOB 存储服务
🚀 使用 ABP vNext 集成 MinIO 构建高可用 BLOB 存储服务 本文基于 ABP vNext MinIO 的对象存储集成实践,系统讲解从 MinIO 部署、桶创建、ABP 集成、上传 API、安全校验、预签名访问,到测试、扩展及多租户支持的全过程。目标是构建一套可复…...
3.安卓逆向2-安卓文件目录
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于:图灵Python学院 上一个内容:2.安卓逆向2-adb指令 首先使用adb连接到手机,如下图使用adb命令列出手机的目录&am…...
云原生时代的系统可观测性:理念变革与实践体系
📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:为什么可观测性在云原生时代变得更加重要? 传统应用系统运行于固定服务器,拓扑结构稳定、依赖路径清晰,排查故障依赖日志和人工经验已足够支撑运维。但在云原生环境中,系统正快速演变为: 微…...
力扣网-复写零
1.题目要求 2.题目链接 1089. 复写零 - 力扣(LeetCode) 3.题目解答 class Solution {public void duplicateZeros(int[] arr) {int cur0,dest-1,narr.length;while(cur<n){//遇到0就dest走两步if(arr[cur]0){dest2;}//遇到非零元素dest就走一步els…...
高项-挣值管理TCPI
TCPI(完工尚需绩效指数)的英文全称及含义 TCPI 是项目管理(尤其是挣值管理EVM, Earned Value Management)中的一个关键指标,其英文全称为: To-Complete Performance Index 中文译为**“完工尚需绩效指数”…...
Java大厂面试三轮问答:微服务与数据库技术深度解析
Java大厂面试:谢飞机的三轮挑战 第一轮:微服务基础与电商场景设计 面试官: "谢飞机,假设我们要设计一个电商平台,需要支持用户下单、支付以及订单追踪。你会如何设计微服务架构?" 谢飞机: "呃&#…...
Linux 移植 Docker 详解
一、移植前的环境准备 在将 Docker 移植到 Linux 系统之前,需要确保系统满足一定的条件,以保证 Docker 能够稳定运行。 1. 操作系统版本要求 Docker 对 Linux 操作系统版本有一定的要求,不同的 Docker 版本适配不同的 Linux 发行版及版本。常…...
滑动验证码缺口识别与自动化处理技术解析
在如今的网络安全环境中,滑动验证码作为一种主流的人机验证方案,被广泛应用。它的核心挑战主要集中在两个方面:一是如何准确地识别出缺口位置,二是如何模拟出逼真的拖动轨迹。 一、缺口识别技术方案 (一)…...
C++字符串处理:`std::string`和`std::string_view`的区别与使用
在 C中,std::string和std::string_view都用于处理字符串,但它们的用途和性能特点有很大不同。本教程将通过代码示例和流程图,帮助你快速掌握它们的使用方法。 1.什么是std::string和std::string_view? 1.1std::string std::str…...
Uniapp中动态控制scroll-view滚动的方式
在Uniapp 4.45中,动态修改scroll-view的scroll-left属性时无法触发滚动(直接设置scroll-left属性值没问题),这通常是因为数据更新与 DOM 渲染之间的异步特性导致的。知道了原因,但是直接修改scroll-left属性值还是失败…...
手机怎么查看网络ip地址?安卓/iOS设备查询指南
在移动互联网时代,IP地址作为设备的网络身份证,无论是网络调试、远程连接还是排查故障都至关重要。本文将系统介绍安卓和iOS设备查看IP地址的多种方法,帮助您快速掌握这一实用技能。 一、安卓手机查看IP地址方法 1、通过WiFi设置查看 打开设…...
R语言+贝叶斯网络:涵盖贝叶斯网络的基础、离散与连续分布、混合网络、动态网络,Gephi可视化,助你成为数据分析高手!
🔍 在现代生态、环境及地学研究中,变量及其因果关系的推断是核心课题之一。然而,传统的因果关系研究通常依赖于昂贵的实验,而实验结果往往与天然环境中的实际因果联系存在较大偏差。例如,在生态系统中,物种…...
手机内存不够,哪些文件可以删?
1️⃣应用缓存文件 安卓:通过「文件管理器」→「Android」→「data」或「cache」文件夹(部分需权限),或直接在应用设置中清除缓存 iOS:无需手动清理,系统会自动管理,或在应用内设置中清除&…...
C语言之 比特(bit)、字节(Byte)、字(Word)、整数(Int)
在C语言中,经常出现上述的概念,即比特(bit)、字节(Byte)、字(Word)、整数(Int)。查看C语言标准,比特(bit)的定义如下&…...
组态王通过开疆智能profinet转ModbusTCP网关连接西门子PLC配置案例
本案例是组态王通过使用开疆智能研发的Profinet转ModbusTCP网关采集西门子1200PLC中数据的案例。 网关配置 首先来配置网关的参数,打开网关配置软件“Gateway Configuration Studio” 由于组态王那侧设定为ModbusTCP客户端所以网关作为ModbusTCP服务器。新建项目…...
GO语言学习(五)
GO语言学习(五) 前面我们已经学了一些关于golang的基础知识,从这一期开始,我们就来讲解一下基于golang为后端的web开发,首先这一期为一些golang为后端的web开发基础讲解,我们将会从web的工作方式、golang如…...
Supermemory:让大模型拥有“长效记忆“
目录 引言:打破大语言模型的记忆瓶颈,迎接AI交互新范式 一、Supermemory 核心技术 1.1 透明代理机制 1.2 智能分段与检索系统 1.3 自动Token管理 二、易用性 三、性能与成本 四、可靠性与兼容性 五、为何选择 Supermemory? 六、对…...
Hooks实现原理与自定义Hooks
React Hooks 是 React 16.8 引入的一种机制,允许在函数组件中使用状态(state)、副作用(effect)等功能,而无需编写 class 组件。其核心原理是通过闭包和链表结构,在 React 的 Fiber 架构中管理组…...
【NLP】35. 构建高质量标注数据
如何构建高质量标注数据?大语言模型背后的那只“看不见的手” 在讨论大语言模型(LLM)性能突破时,人们总是聚焦在模型参数、结构设计和训练技巧上。但真正懂行的人都知道——再好的模型也离不开一手好数据,尤其是那些“…...
2024CCPC吉林省赛长春邀请赛 Java 做题记录
目录 I. The Easiest Problem G. Platform Game L. Recharge E. Connected Components I. The Easiest Problem 签到题 直接输出 21 即可 // github https://github.com/Dddddduo // github https://github.com/Dddddduo/acm-java-algorithm // github https://github.com/…...
黑马程序员C++2024新版笔记 第三章 数组
1.数组定义 数组是一批相同类型的元素(element)的集合组成的数据结构。 声明语法: <数据类型> <数组名> [<数组长度>] int v[6] // 声明了可以存放6个int数字的数组 数组的每个元素有编号,称之为下标索引…...
Golang的网络安全策略实践
Golang的网络安全策略实践 一、理解网络安全的重要性 当今的网络环境中,安全问题日益突出,各种类型的攻击如雨后春笋般涌现,给个人和组织的信息资产造成了严重威胁。因此,制定和实施有效的网络安全策略至关重要。 二、Golang在网络…...
SAP学习笔记 - 开发13 - CAP 之 添加数据库支持(Sqlite)
上一章学习了CAP开发准备,添加Service。 SAP学习笔记 - 开发12 - CAP 之 开发准备,添加服务-CSDN博客 本章继续学习CAP开发 - 添加数据库支持(Sqlite)。 目录 1,数据库准备 - H2 内存数据库 - Sqlite数据库 a&…...
DRIVEGPT4: 通过大语言模型实现可解释的端到端自动驾驶
《DriveGPT4: Interpretable End-to-End Autonomous Driving via Large Language Model》 2024年10月发表,来自香港大学、浙江大学、华为和悉尼大学。 多模态大型语言模型(MLLM)已成为研究界关注的一个突出领域,因为它们擅长处理…...
LLM最后怎么输出值 解码语言模型:从权重到概率的奥秘
LM Head Weights(语言模型头部权重):左侧的“LM Head Weights”表示语言模型头部的权重矩阵,它是模型参数的一部分。权重矩阵与输入数据进行运算。Logits(未归一化对数概率):经过与LM Head Weig…...
Better Faster Large Language Models via Multi-token Prediction 原理
目录 模型结构: Memory-efficient implementation: 实验: 1. 在大规模模型上效果显著: 2. 在不同类型任务上的效果: 为什么MLP对效果有提升的几点猜测: 1. 并非所有token对生成质量的影响相同 2. 关…...
【NLP】34. 数据专题:如何打造高质量训练数据集
构建大语言模型的秘密武器:如何打造高质量训练数据集? 在大语言模型(LLM)如 GPT、BERT、T5 爆发式发展的背后,我们常常关注模型架构的演化,却忽视了一个更基础也更关键的问题:训练数据从哪里来…...
uniapp 微信小程序 获取openId
嗨,我是小路。今天主要和大家分享的主题是“uniapp 微信小程序 获取openId”。 一、主要属性 1.uni.login 二、实例代码 1、前端代码 uni.login({provider: weixin,success: (res) > {uni.showLoading({title: 登录中...,mask: true})let code res.…...
企业标准信息公共服务平台已开放标准通编辑器访问入口
标准通 数字化标准编辑器 专业、高效、便捷 企业标准信息公共服务平台 近日,企业标准信息公共服务平台已开放标准通编辑器访问入口,可进入官网指定版块使用! 核心功能亮点 解决企业痛点 传统标准编制,需反复核对格式、逐条…...
小米MUJIA智能音频眼镜来袭
智能眼镜赛道风云再起,小米新力作MIJIA智能音频眼镜2正式亮相,引发市场热议。 这款产品在设计和功能上都有显著提升,为用户带来更舒适便捷的佩戴体验,同时也标志着小米在智能眼镜领域的持续深耕。 轻薄设计,舒适体验 …...
Node.js 实战八:服务部署方案对比与实践
你开发好了接口,准备上线,然后开始犹豫: “直接 node app.js 启就行了吗?” “要不要用 PM2?听说 Docker 更稳?” “Serverless 是不是就不用管服务器了?” 部署是从“能运行”到“能长久运行”…...
地下水安全监测实施方案
一、方案目标 本方案的核心目标在于构建一个全方位、科学严谨且高效运转的地下水监测体系,旨在实现对地下水资源全方位的动态监测、科学化的管理和有效的保护。监测的具体目标涵盖了地下水位、流量以及水质等多个关键性指标,通过精准的数据采集和分析&am…...
HTTP由浅入深
概述 超文本传输协议(HTTP, Hypertext Transfer Protocol) 是一种用于传输超媒体文档(例如 HTML)的应用层协议。它最初被设计用于 Web 浏览器与 Web 服务器之间的通信,但也广泛应用于其他客户端与服务器的交互。 HTT…...
Conda 环境下安装 GCC 和 glibc (crypt.h) 教程
Conda 环境下安装 GCC 和 glibc (crypt.h) 教程 由于运行Low-Light Image Enhancement via Structure Modeling and Guidance原始论文代码,发现服务器的gcc版本太老,没法运行。同时缺少libxcrypt (crypt.h),不得不询问gpt进行解答。发现可以…...
C++面试3——const关键字的核心概念、典型场景和易错陷阱
const关键字的核心概念、典型场景和易错陷阱 一、const本质:类型系统的守护者 1. 与#define的本质差异 维度#defineconst编译阶段预处理替换编译器类型检查作用域无作用域(全局污染)遵循块作用域调试可见性符号消失保留符号信息类型安全无类…...
超小多模态视觉语言模型MiniMind-V 训练
简述 MiniMind-V 是一个超适合初学者的项目,让你用普通电脑就能训一个能看图说话的 AI。训练过程就像教小孩:先准备好图文材料(数据集),教它基础知识(预训练),再教具体技能…...
深入理解仿函数(Functors):从概念到实践
文章目录 1. 什么是仿函数?2. 仿函数与普通函数的区别3. 标准库中的仿函数4. 仿函数的优势4.1 状态保持4.2 可定制性4.3 性能优势 5. 现代C中的仿函数5.1 Lambda表达式5.2 通用仿函数 6. 仿函数的高级应用(使用C2020标准库及以上版本)6.1 函数…...
第二届parloo杯的RSA_Quartic_Quandary
(害,还是太菜了,上去秒了一道题之后就动不了了,今晚做个记录,一点点的往回拾起吧) # from Crypto.Util.number import getPrime, bytes_to_long # import math # # FLAG b************** # # # def gene…...
团队氛围紧张,如何提升工作积极性?
当团队氛围长期处于紧张状态时,员工的积极性、创造力和凝聚力会显著下降。要有效提升工作积极性,应从建设心理安全环境、优化管理沟通方式、提升认可与激励机制、加强情感联结与归属感等方面系统改善。其中,建设心理安全环境是最重要的基础&a…...
vuex的基本使用
个人简介 👨💻个人主页: 魔术师 📖学习方向: 主攻前端方向,正逐渐往全栈发展 🚴个人状态: 研发工程师,现效力于政务服务网事业 🇨🇳人生格言&…...
chrome因使用selenium无图模式导致不再加载图片问题解决
因为使用了selenium的无图模式访问chrome的本地用户数据导致正常使用chrome访问网页时图片不加载。现在页面出现验证码,验证码显示不了。 第一步:关闭所有chrome 第二步:找到Perferences文件 文件的目录为:C:\Users\用户名\AppDa…...
并发编程(5)
抛异常时会释放锁。 当线程在 synchronized 块内部抛出异常时,会自动释放对象锁。 public class ExceptionUnlockDemo {private static final Object lock new Object();public static void main(String[] args) {Thread t1 new Thread(() -> {synchronized …...
自己拥有一台服务器可以做哪些事情
上大学时候,买了自己的第一台服务器在HoRain Cloud上,结果没有好好利用,刚工作时候,又买了一台HoRain Cloud服务器,就想着好好利用。 可以搭建一些学习环境,比如说数据库,gitlab什么的 …...
Node.js聊天室开发:从零到上线的完整指南
为让你全面了解Node.js聊天室开发,我会先介绍开发背景与技术栈,再按搭建项目、实现核心功能、部署上线的流程展开,还会分享优化思路。 Node.js聊天室开发实战:从入门到上线 在即时通讯日益普及的今天,基于Node.js搭建…...
Unity 如何使用Timeline预览、播放特效
在使用unity制作和拟合动画时,我们常用到Timeline,前后拖动滑轨,预览动画正放倒放非常方便。如果我们想对特效也进行这个操作,可以使用下文的步骤。 至此,恭喜你又解锁了一个新的技巧。如果我的分享对你有帮助…...
实物工厂零件画图案例(下)
文章目录 总练习模块文章索引气动顶针轴直线轴承座法兰盘平皮带中空传动轴减速机V带轮减速机箱体 简介:点击此处可以下载该文章的案例模型,加上这篇文章总共有七篇文章是用来练习solidworks软件应用与建模思路的,大概有30多个案例模型&#x…...
esp32课设记录(五)整个项目开源github
我把该项目开源到了github:https://github.com/whyovo/ESP32_course_project 以下是readme文档: ESP32 课设 项目概述 这是一个基于ESP32的课设,实现了多种功能模式的集成,包括信息显示、图片展示、MQTT通信、摩尔斯电码处理以…...
力扣每日一题5-19
class Solution { public String triangleType(int[] nums) { Arrays.sort(nums); if (nums[0] nums[1] < nums[2]) return “none”; if (nums[0] nums[1] && nums[1] nums[2]) return “equilateral”; if (nums[0] nums[1] || nums[1] nums[2]) return “is…...
CI/CD 深度实践:灰度发布、监控体系与回滚机制详解
CI/CD 深度实践:灰度发布、监控体系与回滚机制详解 一、引言 在现代软件开发中,持续集成与持续交付(CI/CD)是加快交付速度、提升质量的关键。面对复杂的分布式系统和海量用户,如何安全、快速地发布新版本,…...