自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(127)
  • 问答 (1)
  • 收藏
  • 关注

原创 后缀数组 (Suffix Array) 与 后缀树 (Suffix Tree)

后缀数组和后缀树都是。

2025-05-27 00:18:58 706

原创 bspatch文件代码分析

就是为了保证每次读取补丁数据时,缓冲区的读取位置都是从头开始,防止数据错乱。这个结构体就是用来描述“数据流”的。它把“怎么读数据”和“怎么写数据”都封装成了函数指针,并且可以带上自己的上下文参数。opaque_r:读操作时用到的上下文指针(比如文件指针、内存地址等),你可以理解为“读的时候需要带点啥”。read:读数据用的函数指针,告诉补丁算法“怎么从补丁流里读数据”。opaque_w:写操作时用到的上下文指针(比如目标地址等),你可以理解为“写的时候需要带点啥”。write。

2025-05-26 16:05:32 791

原创 内存越界(Memory Out-of-Bounds)详解

内存越界(Memory Out-of-Bounds)是一种基本的。

2025-05-24 21:00:28 921

原创 stream数据流

数据流(Stream Data Flow)是一种。

2025-05-24 18:38:25 761

原创 vFile文件的精读

这显然不对,因为你可能已经读到文件中间了。这里就会和函数指针类型定义联系起来。,用于在内存中模拟文件操作。,只读取剩余部分,保证安全。定义了一个虚拟文件结构体。假设当前文件总大小为。

2025-05-24 18:03:36 294

原创 函数指针类型定义

想象一下,你有一个电话簿,里面记录的都是人名和对应的电话号码。当你想要打电话给“张三”时,你查到他的号码,然后拨打这个号码,就能联系到张三本人。现在,如果你的电话簿里记录的不是电话号码,而是“张三的秘书的电话号码”,或者“张三家的座机号码”,甚至“张三公司前台的电话号码”。这些号码虽然不同,但它们最终都指向一个目的:联系到张三。在编程中,“函数”就像是“张三本人”,它负责执行特定的任务。

2025-05-24 12:05:17 806

原创 虚拟文件(VFS)

虚拟文件系统(VFS)是一种。

2025-05-24 11:42:02 1060

原创 BSDIFF算法详解

BSDIFF 算法是。

2025-05-24 10:06:03 798

原创 Mcu_Bsdiff_Upgrade

MCU BSDiff 升级系统通过使用二进制差分技术,提供了一种在资源受限的微控制器上进行高效固件更新的机制。系统不传输和存储完整的固件映像,而是只处理固件版本之间的差异,从而显著缩小更新包并降低带宽要求。该架构遵循一个由两部分组成的模型:系统采用新旧固件二进制文件,使用 BSDiff 算法创建补丁,将补丁传输到设备,然后应用补丁以就地创建新的固件版本。该系统由几个关键组件组成,这些组件协同工作以实现差异更新机制: 架构遵循模块化设计,其中:补丁应用程序过程包括几个步骤:该系统设计为在嵌入式设备的内存限制内

2025-05-21 14:16:33 511

原创 PX4开始之旅(二)通过自定义 MAVLink 消息与 QGroundControl (QGC) 通信

想象一下,MAVLink 就像是无人机(飞控)和地面站(QGroundControl)之间约定好的一种“语言”。这种语言有很多标准的“词汇”和“句子”,比如用来报告无人机位置、速度、电池电量,或者发送起飞、降落指令等等。但是,有时候你可能想让无人机做一些特别的事情,或者发送一些标准 MAVLink 语言里没有的信息。比如,你的无人机上装了一个很特别的传感器,你想把这个传感器的数据显示在 QGC 上;或者你想通过 QGC 控制一个自定义的机械臂。这时候,标准的 MAVLink 语言就不够用了。

2025-05-09 23:37:26 1013

原创 PX4开始之旅(一)自动调参

滤波是信号处理领域的一个基本概念,其抽象本质是。

2025-05-09 18:23:50 1058

原创 简易版无人机飞控

