03 信息隐藏:同事改一行,LED全乱了
03 信息隐藏:同事改一行,LED全乱了 C 语言 OOP 系列导航 C语言你真的会封装吗? 三个LED写了三份代码? 同事改一行,LED全乱了 ⇐ 当前位置 手搓class:前缀、init/deinit和生命周期 你的全局变量,该死了 工业库也是同一套封装套路 struct嵌套消灭复制粘贴 写死的函数怎么换 把一组函数指针装进对象 一个指针管所有LED 虚函数不实现会怎样 换硬件不改应用 从自动注册到Linux内核OOP全貌 用 struct + me 把 LED 封装成对象之后,还不能停在这里。 如果结构体成员暴露在外,别人依然可以绕过接口直接改状态。这会带来一个嵌入式里很常见、也很恶心的问题:软件状态变了,硬件状态没变。 先看问题:直接改字段,硬件没跟着变假设 LED 对象长这样: 12345typedef struct { uint8_t pin; uint8_t brightness; bool is_on;}...
02 封装:三个LED写了三份代码?
02 封装:三个LED写了三份代码? C 语言 OOP 系列导航 C语言你真的会封装吗? 三个LED写了三份代码? ⇐ 当前位置 同事改一行,LED全乱了 手搓class:前缀、init/deinit和生命周期 你的全局变量,该死了 工业库也是同一套封装套路 struct嵌套消灭复制粘贴 写死的函数怎么换 把一组函数指针装进对象 一个指针管所有LED 虚函数不实现会怎样 换硬件不改应用 从自动注册到Linux内核OOP全貌 刚开始写驱动时,很多人会按”设备名 + 动作”写函数: 1234567891011121314void red_led_on(void){ gpio_write(5, true);}void green_led_on(void){ gpio_write(6, true);}void blue_led_on(void){ gpio_write(7,...
01 总纲:C语言你真的会封装吗?
01 总纲:C语言你真的会封装吗? C 语言 OOP 系列导航 本系列面向会 C 和单片机基础、刚进入企业项目的同学,从 struct 封装一路讲到 ops、多态和类 Linux 驱动框架。 C语言你真的会封装吗? ⇐ 当前位置 三个LED写了三份代码? 同事改一行,LED全乱了 手搓class:前缀、init/deinit和生命周期 你的全局变量,该死了 工业库也是同一套封装套路 struct嵌套消灭复制粘贴 写死的函数怎么换 把一组函数指针装进对象 一个指针管所有LED 虚函数不实现会怎样 换硬件不改应用 从自动注册到Linux内核OOP全貌 刚进企业做嵌入式时,很多人把”能跑”当成第一目标。比如点三颗 LED,最直接的写法是每颗灯一套函数: 1234567void red_led_on(void);void green_led_on(void);void blue_led_on(void);void red_led_off(void);void green_led_off(void);void...
(Debug记录)编译器的-O3优化所导致Bug
最近在写 Bootloader 配套的 App 时,遇到了一个非常”灵异”的问题:开启 -O3 后,程序读取 Flash 里的镜像 header 字段,结果永远是 0。尽管 Flash 里的数据已被脚本正确回填。 这篇记录一下整个踩坑过程,以及最终确定的根因: 常量传播(constant propagation)+ 编译器优化与”镜像后处理回填”之间的冲突。 背景:镜像 Header 放到 .app_header,CRC 由脚本回填我在 image_header.c 中定义了一个镜像头 g_image_header,放到 .app_header 段,里面包含版本号、CRC 等信息。img_crc32 会在编译完成后由 Python 脚本计算并回填到 bin 文件中。 image_header.c 123456789__attribute__((section(".app_header"), used, aligned(4)))const image_hdr_t g_image_header = { .magic =...
使用 STM32CubeMX 部署 AI 模型
使用 STM32CubeMX 部署 AI 模型一、环境搭建安装 X-CUBE-AI 打开 STM32CubeMX,在初始界面中选择 Help 选项 在弹窗中选择 Manage embedded software packages 选择最新版本的 X-CUBE-AI 进行安装 二、模型验证在正式部署前,我们需要先验证模型能否在 MCU 上正常运行。 新建工程 新建工程并初始化好时钟树 配置 USART 外设(用于输出调试信息) 启用 X-CUBE-AI在 CubeMX 中找到 X-CUBE-AI 选项并启用: 选择 X-CUBE-AI 折叠选项中的 Core 即可激活 AI 功能。下方有三种工作模式可选: 模式 用途 适用场景 SystemPerformance 评估推理时间、CPU 负载等性能指标 部署前的性能分析 Validation 验证模型转换后的准确性 检查量化/压缩导致的精度损失 Application Template 提供业务代码框架 实际落地项目开发 💡 推荐流程:先使用 SystemPerformance...
(转载)萝莉废萌作品推荐
前言 非常主观()有些作品可能只是可爱并不怎么好玩(由于不会写评价所以只放图片和作品名了),但是能保证以下推荐的作品均没有雷点,如NTR等请放心游玩,本来想塞进去更多比如f社四大名著等剧情作,但是考虑到玩萝莉剧本上都是为了可爱和放松所有没有加进去 评分来源: 采用 Bangumi 番组计划 以及 VNDB 分别作为国内外玩家的参考(自评评分基本差不多的原因大概是因为都是废萌,所以给不到高分) 以下作品均没有大雷出现 作品列表灵感满溢的甜蜜创想(常轨脱离creative) 评分来源 评分 Bangumi 6.8/10 VNDB 7.7/10 自评 7/10 锦亚澄(明日海) 金辉恋曲四重奏 -Golden Time 评分来源 评分 Bangumi 7.5/10 VNDB 8/10 自评 7/10 作为本篇的FD添加了米娜线,推荐先游玩本篇再来游玩 米娜 Clover...
2025年电赛C题实战:基于单目视觉的目标物测量装置设计与实现
前言2025 年电赛 C 题的难点不在于识别图形,而在于如何在单目条件下把识别结果稳定地换算成真实尺寸。纯目标检测很容易得到类别和像素框,但题目要的是距离和边长。这套方案的思路是先用 A4 参考物建立尺度,再用几何分析和 YOLO 做目标筛选与测量。 下面直接讲方案里真正有用的部分。 整体方案系统围绕一张带黑边的 A4 参考板工作,完整链路如下: 摄像头采集固定分辨率图像。 在预设 ROI 内寻找 A4 黑边内轮廓。 对 A4 做透视校正,得到统一尺度的俯视图。 基础题直接在俯视图中做几何测量。 发挥题和发挥题二先在俯视图中运行 YOLO,再结合几何分析计算真实边长。 YOLO 只负责定位目标,尺度换算还是走 A4 参考物,这样可以绕开直接用检测框回推尺寸时精度不稳的问题。 基础题:先把 A4 参考系建立起来识别黑边内轮廓,不用外轮廓题目场景里有一条 5 mm 黑色基准线。参考板贴近地面时,外轮廓容易和背景基准线混在一起,所以代码直接用黑边内轮廓的实际尺寸: 12A4_WIDTH_MM = 170A4_HEIGHT_MM = 257 注意这里不是用标准 A4 的 210...
(Debug记录)PCF8591多通道数据篡位问题
问题描述在使用PCF8591不断轮流读取两个通道时, 发现数据出现了错位的问题例如: 12ad_p=Get_AD(1) //读取通道1的值ad_u=Get_AD(3) //读取通道3的值 可是使用数码管显示数据会发现一个很神奇的问题 ad_p显示的是通道3的ad值 ad_u显示的是通道1的ad值 两个数据出现了错位, 这不是我们想看到结果 问题定位打开数据手册7.4节关于ad转换的描述可以看到如下一段话: 译文: 读取周期中传输的第一个字节包含前一个读取周期的转换结果代码。 上电复位后,读取的第一个字节是十六进制 80。 原来PCF8591的AD转换需要时间, 所以会将转换结果储存到寄存器中, 下一次读取时直接将寄存器中的值直接发送出去 将开发板接上逻辑分析仪抓取波形验证 可以发现上电后第一次的读取结果确实是0x80, 而第二次读取的才是第一次设定的通道一的值, 从而导致之后的数据全是错位的 问题解决既然读取寄存器值的是上一次的值, 我们可以直接获取两次AD值就可以保证变量值一定是我们要的通道, 但是连续使用两次Get_AD();函数会产生很多性能开销,...
蓝桥杯单片机
74HC573原理由于蓝桥杯板子上的外设很多, 所以开发板上使用了4个74HC573锁存器来复用引脚, 操控573上的外设由3个步骤组成 138译码器 将3位输入地址(A0, A1, A2)译码为8个独立的输出(D0 ~ D7)。这里我们只需要高4位也就是D4~D7的输出, 所以真值表为: 单片机P2 A0 A1 A2 D 0x80 1 0 0 1110 1111 0xA0 1 0 1 1101 1111 0xC0 1 1 0 1011 1111 0xD0 1 1 1 0111 1111 或非门 (NOR) 因为锁存器使能(Load)为高时,Q 输出将随数据(D)输入而变。当使能为低时,将输出锁存在已建立的数据电平上。我们需要锁存器默认为锁存状态, 即被38译码器选中时才进入透明状态, 所以开发板上使用一端接地的或非门来实现对38译码器选中信号取反 NOR真值表: A0 A1 Y 0 0 1 0 1 0 1 0 0 1 1 0 74HC573锁存器 锁存器使能(Load)为高时,Q...
Ros学习笔记
ROS简介官网 Wiki The Robot Operating System (ROS) is a flexible framework for writing robot software. It is a collection of tools, libraries, and conventions that aim to simplify the task of creating complex and robust robot behavior across a wide variety of robotic platforms. 机器人操作系统(ROS)是一种用于编写机器人软件的灵活框架。 它是工具,库和协议的集合,旨在简化各种机器人平台上,去构建复杂而强大的机器人。 ROS 是 Robot Operating System的简写,翻译过来就是机器人操作系统。它是一个软件框架,目的是提供开发平台,工具及生态给开发人员,让开发人员快速的去开发强大的机器人系统。 ROS...













