自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 STM32C8T6---解析bin文件

第二个是复位中断,也就是说我们把程序写进flash中,他得执行这个复位中断之后才能给你执行你的系统初始化啥的然后进入你的main方法中,然后这个复位中断的地址是写入flash地址+4,因为他这个是四字节对齐,你用bootloader给单片机发送一个程序,他不是跳转到你发送程序的起始地址执行,他是要在这个地址上+4到复位中断去执行,然后后面程序开始正常运行。第一个是我们编译出来的这个bin文件最开始的00地址到第四个字节的地址,它里面的内容就是RAM内存起始地址。在map文件最底部我们可以看到。

2026-02-13 15:36:07 234

原创 嵌入式常见屏幕

本文详细介绍了常见的显示技术(LCD、OLED、E-Ink等)与通信接口(SPI、I2C、并行等)的区别与联系。重点分析了各类显示屏的技术特点、应用场景及典型引脚功能,包括SPI接口TFT/OLED屏、I2C接口OLED屏和并行接口TFT屏的具体接线方式。最后提供了选型建议和Arduino驱动SPI屏的示例代码,帮助开发者快速实现屏幕控制。全文150字,涵盖了显示技术分类、接口特点及实际应用等内容。

2026-02-11 23:36:39 919

原创 回顾ESP32S3系列---音频开发

PCM:数字音频的 “标准格式”,所有处理都基于它。PDM:微型设备的 “简化编码”,输出密度数据,需转 PCM 才能用。I2S:PCM 数据的 “传输总线”,负责芯片间的音频同步传输。

2026-02-11 22:45:33 1192

原创 回顾ESP32S3系列---WIFI/AP配网/OTA

本文介绍了设备端OTA功能的基本框架与实现机制。核心要点包括:1)必须通过bootloader实现程序加载和分区切换;2)需要至少两个OTA分区进行交替更新;3)详细解析了ESP-IDF定义的6种OTA镜像状态及其转换逻辑;4)对比了无回滚功能的极简OTA流程与带回滚机制的安全OTA流程;5)重点阐述了bootloader如何根据分区状态决定启动策略,以及APP如何通过状态标记实现升级验证和异常回滚。完整的OTA流程通过状态机管理确保了升级失败时的自动回退能力,是保障设备可靠性的关键设计。

2026-02-08 21:53:52 793

原创 回顾ESP32S3系列---IIC驱动

SCL用于主机传输时钟信号,SDA用于主机和从机之间传输数据,由此可见IIC是一主多从架构,所有设备的SDA和SCL都是分别接在一起的,每个设备都有个7位的地址,用于和其他从设备进行区分,在空闲时刻SDA和SCL都是高电平表示线路上没有通信,通信都是由主机发起的。

2026-02-02 19:55:45 787

原创 回顾ESP32S3系列---点亮led灯

本文介绍了ESP32-S3使用LEDC模块实现PWM控制LED的方法。PWM周期由定时器决定,占空比通过通道调制。代码展示了两种LED控制模式:1)基本闪烁模式,通过GPIO直接控制LED开关;2)呼吸灯效果,使用LEDC模块配置定时器(5KHz频率,12位分辨率)和通道,通过动态调整占空比实现亮度渐变。初始化包括定时器配置、通道设置和硬件PWM启用,主循环中使用ledc_fade函数实现平滑的亮度变化效果。

2026-02-02 15:11:31 228

原创 回顾ESP32S3系列---基础篇(Bootloader)

整个流程是 **“单向递进、层层接管”的关系,前一个阶段完成后才会跳转到下一个阶段,且只有 Flash 二级引导和应用程序阶段可配置 / 修改 **,ROM 一级引导是芯片出厂固化的,不可改动。上电/复位 → 【ROM一级引导】(固化不可改,PRO CPU独跑)→ 加载【Flash二级引导】(可配置,IDF源码可改)→ 加载【应用程序】(用户开发核心)→ 启动FreeRTOS → 执行app_main核心特点:ESP32-S3 是双核芯片,全程由 PRO CPU(CPU0)主导启动。