想象你正在骑一辆没有车把的自行车,要保持平衡需要不断调整身体重心。四旋翼无人机也是如此,它需要实时感知自己的倾斜角度,并通过调整四个电机转速来保持平衡。使用互补滤波或卡尔曼滤波将陀螺仪和加速度计数据融合,得到准确的欧拉角。

2025-05-09 17:33:32 486

原创 为什么拆分高低字节而不直接存入数组

当需要传输一个多字节的值(如16位的长度值)时,必须将其拆分成单个字节进行传输。如果想直接存储在数组中而不拆分,那么需要使用uint16_t类型的缓冲区,但W25Q64闪存的接口是基于字节(8位)作的,所以最终在与硬件交互时仍然需要进行字节拆分。这种拆分方式实际上是在实现小端序(little-endian)的字节序,即低字节在前,高字节在后。不同的系统可能使用不同的字节序(大端序或小端序)。这种拆分和重组16位值的方法在嵌入式系统和通信协议中非常常见,特别是在处理跨字节边界的多字节数据时。

2025-05-08 04:16:52 438

原创 红外信号发送的简单说明

Cyberry Potter Electromagic Wand 项目包括传输红外 (IR) 信号的功能,类似于电视遥控器的工作原理。这段代码是用于发送红外线(IR)信号的循环处理部分。简单来说,它是一个“按照遥控器信号模式,控制红外LED开关”的机制。:实际的 IR 信号是通过在特定持续时间内快速打开和关闭 38kHz 载波产生的,从而产生 IR 接收器可以理解的模式。通过这种方式,按照预先记录的遥控器信号模式(存储在数组中)精确控制红外LED,从而可以操作电视、空调等家电设备。红外信号发送代码解析。

2025-05-08 04:14:34 442

原创 基于nnom的多选择器

核心组件作模式系统有两种主要作模式,用于确定识别手势时的行为:模式 0 (执行)模式 1 (录制)默认情况下,系统以模式 0 启动。长按按钮 (>0.5 秒) 可在模式之间切换,LED 指示灯模式提供当前模式的视觉反馈。核心硬件组件STM32F103CB 微控制器STM32F103CB 微控制器用作 WAND 系统的中央处理单元。MPU6050 IMU 传感器MPU6050 是一个 6 轴运动跟踪装置,结合了 3 轴陀螺仪和 3 轴加速度计。

2025-05-08 00:15:53 932

原创 基于nnom模型的多选择控制器

CyberryPotter ElectromagicWand 是一款基于 STM32F103C8T6 微控制器的嵌入式手势识别系统。它使用MPU6050惯性测量单元 (IMU) 来捕获运动数据,使用嵌入式机器学习库通过卷积神经网络 (CNN) 对其进行处理,并识别 12 种不同的手势模式(称为“咒语”)以触发相应的作,例如控制 LED。nnom系统架构CyberryPotter ElectromagicWand 由三个主要组件组成:硬件、固件和 PC 软件工具,它们协同工作以实现手势识别和响应。

2025-05-07 16:22:20 949

原创 无人机相关技术与故障排除笔记

核心逻辑: 通过微控制器生成高精度 PWM 信号,控制电调输出电压,驱动无刷电机按需运转。关键参数: 频率决定响应速度,分辨率影响控制精度,初始占空比保障安全性。实际应用: 无人机、机器人、工业自动化等领域依赖此类参数实现精准动力控制。核心逻辑: 通过电子换向和磁场同步实现无刷电机高效运转,外转子适合大扭矩场景,内转子适合高转速场景。技术关键: 霍尔传感器定位、六步换向顺序、MOS 管驱动电路设计。SPI 凭借全双工、高时钟频率和精简协议实现高速传输,适合对速度要求高的场景;

2025-05-06 08:22:09 933

原创 手表心率检测算法的简化说明

根据项目文档,开发人员最初使用了传感器的官方库,但发现它对于他们的需求来说太慢了,因此他们开发了自己的自定义算法来计算心率。OV-Watch 中的心率检测算法是一种简单的峰值检测算法,其工作原理是识别 PPG 信号中的峰值并计算这些峰值之间的时间以确定心率。峰值检测算法侧重于识别 PPG 信号中心率峰值的特征形状,而不是使用更复杂的信号处理技术,这与开发更简单、更快速算法的项目目标一致。OV-Watch 中的算法是一种简化的实时峰值检测方法,可直接处理来自 EM7028 传感器的原始 PPG 信号。

