- 博客(59)
- 收藏
- 关注
原创 轻量级消息总线实现 (C++)
消息总线是一种用于组件间通信的架构模式,它允许系统中的不同部分通过发布/订阅机制进行松耦合的交互。下面是一个轻量级的C++消息总线实现。:对于频繁创建销毁的消息对象,可以使用对象池减少内存分配开销。// 订阅AnotherMessage。// ... 其他成员函数同上 ...// ... 其他成员变量同上 ...:在高并发场景下,考虑使用无锁队列替代互斥锁。// 删除拷贝构造函数和赋值运算符。// ... 其他成员变量 ...// 订阅TestMessage。线程安全的发布/订阅机制。
2025-07-16 19:10:34
457
原创 模板类继承工厂模板基类
/ 输出: Derived2 processing: 100。// 输出: Derived1 processing: 42。// 输出: Derived1 processing。// 输出: Derived2 processing。// 输出: Derived1 processing。// 输出: Derived2 processing。// 基类模板(CRTP 风格)如果不需要运行时多态,可以用。仍然支持运行时多态(虚函数)// 基类模板(工厂接口)通过虚函数实现运行时多态。可以是模板类或非模板类。
2025-07-16 11:44:25
549
原创 C++ 中两个类之间的通信方式
/ 可以访问 ClassB 的私有成员。// 声明 ClassA 为友元。// 调用 ClassB 的方法。在 C++ 中,两个类之间可以通过多种方式进行通信。// ClassA 包含 ClassB 对象。每种方法都有其适用场景,应根据具体需求选择最合适的通信方式。对于复杂通信或解耦需求,考虑观察者或中介者模式。需要访问私有成员时考虑友元(但应谨慎使用)避免过度使用友元,因为它会破坏封装性。对于简单关系,使用组合或参数传递。
2025-07-15 22:29:08
429
原创 C++11 std::async使用
头文件中,它是 C++11 引入的并发编程工具,用于异步执行任务并获取结果。#include <future> // 必须包含 <future>// 使用 std::async 异步执行 compute()// 获取异步任务的结果(如果未完成,会阻塞等待)),由实现决定是立即启动还是延迟执行。:立即在新线程中执行(默认)。,用于获取异步任务的结果(:延迟执行,直到调用。:如果任务抛出异常,
2025-07-15 09:53:04
329
原创 “找到一个或多个多重定义的符号“(LNK2005 或 LNK1169)
/ ❌ 错误(应仅在头文件声明,在 .cpp 定义)// 声明// 定义。
2025-07-13 17:10:15
497
原创 C++ 单例模式实现
在现代C++中,推荐使用局部静态变量的实现方式,它简洁且线程安全(C++11保证局部静态变量的初始化是线程安全的)。违反单一职责原则(既管理实例又包含业务逻辑)// 删除拷贝构造函数和赋值运算符。// 私有构造函数防止外部实例化。避免频繁创建和销毁对象,节省系统资源。// 在程序开始前就初始化。在多线程环境下需要特殊处理。需要频繁创建和销毁的对象。创建对象耗时或资源消耗大。确保一个类只有一个实例。访问数据库或文件的对象。// 初始化静态成员。可能导致代码耦合度高。
2025-07-13 11:45:04
787
原创 C++ 右值引用和移动语义的应用场景
/ 传统方式 - 拷贝构造// 调用拷贝构造函数// 移动语义方式 - 更高效// 调用移动构造函数// 注意:此后 name2 处于有效但未定义状态。
2025-07-13 11:31:53
857
原创 C++ Lambda 表达式详解
Lambda 表达式是 C++11 引入的一项重要特性,它允许在代码中内联定义匿名函数对象。Lambda 极大地简化了代码编写,特别是在使用 STL 算法时。
2025-07-10 23:11:19
940
原创 cJSON 使用方法详解
c// 自定义malloc/free函数free(ptr);// 设置自定义内存管理函数// 现在cJSON会使用自定义的内存管理。
2025-06-29 18:04:34
626
原创 CMakeLists修改生成两个动态库
{CMAKE_CURRENT_SOURCE_DIR}/include/subsystemlib # 假设头文件在 include/subsystemlib。│ │ └── my_lib.h # 第一个库的头文件。│ └── SubSystem.h # 第二个库的头文件。│ ├── my_lib.cpp # 第一个库的源文件。│ └── SubSystem.cpp # 第二个库的源文件。# 设置第一个库的头文件路径。
2025-06-29 14:24:57
834
原创 编译生成动态库,函数未定义错误排查
include_directories(${PROJECT_SOURCE_DIR}/include) # 替换为实际路径。grep "simInit" /path/to/project/include/sim_api.h # 查看声明是否匹配。find /path/to/project -name "sim_api.h" # 查找头文件位置。#include "sim_api.h" // 或实际声明 simInit 的头文件。// 示例:检查头文件中的声明是否如下。// 在头文件中声明为导出函数。
2025-06-29 13:33:01
783
原创 C++子类继承父类方式总结
/ ✅ 可以访问(因为是 public 继承)// 输出 "Derived::show"virtual void show() { // virtual 允许子类覆盖。// 输出 "Base::show"// privateFunc();// ❌ 编译错误,无法访问。Derived() : Base(42) { // 显式调用父类构造函数。// ✅ 调用子类方法。void show() override { // 明确表示覆盖。// 显式调用父类方法。
2025-06-29 11:34:42
880
原创 macbook配置vscode连接腾讯云服务器
公钥流向:MacBook的公钥 → Ubuntu服务器的。私钥保密:MacBook的私钥()仅保存在本地,不可泄露。主机验证:服务器公钥会自动缓存在MacBook的,无需手动操作。按照此流程配置后,VSCode即可通过SSH密钥无缝连接腾讯云Ubuntu服务器。
2025-06-15 22:54:03
392
原创 Keil中 L6406E: No space in execution regions with .ANY selector matching heap_4.o(.bss) 错误分析简述
当然,具体也可能由于以下原因,需要再分析。表明内存分配已超出预期范围,通常与。
2025-06-10 18:07:02
1146
原创 触发DMA传输错误中断问题排查
通过检查DMA配置一致性、分析中断优先级、验证缓冲区访问、调试错误标志,并进行最小化冲突测试,可以定位并解决集成BLE模块后触发的DMA传输错误。核心原则是确保DMA传输的独立性和数据处理的同步性,避免资源竞争和配置冲突。:在访问DMA缓冲区的代码段(如原有线程和BLE回调)中添加互斥锁。结构体),确认关键参数(传输方向、缓冲区地址、中断使能)未被修改。在STM32项目中,集成BLE模块后触发DMA传输错误中断(:若使用中断嵌套,确保DMA中断的抢占优先级足够高。)的优先级高于或等于BLE模块的中断。
2025-06-09 23:58:20
577
原创 定位触发DMA2_Stream1_IRQHandler中断的具体原因简述
通过检查DMA配置、在中断服务例程中添加日志、使用调试器检查寄存器、验证外设交互代码,并进行最小化测试,可以定位触发。核心原则是结合代码逻辑和硬件状态,逐步缩小问题范围,最终定位触发中断的源头。中断的具体原因,需结合代码分析、寄存器检查和调试工具。:确认在DMA初始化代码中是否启用了非预期的中断。在STM32项目中,若需定位触发。
2025-06-09 23:30:29
517
原创 GPIO(通用输入输出)与LPUART(低功耗通用异步收发传输器)简述
LPUART支持DMA和硬件FIFO,可减轻CPU负担,适用于高速数据传输(如日志记录、传感器数据采集)。LPUART可在MCU停止模式下以极低功耗捕获数据帧,适用于电池供电设备(如智能手表、传感器节点)。通过合理配置,可实现低功耗、高可靠的串口通信,适用于物联网、可穿戴设备等场景。
2025-06-09 22:26:22
589
原创 TTL简述
高电平(逻辑1):电压范围通常为2.4V~5V(具体取决于电源电压,STM32常用3.3V系统,对应高电平为3.3V)。低电平(逻辑0):电压范围通常为0V~0.4V。
2025-06-07 12:28:16
713
原创 STM32的系统滴答定时器简述
通过合理配置SysTick,可显著提升STM32应用的实时性与任务管理效率,是嵌入式开发中的核心组件之一。STM32的系统滴答定时器(SysTick)是。,核心作用是为操作系统或应用程序提供。
2025-06-07 11:06:12
589
原创 C++11实现TCP网络通讯服务端处理逻辑简化版
该实现能够有效处理TCP粘包问题,确保完整数据包的接收和处理,适用于需要固定长度数据包传输的场景。
2025-06-05 09:01:18
355
原创 网络通讯服务端接收数据循环处理逻辑简单版
/ 如果帧头不匹配,则丢弃第一个字节,继续检查。// 这里可以调用业务层处理函数。// 从缓冲区中移除已处理的数据。// 连接关闭或出错。// 处理完整的一帧数据。// 将读取的数据追加到缓冲区。// 循环处理缓冲区中的数据。// 创建socket文件描述符。// 绑定socket到端口。// 设置socket选项。
2025-06-05 08:46:41
250
原创 C++网络通信:TCP数据包的发送与接收编程
在C++中实现TCP网络通信涉及创建客户端和服务端程序,以实现数据的发送和接收。• 协议设计:在实际应用中,可能需要设计一个简单的协议来管理数据的发送和接收,尤其是在需要处理复杂数据包时。• 多线程:如果需要同时处理多个客户端连接,可以考虑使用多线程或非阻塞I/O。• 错误处理:在实际应用中,应该增加更多的错误处理代码,以确保程序的鲁棒性。• 循环读取客户端发送的数据,并发送响应。// 读取客户端发送的数据。// 创建socket文件描述符。// 绑定socket到端口。// 创建socket。
2025-06-05 08:02:51
458
原创 GPIO(通用输入输出接口)简述
GPIO(General Purpose Input/Output)是微控制器、单片机或嵌入式系统中一类可编程配置的引脚,其核心功能是通过软件控制实现数字信号的输入或输出。
2025-06-02 21:18:36
457
原创 STM32H7上移植SEGGER的硬件异常分析简述
在STM32H7上移植SEGGER的硬件异常分析功能(如通过J-Link或SystemView捕获HardFault等异常),需结合ARM Cortex-M7内核特性和SEGGER工具链。在STM32H7上移植SEGGER的硬件异常分析功能,其核心作用是。
2025-06-01 09:44:05
958
原创 ARM架构简述
其成功源于对低功耗、高能效的极致追求,以及通过IP授权构建的开放生态。从智能手机到数据中心,ARM正重新定义计算产业的能效边界,成为AI时代无处不在的计算基石。,通过简化指令集、优化硬件复杂度,实现每瓦特性能的最大化。的处理器架构,由英国ARM公司(现属软银集团)设计。ARM(Advanced RISC Machine)是一种基于。ARM架构并非传统意义上的“操作系统”,而是一种。
2025-05-28 23:26:53
346
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人