- 博客(25)
- 收藏
- 关注
原创 # 超简单四步完成FreeRTOS移植到STM32
本文详细介绍了FreeRTOS移植到STM32的完整流程。首先需准备FreeRTOS源码(推荐v9.0.0),然后解压并了解核心文件夹结构,重点关注Source、include和portable目录。移植步骤包括:搭建工程结构、添加必要文件、配置头文件路径,并处理编译过程中可能出现的常见错误(如缺少FreeRTOSConfig.h、中断服务函数冲突等)。最后通过编译验证,确保移植成功。该指南特别针对STM32F4系列芯片,使用Keil开发环境,推荐使用heap_4.c内存管理方案。
2025-10-14 15:12:54
1087
原创 PID算法
PID控制器是嵌入式系统中实现精确闭环控制的核心算法,其通过比例(P)、积分(I)、微分(D)三个环节协同工作。P环节快速响应当前偏差,I环节消除静态误差,D环节抑制超调。相比开环控制,PID能有效应对负载变化和外界干扰,满足高精度需求。该算法计算量小,适合资源有限的嵌入式设备,且无需精确数学模型,通过参数整定即可实现稳定控制。离散化的增量式PID公式更适用于数字控制器,确保系统安全性和实时性。典型应用包括电机转速、温度等物理量的精确调节。
2025-10-11 19:04:45
817
原创 LINUX系统编程 - 进程和进程间通信
本文介绍了Linux系统中进程的基本概念、创建方式、状态管理以及进程间通信(IPC)机制。进程是运行中的程序实例,通过fork和exec函数创建子进程并加载新程序。僵尸进程需要通过wait/waitpid回收资源以避免资源泄露。IPC机制包括管道、命名管道、消息队列、共享内存、信号量、信号和套接字等,每种方式适用于不同场景:管道适合父子进程通信,共享内存速度最快但需同步,信号用于异步事件通知,而套接字支持网络通信。这些机制为进程协作提供了灵活高效的解决方案。
2025-10-11 11:43:49
1119
原创 LINUX应用编程 - 守护进程
守护进程是在后台长期运行、脱离终端控制的特殊进程,具有24小时不间断运行、不依赖交互式输入输出等特性。其创建步骤包括:通过fork()和setsid()脱离终端控制,切换工作目录到根目录,关闭不必要的文件描述符,重定向标准流到/dev/null。完整代码展示了如何实现一个周期性写入日志的守护进程。典型应用场景包括嵌入式系统、Linux服务器等需要高可用后台服务的领域。
2025-10-11 11:21:58
731
原创 操作系统中的上下文
上下文是执行单元运行状态的关键信息集合,本质包含三类数据:寄存器信息、栈信息和控制信息。不同操作系统中的上下文(如任务、线程、进程)区别仅在于执行单元粒度不同,但功能逻辑完全一致——保存执行单元的"身份+运行快照"。系统切换时通过"保存当前快照→加载目标快照"实现无缝衔接,让CPU感知不到切换过程。这种机制是任务调度的核心基础,保证了多任务系统的正确运行。
2025-09-22 10:45:40
335
原创 FreeRTOS中的阻塞和非阻塞问题
FreeRTOS中阻塞与非阻塞的选用取决于任务特性和系统需求。阻塞适用于可等待场景(如低优先级任务、必然事件、设备响应),能提高CPU利用率;非阻塞则用于高实时性任务(如中断服务、关键控制)、多事件轮询或需要备选方案的情况,确保及时响应。核心原则是:允许等待用阻塞提升效率,要求实时则用非阻塞。两者合理搭配可优化系统性能与响应速度。
2025-09-20 15:17:03
537
原创 FreeRTOS:同步与通信机制
FreeRTOS提供了多种任务同步与通信机制:二进制信号量用于简单事件通知(如中断触发任务处理);队列支持带数据的同步(如传递传感器数据);事件组实现多事件组合等待(逻辑与/或)。任务通知是轻量级替代方案,直接向任务发送32位值。选择机制时需考虑是否需要传递数据、事件复杂度及内存开销。这些机制确保了任务间安全高效的协作。
2025-09-20 14:31:27
691
原创 C/C++中的核心关键字:static extern const virtual volatile等
本文摘要:文章系统梳理了C/C++核心关键字及其特性。C语言部分重点解析了static的多重用途(变量生命周期控制、文件作用域限制)、const的跨语言差异、volatile的硬件交互特性、sizeof与strlen的区别,以及extern的跨文件调用机制。C++特有部分深入探讨了virtual实现的多态原理、new/delete与malloc/free的对象构造差异、this指针的隐式特性,以及template实现的泛型编程范式。通过对比C与C++关键字的异同(如const处理方式),揭示了两种语言在内存
2025-09-20 10:37:50
344
原创 FreeRTOS:任务管理与任务调度机制
本文围绕 FreeRTOS 的任务管理展开,系统梳理了任务的定义、创建方式、状态转换及调度机制四大核心模块,为嵌入式实时系统开发提供关键技术参考。
2025-09-08 19:22:16
373
原创 epoll非阻塞+边沿触发实现超简单Socket服务器和客户端
本文介绍了基于epoll边沿触发(ET)模式的非阻塞Socket服务器实现。核心要点包括:1)使用非阻塞Socket配合ET模式,需循环读写直到EAGAIN;2)epoll监控监听Socket和客户端Socket两类事件;3)服务器完整流程包括创建监听Socket、设置非阻塞、绑定端口、epoll监控、事件处理循环。文中提供了详细的服务器和客户端代码实现,展示了如何通过accept循环处理新连接、read循环处理客户端数据。该方案能高效处理大量并发连接,适合高性能网络服务开发。
2025-09-08 18:08:14
435
原创 Linux应用编程:IO多路复用
IO多路复用是Linux中高效处理多IO事件的技术,允许一个进程同时监控多个文件描述符。相比传统阻塞IO需要多线程处理,它能显著提升效率。文章介绍了三种实现方式:1)select通过文件描述符集监控IO,但存在数量限制;2)poll使用结构体数组解决了数量限制;3)epoll采用事件驱动机制,仅返回就绪的fd,效率最高但仅支持Linux。三者各有特点,应根据fd数量、效率需求和系统兼容性选择。对于高并发场景,epoll是最佳选择。
2025-09-08 17:59:00
394
原创 Linux:socket网络编程TCP/UDP
本文介绍了Socket网络编程的核心概念和实现方法。主要内容包括:1)Socket基础概念,区分TCP(可靠传输)和UDP(高效传输)的特点;2)TCP三次握手和四次挥手的过程;3)关键函数如socket()、bind()、listen()等的作用;4)完整的TCP和UDP通信代码实例,包含服务器和客户端的实现步骤。通过示例代码展示了如何建立连接、收发数据及关闭Socket等关键操作。文章为网络编程初学者提供了清晰的实践指导。
2025-09-08 17:58:56
538
原创 STM32:串口通信(UART/USART)
摘要: STM32的串口通信(UART/USART)是嵌入式开发中常用的异步全双工通信方式,仅需TX/RX两根线。通信方式可分为同步/异步、全双工/半双工/单工、串行/并行三种维度。UART为异步通信,USART支持同步/异步模式。关键参数包括波特率、起始位、数据位、停止位和校验位,主从设备需保持一致。文中提供了USART6的初始化代码示例,配置了GPIO引脚、通信参数(115200波特率、8位数据位、无校验位)并启用了接收中断。该代码实现了STM32的串口通信基础配置。
2025-09-05 17:10:41
689
原创 STM32:SPI
本文介绍了STM32F4的SPI通信协议及其应用。SPI是一种高速全双工同步串行通信协议,通过SCLK、MOSI、MISO和NSS四线实现主从设备通信。文章详细说明了SPI的时钟极性和相位配置,以及四种工作模式差异。通过74HC595芯片驱动数码管的实例,展示了SPI接口的初始化、数据发送等编程实现。最后对比了SPI与I2C在引脚数量、通信方式、传输速率和应用场景等方面的主要区别,SPI适用于高速大数据传输,而I2C更适合低速多设备通信。
2025-09-05 13:44:10
428
原创 STM32:IIC
本文系统介绍了IIC总线通信原理及STM32驱动实现。IIC总线采用两根信号线(SCL、SDA)实现同步半双工通信,通过起始/停止信号控制数据传输,支持多主多从设备。文章详细解析了IIC协议层核心信号、数据传输规则及主从设备读写流程。实践部分展示了基于STM32F4的软件模拟IIC驱动实现,包括GPIO初始化、信号时序控制和数据收发函数,并应用于SHT20温湿度传感器驱动,适配FreeRTOS系统完成数据采集。代码实现了完整的IIC通信协议,为嵌入式开发提供了实用参考。
2025-09-05 13:11:38
999
原创 C++:内存管理
C++内存管理摘要:C++支持手动(new/delete)和自动(智能指针)两种内存管理方式。内存分为栈、堆、全局/静态区、常量区和代码区五个区域。手动管理需注意内存泄漏、野指针等问题,建议使用C++11引入的智能指针:unique_ptr(独占所有权)、shared_ptr(引用计数)和weak_ptr(解决循环引用)。常见内存问题包括泄漏、野指针和双重释放,可通过智能指针、指针置空和严格匹配new/delete来避免。智能指针能自动释放内存,是更安全的现代C++实践。
2025-09-04 21:49:29
631
原创 C++:封装
摘要:封装是面向对象编程的核心特性,通过访问控制符(private/public/protected)实现数据隐藏和接口暴露。示例代码展示了Student类的封装实现:私有成员变量(name/age/score)通过公共方法(get/set)进行安全访问,在设置方法中加入数据校验逻辑(如年龄0-150、成绩0-100)。这种设计保证了数据安全,防止非法操作,同时通过公共接口提供可控的访问方式。输出结果验证了封装的数据保护机制,当输入异常值时自动修正为默认值。
2025-09-04 20:49:26
222
原创 C++:STL(容器、迭代器、算法)
摘要:STL(标准模板库)是C++的核心组件,通过泛型编程实现了高效的数据处理。主要包括:1)容器(序列式如vector/list/deque,关联式如map/set),提供不同数据存储结构;2)算法(如排序、查找),通过迭代器操作容器元素;3)迭代器,作为容器与算法的桥梁。STL通过模板实现代码复用,显著提升开发效率,但需注意迭代器失效等问题。
2025-09-04 20:22:34
445
原创 C++:泛型与模版
本文介绍了泛型和模板编程的核心概念。泛型是一种与具体类型无关的编程范式,通过模板在C++中实现。模板分为函数模板(如通用加法函数)和类模板(如通用Pair类),编译器会根据类型参数自动生成具体代码。模板相比宏更安全(有类型检查),比重载更简洁(自动生成版本)。标准模板库(STL)是泛型编程的典范,其容器、算法和迭代器都基于模板实现。模板编程能提高代码复用性,使同一套逻辑适用于多种数据类型。
2025-09-03 11:11:06
406
原创 C语言:内存管理
C语言内存管理核心要点:程序运行时内存分为代码区、常量区、全局/静态区、堆和栈5个区域,各有不同的生命周期和特性。动态内存管理主要通过malloc/calloc分配堆内存、realloc扩容、free释放。常见陷阱包括:内存泄漏(未释放分配的内存)、野指针(操作已释放内存)、内存越界、重复释放、释放非堆内存和使用未初始化内存。规避方法包括:遵循"谁分配谁释放"原则、释放后置空指针、严格检查索引范围等。良好的内存管理习惯对程序稳定性至关重要。
2025-09-02 20:24:33
754
原创 C++:多态
C++多态是面向对象编程的核心特性,主要分为静态多态和动态多态。静态多态通过函数重载、运算符重载和模板在编译时确定调用,包括参数类型匹配和模板特化。动态多态通过虚函数、继承和重写实现运行时绑定,依赖虚函数表机制,允许基类指针或引用调用派生类实现。纯虚函数和抽象类用于定义接口规范,强制派生类实现特定方法。静态多态效率高但灵活性较低,动态多态更灵活但有一定性能开销,开发者需根据场景选择合适方式。
2025-09-02 19:48:32
262
原创 数据结构:二叉树
摘要:本文介绍了二叉树和二叉搜索树(BST)的基本概念及C语言实现。二叉搜索树的特点是左子树节点值小于根节点,右子树节点值大于根节点。文章详细展示了节点结构定义、创建新节点、插入节点、三种遍历方式(前序、中序、后序)、查找节点、删除节点(处理叶子节点、单孩子节点和双孩子节点三种情况)以及销毁树等核心操作的代码实现。通过示例演示了如何构建BST并进行基本操作,为理解树形数据结构的实现原理提供了实用参考。
2025-09-02 19:14:31
130
原创 数据结构:双链表
双链表是一种由数据域、前驱指针和后继指针组成的线性数据结构。本文介绍了带头结点的双链表实现方案,包含初始化、节点创建、插入(头插/尾插)、遍历(正向/反向)、删除、查找(按值/索引)、修改(按值/索引)以及销毁等核心操作。通过结构体定义管理链表头结点和长度信息,所有操作都基于指针操作实现节点间的双向链接,确保空链表和非空链表的统一处理逻辑。重点展示了双链表特有的双向遍历特性,以及内存管理的注意事项,包括创建时分配和销毁时的顺序释放。
2025-09-02 11:32:12
174
原创 C++:运算符重载
运算符重载的必要性与实现规则 运算符重载允许自定义类型使用内置运算符(如+、<<、[]等),使其操作更直观。重载本质是函数重载,可重载常用运算符(算术、赋值、I/O等),但禁止重载.、::、sizeof等五种运算符。实现方式上,单目运算符通常作为成员函数,双目运算符作为友元函数,其中=、[]、()等必须为成员函数,<<、>>必须为友元函数。重载时需保持运算符原有语义,典型应用包括加减运算、I/O操作、自增/减、仿函数等,通过重载使类对象操作更自然高效。
2025-09-01 20:51:36
307
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