2025-05-06 03:39:56 602

原创 手表 各功能遇到的问题与解决方案

在电源管理方面,实现了三种模式:正常运行模式、睡眠模式(MCU进入STOP模式)和关机模式 README.md:131-132。在V2.4.1版本中,修改了串口IO口的处理方式,解决了休眠功耗高的问题 README.md:65。实现经典的双栈表达式计算法:一个栈存放数字,一个栈存放符号 README.md:182-184。使用外部EEPROM进行数据存储,并实现了完善的数据校验机制 README.md:155。使用栈结构存储页面指针,而不是直接存储页面对象,避免动态变化导致的问题。

2025-05-06 02:48:52 799 1

原创 手表的编程思想技巧详解

本回答基于对 OV-Watch 代码库的分析,主要介绍了其软件架构、页面管理、计算器功能、硬件抽象层、任务管理、心率测量和低功耗设计等核心功能的实现方式。OV-Watch 项目展示了一个结构良好的嵌入式系统设计,在硬件、中间件和应用程序层之间明确分离了关注点。该代码库展示了嵌入式系统设计的良好实践,包括适当的硬件抽象,可促进实际硬件和 PC 仿真环境之间的代码可移植性,这对于 UI 开发和测试特别有价值。该项目通过文件实现硬件抽象层,该文件充当硬件层和应用层之间的中间件。

2025-05-05 23:10:23 656

原创 手表关于MPU6050中的功能实现

OV-Watch 项目为 MPU6050 传感器实施了复杂的电源管理,以优化电池寿命,同时保持手腕检测和计步功能。

2025-05-05 20:37:05 1350

原创 手表功能RunModeTasks

RunModeTasks 执行特定于当前模式的功能 根据模式控制作行为”这句话是指 OV-Watch 智能手表项目中的一组任务,这些任务负责管理设备的运行模式并根据不同模式控制设备的行为。这种模式管理机制是智能手表延长电池寿命的关键设计。RunModeTasks 功能解释。

2025-05-05 19:04:00 404

原创 手表对EEPROM的访问

信号灯(同步机制)在OV-Watch中的实现方式在OV-Watch项目中,信号灯(即同步机制)主要通过FreeRTOS作系统提供的消息队列、任务优先级和任务挂起机制来实现对共享资源的访问控制。消息队列实现这些消息队列用于任务间的同步和通信,尤其是可能用于控制对EEPROM的访问。EEPROM访问控制显示器访问控制任务挂起和恢复机制任务优先级机制总结。

2025-05-05 04:17:50 297

原创 手表部件通信

项目使用了名为 (硬件数据访问)的中间层,作为 UI 和硬件之间的桥梁。这一层抽象了硬件访问,为 UI 组件提供了统一的接口来读取各种传感器和硬件组件的数据。在 OV-Watch 项目中,它在函数中用于检查更新请求并在需要时触发传感器数据处理。FreeRTOS 中的消息队列是线程安全的数据结构,支持任务间通信。OV-Watch 中的实现展示了一种清晰的关注点分离,每个任务都处理特定的职责并通过消息队列进行通信。OV-Watch 项目采用了多层架构来读取和显示数据,主要通过硬件中间层和任务管理系统来实现。

2025-05-05 04:07:17 912

原创 手表中计算器中小数的处理

在实现中,当需要处理连续数字并且位于小数点后时,处理逻辑与整数不同:整数是通过乘10实现位移,而小数是通过除以10的幂来调整小数位。这段代码是计算器字符串解析过程中的核心部分,用于判断当前处理的字符与前一个字符的关系。具体来说,它检查前一个处理的字符是否为数字类型。在OV-Watch的计算器实现中,小数处理是通过一个特殊的标志位和位置计数器来完成的。存储当前正在处理的字符信息,而 存储前一个处理过的字符信息。这种处理方法确保了计算器能正确识别和计算带小数点的数值。3. 处理小数点后的后续数字。