2026-02-01 23:36:14 1587

原创 OpenMV小车追踪小球之浅谈PID

本文介绍了离散化PID控制器的工程实现及其在小车追踪场景中的应用。核心内容包括:1. 离散PID公式基础,包括比例、积分、微分项的计算方法;2. 工程优化方案:积分限幅防止饱和、微分低通滤波消除噪声;3. 异常处理机制:时间差异常检测和积分重置;4. 完整的类实现,包括参数初始化、核心计算方法和辅助函数;5. 小车追踪场景的具体应用说明和参数调节指南。该实现解决了硬件控制中的关键问题,如传感器噪声、执行器限制等,为实际工程应用提供了可靠解决方案。

2026-01-30 16:03:27 750

原创 指针函数的应用层与驱动层:解耦核心与实践

指针函数和函数指针是C语言实现驱动层与应用层解耦的核心工具。通过定义统一接口的函数指针类型(如LED_Control),驱动层将具体实现(如STM32_LED_Control)注册到函数指针变量中,应用层只需调用统一接口(如LED_Set)而不关心底层实现。回调函数机制进一步扩展了解耦能力,中断模块通过注册的回调函数被动调用应用层逻辑。这种"接口抽象+函数指针注册"的模式实现了"封装硬件细节,暴露软件接口"的解耦目标,使驱动层修改不影响应用层代码。

2026-01-28 22:11:16 696

原创 基于STM32实现采集电位器模拟量并生成WAV文件播放

本文介绍了一个基于STM32的音频采集系统,通过定时器触发ADC采样,DMA传输数据,并生成WAV格式音频文件。系统采用双缓冲机制,将256字节缓冲区分为上下两半区,通过DMA中断标志实现采集与处理的并行。定时器配置为8kHz触发频率,ADC采样结果经DMA自动传输至内存,主循环将数据转换为16位PCM格式并通过串口发送。实验发现115200波特率会导致数据丢失,而460800波特率可完整传输10秒音频数据,揭示了串口缓冲区溢出是数据丢失的主因。该系统实现了从硬件触发到文件生成的完整音频采集流程。

2025-12-25 20:43:03 786

原创 Linux操作系统———I/O多路复用

上篇文章我们介绍了两种服务端接收多个TCP连接的实现方式:分别基于多线程和多进程实现,我们知道,进程和i西安城的创建都是有开销的,如果需要同时维护上万连接,这两种方式都是扛不住的,此时,需要使用更加节省资源,更加高效的方式:I/O多路复用I/O多路复用是Linux中用于处理多个I/O操作的机制,使得单个线程或进程可以同时监视多个文件描述符,以处理多路I/O请求。

2025-12-19 21:53:40 861

原创 Linux操作系统———守护进程

本文详细介绍了Linux守护进程的实现方法,主要包括以下步骤:1)通过fork()和setsid()创建独立会话;2)修改工作目录和文件权限掩码;3)关闭不必要的文件描述符;4)处理SIGHUP和SIGTERM信号;5)通过二次fork确保进程安全。文章还提供了完整的C语言实现代码,包括守护进程主程序、TCP服务端和客户端程序,展示了进程监控、信号处理、日志记录等关键功能。守护进程通过系统调用实现后台运行,与终端分离,确保服务稳定可靠。

2025-12-19 18:28:16 698

原创 Linux操作系统———UDP/IPC网络编程

我们在使用IP地址去寻找目标的服务器的时候,中间的那个东西就叫路由器,同时路由也被我们当作是一种功能,就是帮你找路,就比如说我发一条消息要经过路由,我只知道我是发送给张三,并不知道张三在这个互联网上的具体位置,都是由路由器来根据我的一些知识信息,它帮助我找到具体的位置。*@param src_addr 可以填NULL,如果src_addr不是NULL,并且底层协议提供了消息的源地址,则该院地址将被放置在src_addr指向的缓冲区中。// 地址类型 = AF_UNIX。

