自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(104)
  • 收藏
  • 关注

原创 【DMA】DMA实战:用DMA操控外设

本文介绍了使用DMA控制器直接操作外设寄存器的实战方法。通过DMA2控制GPIOA翻转LED的案例,详细说明了DMA配置步骤:1)确定DMA通道与总线连接关系;2)配置为MemoryToMemory模式;3)获取目标寄存器地址。重点解决了DMA传输标志位清除问题,对比了查询等待和中断回调两种方式,并指出中断方式仍会唤醒CPU的局限性。最后提出优化思路:增加单次传输数据量或结合定时器触发,实现真正的CPU解放。文章提供了完整的代码实现和调试方法。

2025-09-18 23:13:12 485

原创 【DMA】DMA入门:理解DMA与CPU的并行

本文对比分析了基于中断和DMA的串口接收模式。中断模式下,CPU需逐个字节处理数据搬运,效率较低;而DMA模式下,DMA自动完成数据搬运,CPU仅需处理完整数据包,效率更高。实验通过GPIO翻转验证了DMA模式能显著减少CPU中断响应时间。文章详细介绍了HAL_UART_Receive_IT、HAL_UART_Receive_DMA等关键函数的调用机制,以及USARTx_IRQHandler和HAL_UART_RxCpltCallback中断服务函数的执行流程。

2025-09-18 23:02:55 573

原创 【DMA】DMA架构解析

STM32F411芯片的DMA架构分析:AHB总线矩阵挂载6主5从设备,包括ICode/DCode总线、DMA1/2内存与外设总线等。DMA1仅能访问APB1外设,而DMA2可访问更多外设。AHB1/APB桥用于外设降速处理。总线矩阵的M/S标识采用主设备连接从端口的特殊设计,交叉点"小圆圈"表示可连接性。该架构实现了高效的数据传输管理。

2025-09-17 23:42:18 740

原创 FreeRTOS任务切换流程

FreeRTOS实现多任务调度的核心在于上下文切换机制。该系统通过PendSV异常和双堆栈指针(MSP/PSP)实现任务切换:1)每个任务拥有独立栈空间,保存完整的寄存器状态(R0-R15、xPSR等);2)SysTick中断触发调度,但由低优先级的PendSV实际执行切换;3)切换时保存当前任务上下文到其栈中,并从新任务栈恢复寄存器;4)通过恢复PC寄存器实现任务"无缝续跑"。这种设计利用硬件特性,既确保中断及时响应,又实现高效的任务切换。

2025-09-17 23:31:45 602

原创 好用的开源日志库:Easylogger解析与移植STM32

Easylogger是一款轻量级嵌入式日志库,其核心配置位于elog_cfg.h文件中。主要配置包括:日志输出总开关(ELOG_OUTPUT_ENABLE)、静态日志级别(ELOG_OUTPUT_LVL)、断言检查(ELOG_ASSERT_ENABLE)、缓冲区大小(ELOG_LINE_BUF_SIZE)等。高级配置支持彩色输出、异步/缓冲模式、日志格式定制等功能。移植时需配置串口输出,重定义输出接口,并注意日志换行和标签设置。通过灵活配置这些参数,可以在嵌入式系统中实现高效、可定制的日志功能,平衡调试需求

2025-09-16 23:04:07 1023

原创 Easylogger与RTT结合使用 & Easylogger在FreeRTOS下实现异步输出

RTT与EasyLogger是嵌入式开发中常用的两种工具,二者协同工作形成高效日志解决方案。RTT作为SEGGER推出的调试数据传输工具,负责通过J-Link实现目标板与PC间的高效双向通信;EasyLogger则是国产开源的嵌入式日志管理库,专注于日志生成、过滤和格式化。实际应用中,EasyLogger将规范化处理后的日志通过RTT接口传输至PC端,由J-Link RTT Viewer接收显示。二者结合既保证了日志的规范性,又提升了传输效率。

2025-09-16 23:03:58 598

原创 好用的开源日志输出:SEGGER_RTT日志移植与应用指南

摘要:本文介绍了日志系统的基本组成(日志索引、断电日志存储区和主日志存储区)以及SEGGER RTT的移植与使用方法。详细说明了RTT库的下载步骤、文件提取和移植过程,包括初始化、测试用例和封装优化方法。同时提供了RTT虚拟终端的高级用法,如实现分流、改变输出颜色、重定向以及通过修改SEGGER_RTT_vprintf函数实现浮点数输出的解决方案。最后展示了封装后的日志输出效果和配置缓冲区大小的注意事项。

