自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 STM32中断详解

中断是单片机正在执行程序时,由于内部或外部事件的触发,打断当前程序,转而去处理这一事件,当处理完成后再回到原来被打断的地方继续执行原程序的过程。在ARM体系结构中,中断通常由外设或外部输入产生,有时也可以由软件触发。中断是单片机系统处理紧急或突发事件的重要方式,如定时器溢出、按键输入、串口数据到达等。

2025-09-07 18:17:51 937

原创 GPIO介绍

GPIO是通用输入输出端口()的英文简写,是所有的微控制器必不可少的外设之一,可以由STM32直接驱动从而实现与外部设备通信、控制以及采集和捕获的功能。GPIO口可配置为多种输入输出模式,如输入浮空、输入上拉、输入下拉、模拟输入、开漏输出、开漏复用功能、推挽式输出以及推挽式复用功能等。STM32单片机的GPIO被分为很多组,每组最多有16个引脚,不同型号的MCU的GPIO个数是不同的。引脚电平:0V~3.3V,部分引脚可容忍5V。

2025-09-06 21:39:25 1182

原创 STM32的时钟系统与时钟树的配置

STM32的时钟系统是其微控制器(MCU)的核心组成部分,负责为CPU、外设和存储器等模块提供精确的时序信号。其设计灵活且复杂,通过多级时钟树(Clock Tree)实现时钟源的选择、分频和分配。

2025-09-03 17:12:25 833

原创 从map文件分析优化代码

描述了各符号(程序段、数据)在存储器中的地址、类型、大小等信息,对于理解程序的内存布局以及定位特定代码或数据段非常有用。)占用空间的汇总信息,包括代码、只读数据、已初始化读写数据、未初始化读写数据等的大小,有助于了解程序的总体内存使用情况。:如果这里拆掉了你“以为要用”的函数,八成是你代码里没真正调用到,或者条件编译把它关掉了。,直接搜表就能知道是哪个函数。描述了各程序段(函数)在存储器中的地址及占用大小,有助于分析程序的内存占用情况。:告诉你“哪栋楼(函数)引用了哪条街(变量/函数)”。

2025-09-02 19:03:28 617

原创 详解STM32的完整启动流程

STM32会先去“自家宅基地”的开头(0x0800 0000)读一个4字节的数,这个数就是“脚手架的顶端地址”,然后把这个地址存到SP寄存器里。STM32再去0x0800 0004(紧挨着刚才那个地址)读一个4字节的数,这个数就是“复位向量”,也就是“真正开始干活的入口地址”。**SP(Stack Pointer)**就像工地上的“脚手架”,程序运行时临时放东西(比如函数参数、局部变量)的地方。如果BOOT0=0,无论BOOT1是什么,都从“自家宅基地”(主Flash)启动,这是最常见的。

2025-09-02 17:20:32 1126

原创 详解STM32寄存器映射

通过读写这些外设寄存器,开发人员可以设置外设的工作模式、读取外设的状态信息,从而实现对外部设备的控制和数据交互。通过GPIO_TypeDef结构体定义了GPIOB口,结构体中包含了GPIO的通用寄存器,为了简化寄存器的数量,将同一类型的外设设置通用的寄存器,并以结构体的形式进行定义,方便操作与管理。从代码中可以看出,源码中定义的GPIOB也是将其映射到了内存中,通过PERIPH_BASE总线基地址+偏移量得到APB2的基地址,在APB2的基地址+偏移量得到GPIOB的基地址。寄存器相对于外设基地址偏移量。

2025-09-02 12:54:57 938

原创 存储器映像