2025-12-18 21:15:29 605

原创 Linux操作系统———TCP网络编程

本文介绍了Socket网络通信的基本原理与实现方法。主要内容包括:1. Socket基础概念,作为网络通信端点,通过系统调用实现TCP/UDP通信;2. 字节序转换问题,使用htons/htonl和ntohs/ntohl函数处理主机与网络字节序差异;3. IP地址转换API比较,推荐使用inet_pton替代不安全的inet_addr;4. 完整的C/S架构实现示例,展示服务器端socket-bind-listen-accept流程和客户端socket-connect流程;5. I/O缓冲区机制说明,解释无

2025-12-17 18:59:08 719

原创 git命令使用教程

本文详细介绍了Git版本控制工具的基础操作流程,包括仓库创建、分支管理、协作开发和冲突解决等核心功能。主要内容包括:1.初始化本地仓库并配置远程仓库;2.创建dev分支进行功能开发;3.模拟多人协作场景下的代码冲突及解决方案;4.标签管理和代码回滚操作。文章通过实际案例演示了从创建项目到多人协作开发的完整Git工作流程,重点讲解了如何解决合并冲突和使用reset命令进行版本回退,为Git初学者提供了实用的操作指南。

2025-12-16 17:38:49 1138

原创 Linux操作系统———信号量

信号量是操作系统和并发编程中常用的同步机制,用于解决进程/线程间的互斥与同步问题。主要分为二进制信号量(互斥锁)和计数信号量(资源控制),以及无名信号量(线程间通信)和有名信号量(进程间通信)。无名信号量需存储在共享内存区域,有名信号量通过系统名称标识。信号量通过P/V操作(wait/signal)控制访问,保证临界区互斥访问或执行顺序。文中提供了多种实现示例:线程互斥、进程同步、生产者消费者模型等,并对比了不同信号量的使用场景和注意事项。此外还介绍了线程池的基本实现,通过任务队列和固定数量线程提高并发效率

2025-12-05 19:08:16 710 1

原创 龙芯久久派2k0300联网教程

本文介绍了通过MobaXterm软件连接”久久派“设备的两种方法。第一种是热点联网,需确保wlan0处于UP状态,通过wpa_supplicant命令连接热点后获取IP地址;第二种是网线联网,需将电脑和设备的以太网IP设置为同一网段。两种方法都需在MobaXterm中输入设备IP地址和端口号22建立连接。

2025-12-04 20:01:41 984

原创 Linux操作系统———线程同步

文章介绍了竟态条件的概念及解决方案,重点讲解三种锁机制:1)互斥锁(Mutex)确保单线程访问临界区,通过示例展示静态/动态初始化的区别;2)条件变量配合互斥锁实现线程等待/唤醒机制,演示生产者-消费者模型;3)读写锁支持并发读/独占写,通过设置写优先属性缓解写饥饿问题。文章还提及自旋锁在内核中的高效应用场景,强调其避免上下文切换的优势。

2025-12-04 16:53:43 662

原创 Linux操作系统———线程处理

本文通过代码示例详细介绍了Linux线程编程的核心API使用方法。首先对比了线程与进程的区别,重点阐述了线程共享资源的特点及同步问题。随后通过"红白玫瑰"案例演示了pthread_create、pthread_join等基础API的使用,包括线程创建、参数传递和结果获取。文章还深入解析了pthread_detach实现线程自动回收、pthread_cancel的两种取消模式(延迟取消和异步取消),以及pthread_setcancelstate禁用取消请求的用法。

2025-12-03 19:18:56 777

原创 Linux操作系统———进程通讯