2025-09-15 22:46:05 622

原创 好用的开源日志输出工具:SEGGER_RTT实现机制解析

SEGGER RTT是一种基于内存共享的实时调试技术,通过控制块结构管理数据传输。其核心机制包括:1)使用环形缓冲区和生产-消费者模型实现无锁通信;2)支持多通道配置,可区分上下行数据;3)采用原子操作保证指针更新的线程安全;4)同时支持阻塞和非阻塞模式,满足不同实时性需求。该技术无需专用调试接口,能在保持原有代码结构的同时实现高效调试,适用于嵌入式系统开发。

2025-09-15 22:45:23 702

原创 【C++】深入理解多态与虚函数

本文系统介绍了C++多态的概念与实现。多态是指不同对象调用同一函数产生不同行为,需满足两个条件:虚函数重写(派生类重写基类虚函数)和通过基类指针/引用调用。详细讲解了virtual关键字、虚函数重写规则、协变和析构函数重写等特殊情况,并通过选择题示例说明默认参数继承的特性。此外还介绍了C++11的override和final关键字,用于检查重写和禁止继承。最后区分了重载、重写和重定义,并阐述了抽象类和纯虚函数的作用,强调虚函数继承的是接口而非实现。全文深入浅出地解析了多态机制及其应用场景。

2025-09-14 19:11:13 1046

原创 【C++】揭秘:虚函数与多态的实现原理

本文深入解析了C++多态的实现原理,重点探讨了虚函数表机制。主要内容包括:1)虚函数表的结构与运作原理,说明派生类如何通过虚表实现函数覆盖;2)单继承与多继承下的虚表差异,通过代码示例展示虚表内容;3)动态绑定与静态绑定的区别;4)常见问题解答,如内联函数和静态函数不能为虚函数的原因;5)辨析虚表、虚基表等易混淆概念。文章通过内存布局分析和代码验证,揭示了多态在运行时的动态决议机制。

2025-09-14 19:10:37 878

原创 【C++】继承机制深度解析:多继承与菱形继承

本文解析了C++继承机制中的几个关键问题:1)友元关系不可继承,子类需重新声明友元;2)静态成员在继承体系中保持唯一性;3)菱形继承问题及虚拟继承解决方案,通过虚基表指针解决二义性和数据冗余;4)对比继承(is-a)与组合(has-a)的区别,建议优先使用组合降低耦合度。文章通过代码示例演示了各类继承场景,并指出虚拟继承会带来性能损失,建议避免不必要的菱形继承设计。

2025-09-13 17:54:09 810

原创 【C++】继承机制解析与使用示例

本文介绍了面向对象编程中的继承机制及其核心概念。主要内容包括:1)继承的基本定义和实现方式,通过派生类复用基类特性;2)继承中的访问权限控制,包括public、protected、private三种继承方式;3)基类和派生类对象间的赋值转换规则(切片原则);4)继承体系中的作用域问题,特别是同名成员的隐藏机制;5)派生类默认成员函数的生成规则,重点说明构造函数、拷贝构造、赋值运算符和析构函数的调用顺序及注意事项。

2025-09-13 17:45:17 826

原创 【C++】模板进阶:非类型参数、模板特化与分离编译

本文介绍了C++模板编程中的关键概念:1.非类型模板参数允许使用常量作为模板参数,但仅限于整数等编译期可确定的类型;2.模板特化分为全特化和偏特化,前者完全指定所有参数类型,后者部分指定;3.模板不支持分离编译,解决方案包括将声明和定义放在同一文件或显式实例化。文章通过代码示例展示了静态数组模板的实现、多种特化方式的定义和使用场景,并解释了模板不能分离编译的原因及解决方法。

2025-09-12 23:26:41 298

原创 【C++】list模拟实现全解析

【摘要】本文详细介绍了C++中list容器的实现原理,主要包含以下内容:1)采用带头双向循环链表结构,节点包含前后指针和数据域;2)迭代器设计通过封装节点指针并重载运算符实现遍历功能;3)实现了完整的list类,包括构造/析构函数、元素访问、插入删除等操作;4)通过模板技巧统一处理普通迭代器和const迭代器;5)提供了拷贝构造、赋值运算符等关键函数;6)包含测试用例验证功能正确性。文章重点阐述了链表与迭代器的核心实现机制,以及STL风格容器设计的关键技术点。