2025-05-05 03:27:06 252

原创 FreeRTOS手表学习

概述OV-Watch 是一款功能齐全、节能的智能手表,具有丰富的功能。该项目为具有广泛功能的可穿戴设备提供完整的固件和硬件设计。系统架构OV-Watch 遵循分层架构模式,可分离关注点并提高可维护性。系统架构概述硬件层固件层系统层应用层启动过程和固件更新OV-Watch 实现了一个引导加载程序系统,该系统支持通过蓝牙进行无线 (OTA) 更新。引导流程从 2.4.0 版本开始,固件已拆分为单独的 Bootloader 和 Application 组件,以支持 OTA 更新。

2025-05-05 02:51:04 1104

原创 QUIC 与 MQTT 深度解析:协议、优势与应用融合

本文详细介绍了 QUIC 协议的核心特性、优势以及它如何解决传统传输协议的问题。同时,深入解析了 MQTT 与 QUIC 的区别,并重点阐述了 MQTT over QUIC 这种融合方案的实现原理、代码示例和实际应用场景。通过理解和应用这些技术,可以在物联网、Web 服务等领域构建更高效、更稳定、更安全的网络通信系统,特别是在处理热点数据、弱网环境和高并发场景时,其优势更加突出。MQTT over QUIC 结合了 MQTT 的轻量级消息模型和 QUIC 的高效传输能力,为物联网通信提供了新的优化方向。

2025-05-04 00:38:55 695

原创 ​​复合心跳包设计​保活

​​维度​​​​标准 MQTT 心跳​​​​自定义复合心跳​​​​触发方式​​协议层自动触发(PINGREQ/PINGRESP)应用层定时器或主题订阅触发​​数据负载​​空包(0 字节)包含健康指标的 JSON/二进制数据​​灵活性​​固定频率,不可扩展支持动态频率、多指标扩展​​适用场景​​基础连接保活健康监控、故障预警等复杂场景​EMQX规则引擎定时推送触发指令​​​EMQX触发主题​(服务器主动发布触发消息)​​ESP32响应主题​(设备上报复合心跳包)

2025-05-04 00:06:27 780

原创 SQLite优化策略、Redis Cluster分片存储、历史数据转存ClickHouse(记得找好工具)

本文详细阐述了针对数据库优化,特别是处理热点数据和历史数据的关键技术。通过分库分表分散数据压力,索引优化加速数据查询,写入优化提升数据写入效率,WAL 模式提高并发读写性能,数据压缩节省存储空间,连接池与锁控制保障高并发下的数据一致性。在此基础上,进一步探讨了利用对热点数据进行高速缓存和分片处理,以及将历史数据转存到 ClickHouse进行高效分析的分层存储策略。这些技术结合应用,能够显著提升数据库系统的整体性能、可伸缩性和成本效益,有效应对海量数据和高并发访问的挑战。

2025-05-04 00:05:20 608

原创 with的用法

<html>

2025-05-03 22:53:26 1034

原创 面试可能问题的解答

​:允许在同一作用域内定义多个同名函数,但这些函数的参数列表必须不同(参数类型/数量/顺序不同)。

2025-04-28 04:06:34 1107

原创 LVGL按键触发回调函数的完整流程

如果是我的话我会怎么写:例如按键,我先定义一个结构体里面包含ID,事件名等和回调函数的链表节点结构体里面有具体函数的指针,也有指向下一个回调函数的链表节点的指针,初始化一个结构体变量的,通过BSP层来驱动触摸屏幕,再通过中间层与被按下时就会判断是长按还是短按还是其他,改变变量的事件例如:改成长按,生成事件包后再注册你长按的回调函数链表节点,再根据变量的事件到链表中遍历最后实现功能.父容器监听所有子列表项的点击事件,无需为每个列表项单独注册回调。的回调,打印所有事件日志,观察事件触发顺序。

2025-04-24 14:45:14 1103

原创 LVGL出现的问题(一)(对象获取的宽长是0,对象获取的坐标是错误的)