Flash 存储器区域位置:通常位于地址空间的起始部分(如图中的附近开始)。作用:用于存储程序代码、常量数据以及一些需要长期保存的配置信息。Flash存储器是非易失性的,掉电后数据不会丢失。特点:在STM32中,Flash存储器被划分为多个扇区,不同的扇区大小可能不同。程序在运行时,CPU从Flash存储器中读取指令进行执行。例如,启动代码、用户应用程序等都存储在Flash中。SRAM 区域位置:一般紧跟在Flash存储器之后(图中的附近开始)。作用:用于存储程序运行时的变量、堆栈数据等。

2025-09-02 10:58:31 590

原创 STM32F1系列微控制器系统架构

这张图是STM32F1系列微控制器的系统架构图,展示了芯片内部各个模块及其相互连接关系。

2025-09-02 10:28:25 1019

原创 STM32最小系统

组成,为单片机提供时钟信号、复位信号以及外设接口等必要功能。)运行所必需的最少的硬件电路集成在一起的系统。等等模块,不固定根据系统需求进行配置。单片机最小系统是指能够将单片机芯片(它是一种基本的单片机应用系统,通常由。

2025-09-01 16:35:03 383

原创 Linux 的 TCP 网络编程常用API

在 Linux 的 TCP 网络编程中,常用的 API 主要涉及套接字(Socket)的创建、绑定、监听、连接、数据传输和关闭等操作。

2025-08-24 12:42:57 593

原创 SQLite编程中遇见报错error while loading shared libraries: libsqlite3.so: cannot open shared object file: No

这个错误信息表示在运行可执行文件a.out时,系统无法找到所需的共享库文件。

2025-08-16 14:33:42 526

原创 到底什么是交叉编译?

朋友收到后,只需要用他家的微波炉加热一下(设置可执行权限)就可以吃了(运行程序)。方法一(推荐):从嵌入式 SoC 厂商(如 NXP, TI, ST)、开发板厂商(如 Raspberry Pi)或第三方工具链提供商(如 Linaro)下载预编译好的工具链包,解压并设置环境变量。你坐飞机去朋友家(目标设备),在他家狭小的厨房(资源有限)里,用他那里不熟悉的厨具(可能缺少工具或工具不好用)慢慢做饭。想象你是一位厨师(开发者),要给远在另一个国家的朋友(嵌入式设备)做一顿地道的中餐(可执行程序)。

2025-08-16 11:43:11 673

原创 字节序详解

无论你的程序编译运行在什么字节序的机器上,只要你正确使用了这些转换函数,发送到网络上的数据一定是大端序(网络字节序),从网络收到的数据也一定能正确转换为主机字节序。网络协议栈(如TCP/IP)定义了数据包中各个字段的格式和含义,这些字段很多都是多字节整数(如端口号、IP地址、数据包长度、序列号、校验和等)。中,如果定义了自定义的、包含多字节整数(长度字段、状态码、自定义ID等)的消息结构体,并且该协议需要跨不同字节序的主机工作,(源端口、目的端口、总长度、校验和、序列号、确认号、源IP、目的IP等)。

2025-07-29 21:31:07 1286

原创 Linux网络编程——IP地址与端口、通信协议、Socket套接字基础概念解析

IP地址找到网络上的设备端口号找到设备上的应用程序。需要可靠、有序、不怕慢一点-> 选TCP(如文件传输、网页浏览)。需要极速、低延迟、能容忍偶尔丢失-> 选UDP(如视频通话、在线游戏)。在 TCP 或 UDP 之上,定义具体应用的数据格式和交互规则。HTTP是构建在 TCP 上最著名的请求-响应协议,用于 Web。Socket (套接字)是应用程序进行网络编程的统一 API。通过创建类型 Socket 使用 TCP,创建SOCK_DGRAM类型 Socket 使用 UDP。

2025-07-29 19:36:17 641

原创 网络通信协议详解:TCP协议 vs HTTP协议

是两个核心协议,但它们的职责和层级完全不同。TCP是底层传输协议,负责数据的可靠传输;HTTP是应用层协议,定义了如何交换网页内容。下面通过对比和案例详细讲解它们的区别与联系。

2025-07-26 14:20:08 1634

原创 BS架构/CS架构详解(含案例)

通过浏览器访问服务器应用,无需安装客户端,依赖Web技术(HTML/CSS/JavaScript)。:网页版邮箱(Gmail)、在线文档(Google Docs)、电商网站(淘宝)、天气查询网站。:微信、QQ、Steam游戏平台、Photoshop、银行ATM机系统。:客户端和服务器通过专用网络协议通信,客户端需单独开发并安装。下面通过生活化案例和对比,帮助理解两者的差异。是两种主流设计模式。

2025-07-26 14:13:09 1364

原创 Qt 数据QByteArray与QString处理与转换全指南

的类,支持多语言文本处理(如中文、日文等)。它内部使用 UTF-16 编码,提供了丰富的字符串操作方法。,但提供了更多便捷的方法和 Qt 的内存管理优化。(如字节数组)的类。它类似于 C++ 的。是 Qt 中用于存储。是 Qt 中用于存储。

2025-07-23 14:16:16 1662

原创 QT记事本项目——使用事件过滤器实现Ctrl+滚轮字体缩放功能

Qt的事件系统是GUI应用程序的核心机制,所有用户交互(鼠标点击、键盘输入、窗口重绘等)都是通过事件来处理的。原理:所有发送到textEdit的事件会先经过Widget的。:让当前Widget对象监听textEdit的事件。:无需创建新类,直接在现有架构中添加功能。不能直接检测"Ctrl+滚轮"组合事件。:获取垂直滚动量(正值上滚,负值下滚)是滚轮事件且Ctrl按下 → 处理缩放。:需要创建新类,破坏原有代码结构。:事件继续传递给目标对象。:事件已处理,不再传递。:监听其他对象的事件。

2025-07-17 14:32:16 481

原创 QT——事件系统详解

QT的事件系统是QT应用程序处理用户交互和系统通知的核心机制。当用户操作或系统事件发生时,QT会创建相应的事件对象,并将其发送到接收事件的窗口部件。

2025-07-16 16:24:02 673

原创 QT——QList的详细讲解

是 Qt 中最常用的容器之一,适合大多数动态数组场景。如果需要更高的随机访问性能,可以考虑。,用于存储和管理一组元素。它类似于 C++ 标准库中的。,但针对 Qt 的使用场景进行了优化,特别是在。如果需要频繁中间插入/删除,可以考虑。是 Qt 框架中一个常用的。

2025-07-15 22:14:47 716

原创 C++——模版(函数模版和类模版)

模板是 C++ 中一种强大的泛型编程机制,允许开发者编写与类型无关的代码,从而提高代码的复用性和灵活性。通过模板,可以避免为不同数据类型重复编写相似的函数或类,实现真正的代码复用。

2025-07-15 20:12:03 444

原创 QT——QComboBox组合框控件

QComboBox是Qt框架中提供的组合框控件,它结合了按钮和下拉列表的功能,允许用户从预定义的选项列表中选择一个或多个项目。

2025-07-15 14:33:48 791

原创 QT——文件选择对话框 QFileDialog

QFileDialog是Qt框架中提供的文件对话框类,用于让用户选择文件或目录。它提供了标准的文件选择界面,支持文件打开、保存、多选等常见操作。

2025-07-15 11:13:13 883

原创 QT——文件操作类 QFile和QTextStream

QFile是Qt框架中用于文件I/O操作的类,继承自QIODevice,提供了文件读写的基本功能。QTextStream提供了方便的文本读写功能,可以处理不同编码的文本文件。:可以获取文件大小、修改日期等信息。:支持文本和二进制文件的读写操作。:支持重命名、移动、删除等操作。:提供错误检测和处理机制。

2025-07-14 20:48:23 660

原创 QT——信号与槽/自定义信号与槽

适用于大多数情况,但缺乏类型安全。Lambda表达式:适合简单逻辑,代码简洁但可能影响可读性。函数指针:类型安全,适合需要编译时检查的场景。自动连接:简化UI与逻辑的连接,适合快速开发但灵活性较低。根据具体需求选择合适的连接方式,可以显著提高开发效率和代码质量。//在构造函数中进行信号与槽的绑定//第二种方式:QObject::connect(sender, SIGNAL(signal()), receiver,

2025-07-14 20:11:35 917

原创 QT——信号与槽的两种界面实现方式

在Qt框架中,是对象间通信的核心机制,用于实现事件驱动的编程模型。它通过解耦信号发射者和接收者,提供了类型安全、灵活且可维护的跨组件通信方式。

2025-07-14 11:41:26 448

原创 C++——多态

多态是C++面向对象编程的核心特性,它通过虚函数和继承实现“一个接口,多种实现”的灵活机制。合理使用多态可以提高代码的复用性、扩展性和可维护性,是编写高质量C++程序的关键。核心概念virtual关键字实现动态绑定。= 0强制派生类实现,形成抽象类。虚函数表:底层机制,支持运行时多态。应用场景:框架设计、插件系统、图形界面等需要灵活扩展的场景。

2025-07-13 15:12:20 952

原创 C++——多重继承/虚继承/菱形继承

多重继承是C++中一种强大但复杂的特性,它允许类从多个基类继承属性和方法。然而,多重继承也带来了二义性和菱形继承等问题,需要通过作用域解析运算符、重写成员函数或虚继承来解决。

2025-07-12 16:11:04 1164

原创 C++——继承及权限/基类构造函数/虚函数

当创建派生类的对象时,基类的构造函数总是在派生类的构造函数之前被调用。这个表格提供了一个快速参考,帮助理解在不同类型的继承中基类成员的访问级别是如何变化的。当 Roadsetr类的对象被创建时,首先调用 Base 类的构造函数,然后调用 Roadsetr类的构造函数。关键字有助于清晰地表达程序员的意图,并利用编译器检查来避免常见的错误,如签名不匹配导致的非预期的函数重写。中,派生类可以通过其构造函数的初始化列表来调用基类的构造函数。:当通过基类的指针或引用调用一个虚函数时,调用的是对象实际类型的函数版本。

2025-07-12 14:52:55 945

原创 C++——静态数据成员和静态成员函数

计数器:统计创建了多少个对象public:常量定义:全类通用的常量值public:工具方法:与对象无关的功能public:单例模式:确保只有一个实例public:if (!

2025-07-12 10:57:40 479

原创 C++——拷贝构造函数详析

在所有这些情况下,如果类包含资源管理(例如,动态内存分配),那么正确地实现拷贝构造函数是非常重要的,以确保资源的正确复制和管理,防止潜在的内存泄漏或其他问题。这样做的目的是防止类的对象被拷贝,从而避免可能导致的问题,如资源重复释放、无意义的资源复制等。引入了移动语义,允许资源(如动态分配的内存)的所有权从一个对象转移到另一个对象,这避免了不必要的拷贝。通过这些方法,你可以确保你的类的对象不会被意外地拷贝,从而避免可能出现的资源管理相关的错误。中的一种特殊的构造函数,用于创建一个新对象作为现有对象的副本。

2025-07-11 22:52:02 1377

原创 C++——析构函数

析构函数特别重要,尤其是在涉及动态分配的资源(如内存、文件句柄、网络连接等)的情。智能指针和其他自动资源管理技术时,可以减少显式编写析构函数的需要,但了解析构函数的工作原理。中的一个特殊的成员函数,它在对象生命周期结束时被自动调用,用于执行对象销毁前的。:当对象的生命周期结束时(例如,一个局部对象的作用域结束,或者使用。编程实践中,确保资源在对象析构时被适当释放是非常关键的。删除 一个动态分配的对象),析构函数会被自动调用。的析构函数被自动调用,负责清理资源,防止内存泄露。期结束时(即离开了它的作用域),

2025-07-11 20:14:14 233

原创 C++——this关键字和new关键字

thisnew特性this关键字new运算符作用指向当前对象动态分配内存返回值当前对象的指针新分配内存的指针使用场景成员函数中访问当前对象需要运行时决定内存分配时内存位置不适用(是指针)堆(heap)生命周期不适用直到显式delete或程序结束错误风险误用可能导致逻辑错误忘记释放导致内存泄漏。

2025-07-11 17:28:49 823

原创 C++——构造函数

初始化对象成员变量分配资源(如内存、文件句柄等)执行必要的设置操作。

2025-07-11 13:13:12 578

原创 C++——函数重载与运算符重载

函数,只要它们的参数列表不同(参数类型、参数个数或参数顺序不同)即可。编译器会根据调用时提供的参数自动选择最匹配的函数版本。编译器会将函数名与参数类型信息组合成一个唯一的内部名称,使得不同版本的重载函数在编译后具有不同的名称。运算符重载允许为类或结构体类型重新定义C++内置运算符的行为,使它们能够用于用户定义的类型。函数重载是指在同一作用域内,可以定义多个同名。

2025-07-10 12:36:02 721

原创 C++——引用

引用是已存在对象的别名,通过int x = 10;// ref是x的引用引用关键特性必须初始化:引用在声明时必须初始化不可重新绑定:一旦绑定到某个对象,就不能再绑定到其他对象无空引用:引用必须指向有效对象(与指针不同)自动解引用:使用引用时不需要特殊语法,就像使用原变量一样。

2025-07-10 10:51:38 339

原创 C++——从结构体到类与对象

C++ 的面向对象编程(OOP)核心是和。类是用户自定义的数据类型,用于封装数据(属性)和操作数据的方法(行为);对象则是类的实例。本文将从引入,逐步深入讲解 C++ 的类和对象,结合代码和详细说明。在 C 语言中,结构体(struct数据完全公开,无法控制访问权限操作数据的行为(函数)与数据本身分离(结构体仅包含数据,操作需额外函数实现)缺乏数据保护机制,容易导致非法修改C++ 保留了struct,但允许在结构体内定义函数(方法),并支持访问控制(publicprivatestructpublic。

2025-07-09 13:10:10 839

原创 C++——内联函数与Lambda表达式

捕获方式语法描述值捕获[x]创建x的副本,lambda内不能修改原变量引用捕获[&x]通过引用捕获x,lambda内修改会影响原变量隐式值捕获[=]所有外部变量都通过值捕获隐式引用捕获[&]所有外部变量都通过引用捕获混合捕获[=, &x]除x外所有变量值捕获,x引用捕获隐式混合捕获[&, x]除x外所有变量引用捕获,x值捕获this指针捕获[this]捕获当前类的this指针,可以访问成员变量和函数初始化捕获(C++14)[x = expr]用expr初始化x(可以是移动捕获)

2025-07-08 18:52:39 1027

原创 C++——数据类型与输入输出

C++的标准输入输出系统是基于流(stream)的概念构建的,提供了类型安全、可扩展的I/O操作方式。与C语言的相比,C++的I/O系统通过运算符重载和面向对象的方式,提供了更灵活、更安全的输入输出机制。C++预定义了四个标准流对象,都定义在std对象类型对应C标准流缓冲情况典型用途cinistreamstdin有缓冲标准输入coutostreamstdout有缓冲标准输出cerrostreamstderr无缓冲错误输出(立即显示)clogostreamstderr。

2025-07-08 16:13:03 829

原创 C++——命名空间

命名空间(Namespace)是C++提供的一种机制,用于将全局作用域划分为不同的命名区域,解决名称冲突问题。它是C++对C语言中全局命名空间污染问题的解决方案。int value;

2025-07-08 15:14:43 419

Linux环境下基于Ncurses开发简易贪吃蛇小游戏

一款基于多线程和 ncurses 库实现的贪吃蛇小游戏,具有链表实现的贪吃蛇身子和流畅的键盘控制功能! 这款贪吃蛇游戏不仅简单易懂,适合初学者学习,还能够帮助你深入理解多线程编程和链表数据结构的实际应用。通过这款游戏,你将掌握如何在 C 语言中运用 ncurses 库获取用户键盘输入,实现实时的游戏控制和绘制,同时利用多线程实现控制贪吃蛇的移动和自动游动。 游戏特点: 链表实现贪吃蛇的身子:游戏中的贪吃蛇使用链表结构进行表示,蛇头、蛇身、蛇尾都由节点组成,实现了链表的动态增长和删除操作,让你掌握链表的基本应用。 流畅的键盘控制:通过基于 ncurses 库的键盘输入控制,你可以轻松掌握上下左右四个方向的控制,实时改变贪吃蛇的方向,避免碰到墙壁和自身。 多线程实现自动游动与控制:本游戏使用多线程技术,分开控制贪吃蛇的自动移动和用户输入响应,确保游戏操作的流畅性与并发性,完全体现了多线程的优势和应用。 基础知识、简单易上手:游戏实现使用了基础的 C 语言知识和标准库,让你能轻松上手。特别适合刚开始学习 C 语言和多线程编程的开发者。

2025-05-10

机器视觉-双目测量、极线表示、基本矩阵求解代码

本资源为机器视觉领域中的双目测量技术,提供了相应的代码实现和实验报告。双目测量是计算机视觉中的一种重要技术,通过模拟人眼双目视觉系统,利用两个相机从不同角度拍摄同一场景,通过计算两个相机图像中的对应点来获取物体的三维信息。 对于双目相机系统,一个相机图像中的任意一点在另一个相机图像中的对应点必定位于一条直线上,这条直线被称为极线。 资源提供了实验报告包括求解基本矩阵的方法以及具体的求解步骤。同时,资源还提供了相应的代码实现进行基本矩阵的求解。

2024-07-12

机器视觉-传统相机标定法、线性求解P矩阵代码

本资源聚焦传统相机标定法及其核心步骤之一的线性求解P矩阵(投影矩阵)的Matlab代码实现和一份实验报告。相机标定是计算机视觉中一项基础而重要的任务,旨在通过特定方法确定相机的内部参数和外部参数,以实现图像坐标与世界坐标之间的精确映射。 报告中详细介绍了传统相机标定法的原理。此外,特别强调了线性求解P矩阵的方法,如直接线性变换(DLT)算法,这是一种基于线性代数原理的求解方法,能够直接通过多组对应点计算得到相机的投影矩阵。 在代码实现部分,资源提供了MATLAB编程语言的示例代码,展示了如何应用DLT算法或相关库函数求解P矩阵。这些代码不仅包含了基本的矩阵运算和算法实现。

2024-07-12

工程伦理分析PPT-大众汽车排放门事件

本PPT资源深入剖析了大众汽车排放门事件的工程伦理层面,全面展示了该事件从曝光到后续处理的整个过程,以及它对企业、行业、社会乃至全球汽车排放标准的深远影响。 PPT开篇即概述了大众汽车排放门事件的背景,指出大众汽车在部分柴油车型上安装了作弊软件,以在排放测试中达到合规标准,但在实际行驶中却大量排放污染物。这一行为严重违反了环保法规,也违背了企业的社会责任和工程伦理原则。 随后,PPT详细分析了事件的技术原理,即如何通过软件算法识别车辆是否处于检测状态,并据此调整发动机运行模式以降低排放。这一技术虽然短期内帮助大众通过了排放测试,但从长远看,却严重损害了公众健康和环境利益。

2024-07-12

空空如也

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

TA关注的人

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