信息隐藏:static 与头文件边界
03 信息隐藏:static 与头文件边界 C 语言 OOP 系列导航 本系列面向会 C 和单片机基础、刚进入企业项目的同学,从 struct 封装一路讲到 ops、多态和类 Linux 驱动框架。 C 语言面向对象设计路线 封装:struct 数据与 me 指针 信息隐藏:static 与头文件边界 ⇐ 当前位置 类的组织:前缀、init/deinit 与生命周期 数据归位:struct 成员与 static 变量 HAL 映射:工业库的封装结构 继承:struct 嵌套复用公共字段 函数指针:把行为作为参数 ops/vtable:行为表与对象绑定 多态与转型:base 指针与 dispatch 接口设计:ops 合同与默认实现 完整框架:抽象层与硬件解耦 终章:自动注册与 Linux 内核 OOP 结构 struct + me 解决了“一份函数操作多个对象”的问题,但还没解决“别人能不能绕过接口乱改状态”的问题。 例如 LED 对象里有一个 is_on: 12345typedef struct { uint8_t pin; ...
封装:struct 数据与 me 指针
02 封装:struct 数据与 me 指针 C 语言 OOP 系列导航 本系列面向会 C 和单片机基础、刚进入企业项目的同学,从 struct 封装一路讲到 ops、多态和类 Linux 驱动框架。 C 语言面向对象设计路线 封装:struct 数据与 me 指针 ⇐ 当前位置 信息隐藏:static 与头文件边界 类的组织:前缀、init/deinit 与生命周期 数据归位:struct 成员与 static 变量 HAL 映射:工业库的封装结构 继承:struct 嵌套复用公共字段 函数指针:把行为作为参数 ops/vtable:行为表与对象绑定 多态与转型:base 指针与 dispatch 接口设计:ops 合同与默认实现 完整框架:抽象层与硬件解耦 终章:自动注册与 Linux 内核 OOP 结构 刚开始写驱动时,很多人会按“设备名 + 动作”写函数: 1234567891011121314void red_led_on(void){ gpio_write(5, true);}void...
C 语言面向对象设计路线
01 C 语言面向对象设计路线 C 语言 OOP 系列导航 本系列面向会 C 和单片机基础、刚进入企业项目的同学,从 struct 封装一路讲到 ops、多态和类 Linux 驱动框架。 C 语言面向对象设计路线 ⇐ 当前位置 封装:struct 数据与 me 指针 信息隐藏:static 与头文件边界 类的组织:前缀、init/deinit 与生命周期 数据归位:struct 成员与 static 变量 HAL 映射:工业库的封装结构 继承:struct 嵌套复用公共字段 函数指针:把行为作为参数 ops/vtable:行为表与对象绑定 多态与转型:base 指针与 dispatch 接口设计:ops 合同与默认实现 完整框架:抽象层与硬件解耦 终章:自动注册与 Linux 内核 OOP 结构 刚进企业做嵌入式时,很多人会把“能跑”当成第一目标。比如点三颗 LED,最直接的写法是每颗灯一套函数: 1234567void red_led_on(void);void green_led_on(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题主要源码
识别部分由于底层逻辑是识别黑胶带轮廓来确定A4纸的位置, 而题目描述中有提到一条宽为5mm黑色基准线, 当A4纸目标物紧贴地面, 即紧贴基准线时, 黑胶带外轮廓会与基准线重合, 这时可能就会导致无法正确识别A4纸目标物, 所以我们识别黑胶带的内轮廓来确定A4纸的位置。 所以先定义黑胶带内轮廓的数据 12A4_WIDTH_MM = 170A4_HEIGHT_MM = 257 识别黑胶带内轮廓首先我们需要对输入图像进行预处理: 转换为灰度图像 应用高斯模糊 使用边缘检测算法 接着使用cv2.findContours(edged, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)来寻找所有轮廓并存放进valid_contours数组中以便后续采用第二大的轮廓作为Target的内轮廓 12345678910111213141516171819202122232425262728293031323334353637383940414243444546def find_a4_contour(image): ...
(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...