2025-09-12 23:21:53 1299

原创 中断上半部与中断下半部

摘要:中断处理分为上半部和下半部以优化实时性。上半部执行紧急操作(如应答硬件、读取关键数据),必须极短且不阻塞中断。下半部处理耗时任务(如数据解析),可在中断启用环境中运行。在Cortex-M RTOS中,下半部可通过定时器回调、守护任务或PendSV实现,减少对中断延迟的影响。核心原则是保持上半部快速执行,通过下半部机制提升系统整体响应性能。

2025-09-11 23:26:37 949

原创 什么是中断延时

摘要:中断延时是指从中断信号触发到CPU响应之间的时间延迟,受中断嵌套、屏蔽状态、向量表加载等因素影响。测量方法通过硬件IO和逻辑分析仪捕捉中断起止时间,发现某次中断处理耗时6ms,可能导致高速串口通信丢包。优化方向包括减少中断屏蔽时间、优化嵌套处理和加速向量表加载。该文分析了中断延时成因、测量方法及优化必要性。

2025-09-11 23:24:18 331

原创 ARM内存映射与启动地址重映射机制解析

ARM Cortex-M内核采用固定内存映射架构,通过地址重映射机制实现启动过程的灵活性。CPU从0x00000000取指时,芯片内部的重映射控制器会根据启动引脚配置,将请求透明地重定向到实际物理地址(如主Flash的0x08000000)。这种设计既保持了CPU执行入口的统一性,又为芯片厂商提供了多种启动模式的选择。重映射过程由硬件自动完成,对程序员透明,仅在底层开发时需要关注。具体实现方式包括地址别名和可编程重映射开关,详细信息需查阅芯片厂商的参考手册。

2025-09-10 22:41:31 1790

原创 ARM处理器总线架构解析:iCode、D-code、S-Bus与总线矩阵

ARM Cortex-M系列处理器采用多总线架构,包含iCode、dCode和S-Bus三条关键总线。iCode总线专用于指令读取,dCode总线负责数据存取,两者并行工作实现哈佛架构的高效性;S-Bus则作为通用系统总线连接外设。通过总线矩阵实现多主多从的并行访问,使处理器能同时执行取指、数据操作和外设访问,显著提升性能。

2025-09-10 22:27:56 727

原创 【C++】list 容器操作

文章摘要:本文介绍了C++中list容器的特性与应用。list作为vector的补充,解决了vector在头部/中部插入删除效率低(O(N))和扩容代价大的问题,具有O(1)时间复杂度的插入删除优势,但牺牲了随机访问能力。文章详细讲解了list的四种迭代器(正向/反向/const/双向)、常用操作(头尾插删、任意位置操作)、排序方法(不推荐使用),以及迭代器失效问题和解决方案。最后通过对比vector和list的迭代器实现原理,解释了list采用节点指针封装实现迭代器自增操作的机制。

2025-09-09 22:06:54 558

原创 C语言面向对象编程:模拟实现封装、继承、多态

本文探讨了在C语言中模拟面向对象编程的三大特性:封装、继承和多态。通过结构体封装数据和函数指针,实现了类的基本结构;利用结构体嵌套模拟继承关系;借助函数指针实现多态行为。具体展示了String和Person类的封装实现、Student类的继承实现,以及Animal/Dog/Cat的多态示例。这种模拟方式虽然需要手动管理类型转换和函数绑定,但能有效提升C语言代码的模块化和扩展性,为理解面向对象底层机制提供了实践参考。

2025-09-09 17:42:29 973

原创 【C++】memcpy导致的深拷贝问题

本文探讨了vector扩容时使用memcpy进行元素拷贝的问题。当vector存储自定义类型(如string)时,memcpy的浅拷贝特性会导致内存布局紊乱,表现为数据乱码或程序崩溃。问题根源在于memcpy仅复制指针值而非实际数据,造成新旧vector指向同一内存区域。解决方案是改用循环赋值,通过调用string的赋值运算符实现深拷贝。文章详细分析了vector的内存布局,解释了循环赋值的有效性,并指出标准库通过类型特质技术区分平凡/非平凡类型来优化拷贝操作。

2025-09-06 19:21:21 1026

原创 【C++】vector 深度剖析及模拟实现