问题类型关键操作相关文档坐标未更新调用坐标系误解使用对齐函数替代手动计算布局依赖更新父对象布局坐标函数误用区分原始坐标与对齐后坐标样式影响检查边框、填充属性对象未正确初始化关联到活动屏幕通过以上步骤排查,可解决绝大多数坐标不准确的问题。若仍存在异常,建议结合LVGL的调试工具(如LV_USE_LOG)输出实时坐标值辅助分析。问题类型关键操作验证方法延迟更新未触发调用打印更新前后的尺寸内容/尺寸未设置显式设置尺寸或添加内容检查对象是否有可见内容布局配置错误。

2025-04-23 12:36:51 818

原创 LVGL学习(三)(groups,开关,复选框,下拉列表,滚轮,进度条,滑动条,圆弧,定时器,线条,文本框,按钮矩阵,通过FreeType显示字体,添加新的图标字体SYMBOL)

​​预制组件​​:提前安装好传感器(状态检测)、执行器(样式变化)、控制器(事件处理)​​批量生产​​:后续控件直接从流水线下线,自带完整交互能力​​开发者只需​​:告诉控件“做什么”(业务逻辑),而不用操心“怎么做”(交互响应)这种设计让 LVGL 的开发效率大幅提升,就像用预制板盖房子——不用从烧砖开始,直接搭积木就能建成大厦。​​滚轮 = 滑动选择列表​​,配置简单,交互直观。记住关键函数:设选项、改样式、拿选中值、绑事件。动手试一次比看十遍更管用!

2025-04-23 12:15:04 1300 1

原创 LVGL学习(二)(lv_label,lv_btn)

3-1_标签lv_label3-1_标签lv_label。

2025-04-22 02:12:45 911

原创 LVGL学习(一)(IMX6ULL运行LVGL,lv_obj_t,lv_obj,size,position,border-box,styles,events)

将拨码开关拨至USB烧写模式:烧录完成后将拨码开关设为EMMC启动模式:登录用户名为:root。不需要密码,输入 root 之后回车即可将资料目录中的 “03_开发软件\imx6ull_toolchain\toolchain.zip” 解压得到 “arm-buildroot-linux-musleabihf_sdk-buildroot.tar.gz”,将其上传到虚拟机系统中在虚拟机中执行命令解压:tar -xvf arm-buildroot-linux-musleabihf_sdk-buildroot.t

2025-04-21 21:20:41 960

原创 OV_Watch(二)(OV_Watch中Tasks学习)

是系统中“活动状态” 的 “心跳信号通道”发送端:在用户交互(界面操作、功能计时)时发送 “活动信号”,阻止系统进入节能模式。接收端:根据队列是否有消息,判断是否执行关屏、降频等空闲操作。这种设计确保设备在 “用户体验” 和 “功耗控制” 之间取得平衡,是嵌入式系统中典型的任务间通信案例。驱动 GUI 框架的时间逻辑(LVGL 滴答更新)。处理特定页面的实时计时(如定时器页面的毫秒级计数)。控制传感器的周期性操作(如心率数据的定时采样)。

2025-04-21 03:17:41 627

原创 OV-Watch(一)(IAP_F411学习)

flash_if.c是 Flash 操作的 “底层工具箱”,为 Ymodem 传输提供了可靠的硬件操作支持。核心逻辑围绕“擦除 - 写入 - 验证”三大步骤,确保固件升级过程中数据的正确性和安全性。理解这些函数的作用,就能明白 IAP 如何通过串口等方式安全地更新设备固件,就像给手机 “无线升级系统” 一样,每一步都需要严格的擦写和验证。第一段代码:禁用 Flash 写保护(功能关闭指定 Flash 存储区的写保护,允许后续对这些区域进行擦除或编程操作。

2025-04-20 12:20:03 577

原创 Using the CubeMX code (二)(Thermal Camera,simulink hardware-in-the-loop(HIL) Demo)

​​。

2025-04-18 12:25:39 839

原创 MATLAB Simulink开发之路(一)点亮一个LED灯

2025-04-17 23:16:34 116

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除