本文介绍了五种进程间通信方法:1. 无名管道(Pipe)- 单向通信,需在fork前创建管道;2. 有名管道(FIFO)- 通过文件系统路径实现任意进程间通信;3. 共享内存- 通过mmap映射共享内存区域实现高效数据共享;4. 消息队列- 提供带优先级的消息传递机制;5. 信号- 通过信号处理函数实现异步事件通知。每种方法都配有示例代码,详细说明了其实现原理、API使用和注意事项,包括管道创建、共享内存映射、消息队列操作和信号处理等关键技术点。

2025-12-02 21:17:33 836

原创 Linux操作系统———进程处理

本文介绍了Linux进程管理的核心概念和函数使用。重点讲解了fork()创建子进程、execve()执行新程序、waitpid()回收子进程等系统调用,并分析了文件描述符共享机制。通过代码示例演示了父子进程的创建、执行和通信过程,包括进程ID获取、文件操作共享等场景。同时解释了僵尸进程和孤儿进程的区别:僵尸进程是已终止但未被父进程回收的进程,会占用系统资源;孤儿进程则是父进程先终止的子进程,会被init进程自动收养。文章提供了避免僵尸进程的解决方案,即使用waitpid()函数确保父进程正确回收子进程状态。

2025-11-30 20:23:29 583

原创 结构体指针与链表的基础知识

本文介绍了C语言中链表的基本概念和实现方法。主要内容包括:1.结构体指针的定义和使用,通过next指针连接节点;2.链表的基本操作实现,包括初始化、头插、尾插、指定位置插入、删除节点等;3.重点讲解了插入和删除节点的具体过程:插入时要先连接新节点与后续节点,再连接前驱节点;删除时需要保存待删节点,让前驱节点跳过它,最后释放内存。示例代码演示了链表的创建、插入、删除等完整操作流程,并配有详细注释说明指针操作的关键步骤。

2025-11-27 21:42:48 552

原创 Shell脚本基础教程

本文介绍了Shell脚本编程的基础知识,通过7个示例脚本讲解了变量、参数、条件判断、循环、函数、文本处理和错误处理等核心概念。主要内容包括: 变量定义与引用、只读变量和环境变量的使用 位置参数($0,$1等)和交互式输入(read命令) 条件判断语法(if/else)及文件/字符串/数字比较 循环结构(for/while)和范围展开({3..1}) 函数定义、调用和返回值处理 常用文本处理工具(grep/awk/sed/cut)和管道符 错误处理(set -e)和日志函数 最后通过一个日志管理脚本综合应用这

2025-11-26 22:07:53 1090

原创 Linux系统调用open/read/write/close函数以及内核文件中I/O机制原理

本文展示了Linux系统下文件I/O操作的核心机制。通过两个C语言示例代码,演示了open()、read()、write()和close()等系统调用的使用方法,详细注释了各函数的参数和返回值。重点解析了Linux内核中的文件I/O原理:文件描述符作为数组下标指向内核中的struct file结构体,该结构体包含文件路径、元数据指针等关键信息,通过f_path和f_inode实现文件的定位和权限控制。系统调用在用户进程和内核之间搭建桥梁,完成文件读写操作并维护文件元数据。

2025-11-26 16:45:26 708

原创 多级指针,指针数组,数组指针与偏移计算

一,什么是指针?指针,本质上是一个地址,是内存中某个存储单元的标识符,指针变量,则是一个用来存放地址(也就是存放指针)的变量int *p;下面通过一个简单程序加深印象:printf("\n=== 指针基础 ===\n");// 创建指针:类型* 指针名 = &变量;printf("变量number:\n");printf(" 值: %d\n", number);printf(" 地址: %p\n", (void*)&number);printf("指针ptr:\n")

2025-11-25 17:51:15 642

原创 C语言的文件I/O