本文深入解析了C++ STL中vector的实现原理。vector使用三个指针成员(_start、_finish、_endofstorage)管理动态数组,分别指向首元素、元素末尾和存储空间末尾。关键实现包括:迭代器访问方法、容量管理(reserve/resize)、元素操作(push_back/insert/erase)、深拷贝的拷贝构造和赋值重载。特别指出memcpy在扩容时可能导致深浅拷贝问题,建议对自定义类型使用更安全的拷贝方式。最后展示了vector的基本使用示例,包括遍历、修改和删除操作。

2025-09-06 19:20:57 950

原创 【OJ】C++ vector类OJ题

C++vector类练习OJ题,涉及位运算

2025-09-05 23:07:25 537

原创 【C++】Vector完全指南:动态数组高效使用

本文详细介绍了C++标准库中的vector容器,它是一种动态数组,支持高效的随机访问和尾部操作。主要内容包括:1)vector的基本特性与优缺点,如动态扩容机制;2)常用操作(构造、拷贝、遍历、插入删除等)及示例代码;3)迭代器类型(正向/反向、const/非const)及其使用场景;4)容量管理(resize/reserve)与扩容策略差异;5)标准算法(如find、sort)的应用;6)迭代器失效问题及其解决方案(如增容和删除操作后的迭代器更新)。

2025-09-05 22:54:44 1195

原创 【OJ】C++ string 类OJ题

本文总结了LeetCode中5道字符串相关算法题的解法:1. 917.反转字母 - 使用双指针交换字母字符,跳过非字母字符。2. 387.第一个唯一字符 - 通过计数数组统计字符频率,再遍历查找首个频率为1的字符。3. 125.验证回文串 - 双指针法,处理大小写和非字母数字字符后比较。4. 415.字符串相加 - 推荐尾插+逆置的高效方法,避免头插导致的O(n²)复杂度。5. 43.字符串相乘 - 分解为单字符相乘再累加,注意处理进位和全零情况。

2025-09-04 00:19:29 292

原创 【C++】深入浅出:string类模拟实现全解析

本文详细介绍了如何实现一个简单的C++ string类,主要内容包括:1. 基本框架实现:构造函数、析构函数、size()、operator[]等基础功能;2. 深拷贝与浅拷贝问题:解释了编译器默认浅拷贝的问题,并实现了深拷贝的拷贝构造函数和赋值运算符;3. 功能扩展:添加了动态扩容、尾插、插入、删除、查找等实用功能;4. 现代写法优化:介绍了利用"拷贝-交换"技巧简化代码的现代写法;5. 完整功能测试:提供了各功能的测试代码。

2025-09-04 00:04:09 1365

原创 【C++】string类完全解析与实战指南

C++ string类详解,介绍了字符串的基本操作与常用接口。string类是basic_string模板类的别名,提供多种构造函数支持空字符串、C字符串、重复字符等初始化方式。文章详细讲解了字符串遍历方法(下标、迭代器、范围for)、容量管理(size/resize/reserve)和修改操作(append/insert/erase)。重点分析了查找子串、比较字符串和URL解析等实用功能,并对比了C风格字符串与string类的差异。

2025-09-03 22:29:03 766

原创 【C++】编写通用模板代码的重要技巧:T()

文章摘要:该代码展示了vector类中resize()方法的实现,重点解析了参数const T& val=T()的设计原理。这一设计通过值初始化(T())为任意类型提供默认值,使用常量引用避免拷贝,并支持调用者自定义值。这种模式保证了代码的通用性(适用于int/string/自定义类等)、效率(引用传参)和类型安全,是STL中处理模板类参数的典型做法。默认参数机制允许在未指定值时自动使用类型对应的"零值"初始化新元素。

2025-09-02 22:50:41 401

原创 【C++】深入解析C++嵌套依赖类型与typename关键字

本文介绍了C++中的嵌套依赖类型(NestedDependentType)及其typename关键字的使用。嵌套依赖类型指依赖于模板参数的嵌套类型,如Container<T>::iterator。由于编译器无法在实例化前确定依赖名称的性质,需要用typename明确指示其为类型。文章详细说明了必须使用typename的多种场景(函数返回/参数类型、成员变量声明等)以及不需要的情况(非依赖类型、基类列表等),并通过代码示例演示了实际应用。理解这些规则有助于正确编写模板代码,避免编译错误。

2025-09-02 22:46:03 610

原创 【C++】函数模板与类模板的使用与机制解析

本文介绍了泛型编程中的模板技术。文章详细讲解了模板的定义格式、实例化过程、匹配原则,并提供了函数模板和类模板的实现示例。

2025-09-01 16:30:17 697

原创 【C++】内存管理机制:从new到delete全解析

C++在保留C语言内存管理方式的基础上,引入了更安全高效的new/delete机制。相比C语言方式,new/delete优势在于:符合面向对象思想(定义即初始化)、代码更简洁、更安全。

2025-09-01 16:00:09 1354

原创 【C++】友元机制详解:突破封装的秘密武器

本文主要介绍友元与内部类的机制与使用,友元机制突破封装限制,允许函数或类访问其他类的私有成员,包括友元函数和友元类。内部类是定义在类内部的独立类,自动成为外部类的友元。

2025-08-31 18:06:08 760

原创 【C++】构造函数初始化详解

本文介绍了C++中构造函数初始化与赋值的区别,重点讲解了初始化列表的使用场景和优势。

2025-08-31 17:32:14 1149

原创 【C++】日期类实现详解:代码解析与复用优化

本文实现了一个完善的日期类(Date),主要功能包括:日期计算(加减天数、递增递减)、日期比较(6种关系运算符)和日期差值计算。设计亮点在于高内聚低耦合,通过运算符复用减少代码冗余。

2025-08-30 23:54:43 763

原创 【C++】C++ const成员函数与取地址操作符重载

本文介绍了C++中const成员函数和取地址操作符重载的关键概念。

2025-08-30 23:33:45 540

原创 【C++】拷贝构造函数:深拷贝与浅拷贝详解

本文介绍了C++中的拷贝构造函数及其特性。拷贝构造函数用于通过已有对象初始化新对象,其参数必须是类类型对象的引用,否则会导致无限递归。编译器会生成默认的拷贝构造函数,对内置类型进行浅拷贝(按字节复制),对自定义类型调用其拷贝构造函数。对于不涉及资源申请的类,默认拷贝构造函数足够使用;但涉及资源管理(如动态内存)时,必须自定义深拷贝的拷贝构造函数,以避免浅拷贝导致的资源重复释放问题。文中通过日期类和栈类的例子,对比了浅拷贝和深拷贝的区别,并说明了深拷贝的实现原理。

2025-08-29 22:18:06 839

原创 【C++】运算符重载深度解析

本文介绍了C++运算符重载的概念和使用方法。主要内容包括: 运算符重载的基本语法和使用场景,通过operator关键字定义特殊函数。 赋值运算符重载的实现要点,包括参数传递、返回引用和自赋值检查。 前置++和后置++的重载区别,后置++通过增加int参数区分。 并以一个完整的日期类为例,展示了各种运算符重载的具体实现,包括比较运算符、算术运算符、自增自减运算符等,并强调了代码复用的重要性。

2025-08-29 22:17:49 340

原创 【C++】析构函数:对象的完美谢幕

析构函数是C++中用于对象资源清理的特殊成员函数,在对象生命周期结束时自动调用。其特点包括:以~加类名命名、无参数无返回值、不可重载,且每个类只能有一个析构函数。若未显式定义,编译器会生成默认析构函数,对内置类型不做处理,但会调用成员自定义类型的析构函数。析构函数在函数栈帧销毁前(作用域结束时)按构造逆序触发,确保资源释放。

2025-08-28 18:03:42 1356

原创 【C++】揭秘构造函数六大特性

C++类的默认成员函数包括6个自动生成的函数(构造函数、析构函数、拷贝构造等)。构造函数是特殊成员函数,与类同名,在对象创建时自动调用,用于初始化而非创建对象。其特性包括:无返回值、可重载、自动调用。若未显式定义构造函数,编译器会生成默认无参构造函数。对于内置类型成员,默认构造函数不初始化其值(C++11允许声明时赋默认值);自定义类型成员则会调用其默认构造函数。注意默认构造函数只能有一个,无参构造和全缺省构造不能同时存在,否则会产生调用歧义。

2025-08-28 18:02:55 317

原创 【C++】类对象内存布局与大小计算

本文介绍了类和结构体的内存计算规则。对于类对象,只计算成员变量所占内存(遵循结构体内存对齐规则),成员函数不占用对象空间;空类对象占用1字节用于占位标识。结构体内存对齐规则包括:首成员从0偏移开始,其他成员按对齐数(成员大小与默认对齐数较小值)整数倍地址存放;结构体总大小为最大对齐数整数倍;嵌套结构体需按其最大对齐数对齐。

2025-08-27 12:59:16 217

空空如也

空空如也

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

TA关注的人

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