*这里需要穿插一个众所周知的问题,对于c语言来说,一个字节并不能够读取一个汉字们可能是三个,也可能是四个,所以如果需要读取汉字的话需要连续读取*/printf("限制2字符字符串: %s\n", str2);* (6)a+:读追加写模式 如果文件存在末尾追加写,如果不存在创建新文件。/**const char *__restrict __s:需要写入的字符串。* (3)a:只追加写模式,如果文件存在末尾追加写,如果不存在创建新文件。* (2)w:只写模式,如果文件存在清空文件 如果不存在创建新文件。

2025-11-22 18:30:02 311

原创 C语言零散知识学习

本文摘要:1)头文件包含方式:双引号优先查找当前目录,尖括号直接查找系统路径;2)GCC编译四阶段:预处理、编译、汇编、链接,其中链接分为静态(体积大)和动态(共享库);3)性能优化策略:时间换空间(节省内存)和空间换时间(提升速度);4)字节对齐原理:通过填充字节使数据地址满足对齐要求,提升CPU效率;5)字节序类型:大端序(高位在前)和小端序(低位在前),不同系统和协议采用不同方式。

2025-11-22 18:00:42 453

原创 freertos常用API总结和基础概念理解

本文介绍了FreeRTOS实时操作系统的核心API函数,主要包括任务管理、队列操作、信号量、事件标志组、任务通知和软件定时器等功能模块。详细说明了各类函数的用途,如任务创建删除、队列读写、信号量操作等。同时概述了Tickless低功耗模式的相关配置项,包括进入/退出低功耗时的处理流程。还提供了内存管理相关函数,如内存申请释放和查询空闲内存大小。这些API为基于FreeRTOS的嵌入式开发提供了完整的任务调度和资源管理功能支持。

2025-11-18 14:18:15 464

原创 基于esp32s3学习freertos---互斥信号量

当任务b运行获取信号量,任务a抢占任务b,但任务a也需要信号量所以被任务b给阻塞等待任务b释放信号量,然后继续运行任务b,结果任务b被任务c抢占,等任务c运行完之后b开始运行,任务b运行完之后释放任务量,任务a才开始继续运行。在具体的任务调度中,当一个高优先级任务等待一个低优先级任务所持有的资源时,系统会提升低优先级任务的优先级,以避免高优先级任务长时间等待的情况。假设有三个任务分别是任务a高优先级,需要访问共享资源,比如说一个关键数据结构,任务b低优先级,目前正在访问该共享资源,任务c中优先级,

2025-11-18 14:16:26 765

原创 基于esp32s3学习freertos---软件定时器

它主要负责软件定时器超时的逻辑判断、调用超时软件定时器的超时回调函数、处理软件定时器命令队列。软件定时器是基于 FreeRTOS 内核提供的时间管理功能实现的,允许开发者创建、启动、停止、删除和管理定时器,从而实现在任务中对时间的灵活控制。由定时器执行的函数称为定时器的回调函数。定时器回调函数在定时器服务任务的上下文中执行,在定时器回调函数中不能调用导致阻塞的API函数。printf("timer2周期定时器启动成功\r\n");printf("timer2周期定时器停止成功\r\n");

2025-11-17 19:30:36 641

原创 基于esp32s3学习freertos---任务通知

任务通知是 FreeRTOS 中一种用于任务间通信的机制,它允许一个任务向其他任务发送简单的通知或信号,以实现任务间的同步和协作。//pdFALSE, // 接受完通知后,是否对通知置清零: pdTRUE 清零, pdFALSE 不清零,通知值-1。0xffffffff, // 接收到通知值后,是否清理通知值, 全1,表示32bit都是1,都要清零。0xffffffff, // 接收到通知值后,是否清理通知值, 全1,表示32bit都是1,都要清零。

2025-11-17 18:47:17 496

原创 基于esp32s3学习freertos---事件标志组

define EVENTBIT_0 (1 << 0) // 二进制: 00000000 00000000 00000000 00000001#define EVENTBIT_1 (1 << 1) // 二进制: 00000000 00000000 00000000 00000010。

2025-11-15 20:03:10 983

原创 基于esp32s3学习freertos---队列集

队列集(Queue Set)是 FreeRTOS 中的一种数据结构,用于管理多个队列。它提供了一种有效的方式,通过单个 API 调用来操作和访问一组相关的队列。在多任务系统中,任务之间可能需要共享数据,而这些数据可能存储在不同的队列中。队列集的作用就是为了更方便地管理这些相关队列,使得任务能够轻松地访问和处理多个队列的数据。队列集的特点和用法:使用队列集时,你需要了解如何创建、添加和访问队列集,以及如何使用队列集 API 进行数据的发送和接收。队列集是 FreeRTOS 提供的一个强大工具,用于更灵活地组织

2025-11-15 17:51:28 760

原创 基于esp32s3学习freertos---二值信号量和计数型信号量

FreeRTOS信号量是实现任务同步和资源管理的重要机制,包括二值信号量(0/1状态)和计数信号量(正整数)。二值信号量用于互斥访问和任务同步,通过Take(检测并清零)和Give(置1)操作实现;计数信号量则扩展为可记录多个事件,适用于资源池管理。两者都通过API函数实现动态/静态创建、获取和释放。优先级反转问题可通过互斥信号量的优先级继承机制缓解。信号量与队列的关键区别在于:前者侧重资源访问控制,后者专注任务间数据通信。

2025-11-14 18:04:54 511

原创 基于esp32s3学习freertos---消息队列

ESP_LOGI(TAG,"task3从big_queue成功读取数据[%s]\r\n", receive_buff);ESP_LOGI(TAG,"task2从queue1成功读取数据[%d]\r\n", receive);ESP_LOGE(TAG, "任务创建失败: %d, %d, %d", ret1, ret2, ret3);ESP_LOGI(TAG,"往queue1发送数据[%d]成功\r\n", key);ESP_LOGI(TAG,"task3从big_queue读取数据失败\r\n");

2025-11-14 16:33:00 722

原创 基于esp32s3学习freertos---任务状态查询API

FreeRTOS任务相关API函数介绍(熟悉)任务相关的API主要如下:函数描述uxTaskPriorityGet()获取任务优先级vTaskPrioritySet()设置任务优先级uxTaskGetNumberOfTasks()获取系统中任务的数量uxTaskGetSystemState()获取所有任务状态信息vTaskGetInfo()获取指定单个的任务信息xTaskGetCurrentTaskHandle()获取当前任务的任务句柄xTaskGetHandle()根据任务名获取该任务的任务句柄uxTas

2025-11-13 21:01:08 953

原创 基于esp32s3学习freertos---任务挂起与恢复

在中定义:// 或者在中断服务程序中调用FreeRTOS的API函数时,中断的优先级不能高于FreeRTOS所管理的最高中断优先级。优先级数值越低表示优先级越高(0最高)表示:高于FreeRTOS 管理范围,它适用于看门狗、高速ADC、紧急硬件低于或等于FreeRTOS 管理范围,它适用于按键、串口、普通事件。

2025-11-13 17:13:17 918

原创 基于esp32s3学习freertos---任务的创建

那么我要是想关掉调度器执行后面的函数怎么办,答案是没有办法关掉调度器,没有这类函数,在启动调度器后,cpu控制权完全交给了FreeRTOS,所以正确做法是把你"想在后面运行的代码"封装成一个任务,让它在多任务环境中与其他任务并发执行。ESP_LOGE(TAG, "任务创建失败: %d, %d, %d", ret1, ret2, ret3);ESP_LOGI(TAG,"LED1_PIN当前状态%d",led_state);ESP_LOGI(TAG,"LED2_PIN当前状态%d",led_state);

2025-11-12 16:23:01 732

原创 函数指针和回调函数

c/c++的函数指针和回调函数的学习

2025-11-07 19:52:24 282

空空如也

空空如也

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

TA关注的人

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