自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 LVGL,STM32U575RIT6+指纹模块

本文介绍了基于LVGL的嵌入式图形界面开发与多外设集成方案。通过移植LVGL至STM32U5平台,实现屏幕显示与触摸输入驱动,采用SPI+DMA优化刷新性能,解决花屏问题。结合FreeRTOS实现心跳与任务调度,确保界面流畅。进一步实现WiFi账号密码存储于FLASH,支持掉电保留;通过ESP8266 MQTT控制外设,并与指纹模块FPM10A通信,完成指纹录入、验证及用户信息映射,最终在GUI中展示打卡结果,构建完整智能交互系统。

2026-09-10 17:17:28 184

原创 FreeRTOS

内核是操作系统的核心组件,例如Linux系统所采用的内核,允许多用户同时访问计算机,并可以同时执行多个程序。每个执行程序都是受操作系统控制的任务。

2026-07-30 16:07:26 251

原创 I2C,SPI,MODBUS-TCP,DAC,独立看门狗

I2C,集成电路总线,是一种广泛用于嵌入式系统的同步,串行,半双工通信协议,用于在同一块电路板上的集成电路之间进行通信。电平触发采样:硬件,用于连接多个设备,实现设备之间的数据传输I:软件,定义了I2C总线上的数据通信的过程,包括如何启动通信,传输数据,应答信号,结束通信。

2026-07-10 14:24:53 283

原创 时钟,UART,DMA,ADC,TIM

MODBUS时一种基于串行通信的通信协议,旨在为工业现场提供一种通用的通信标准。用来实现不同设备之间的数据交换和控制。一帧modbus协议包含地址域(从机地址),功能码,数据(寄存器地址,和发的内容),差错校验(CRC校验)

2026-06-30 15:49:03 309

原创 时钟控制器原理

时钟源分为:RC振荡器,晶体振荡器。RC振荡器起振速度比晶体振荡器起振速度快,成本低,但精度不高,两者都是先慢慢起振,再达到相应的频率。晶体振荡器分为两种:无源晶体振荡器,需要接两个引脚,借助时钟电路才能产生震荡信号,自身没有办法震荡有源晶体振荡器,需要外部供电才能起振,并且只需要接一个引脚OSC_IN.STM32F407有4个输入时钟源:内部时钟源(封装到芯片内部的):HSI 内部高速时钟源(主要就是给CPU核心去提供) LSI

2026-06-15 15:47:59 327

原创 电路基础,电路原理图,GPIO

定义:电阻就是导体对电流阻碍作用大小的物理量。电阻越大,导体对电流的阻碍效果就越强。电阻通常用“R”表示。是导体本身的一种性质,与导体的材料,长度,横截面积以及温度有关。电阻的主要物理特征是变电能位热能,是一个耗能元件决定式: ρ表示电阻率,L表示导体长度,A表示导体的横截面积,R表示总电阻单位:欧姆(Ω)定义式:是直接根据电阻的定义来表示电阻,表达了电阻与电压和电流之间的关系,R表示电阻,U表示电压,I表示电流。R=U/I电阻率:是衡量材料抵抗电流流过能力的指标,是材料的固有特性。单位是:欧姆.米电导率

2026-06-10 15:32:22 294

原创 C语言卷子错题集

此时数组名代表整个数组,计算的是整个数组所占用的总字节数。&数组名:此时数组名代表整个数组,取出的是整个数组的内存地址。子网掩码的作用是:屏蔽主机号(也就是全0),获取网络号(全1)。范围是0-255,有254个,0和255是不能用的。但是题目中只有一个IP,要连接到6个子公司,就要分出来3bit当网络号,剩下的5位则是主机号,255.255.255.1110000011100000转换成10进制就是224.想要修改,就要使用静态局部变量,用static去修饰,使它的生命周期贯穿整个程序。

2026-05-27 20:36:57 199

原创 TCP/IP协议和TFTP协议

两次握手无法确认"客户端能接收服务端数据"这一能力三次握手验证目标说明客户端发送能力第一次握手(服务端收到 SYN)✅服务端接收能力第一次握手(服务端收到 SYN)✅服务端发送能力第二次握手(客户端收到 SYN-ACK)✅客户端接收能力第二次握手(客户端收到 SYN-ACK)✅客户端确认服务端序列号第三次握手才能验证✅属性内容全称Trivial File Transfer Protocol(简单文件传输协议)传输层基于 UDP(端口69特点简单轻量,无需认证,无目录浏览功能RFC。

2026-05-17 20:09:51 1176 1

原创 IO模型与并发服务器

知识点核心记忆阻塞IO等待+拷贝全程阻塞,最简单非阻塞IOO_NONBLOCK,轮询返回 EWOULDBLOCK,浪费CPUIO多路复用select/poll/epoll 监听多 fd,有就绪才处理select限制最多1024个fd,每次需重置fd_set,O(n)遍历poll改进无 fd 数量限制,但仍需 O(n) 遍历epoll优势红黑树+就绪链表,O(就绪数),支持ET,高并发首选LT vs ETLT=有数据就通知(默认);ET=数据到来时通知一次(需非阻塞读完)epoll三函数→→。

2026-05-17 19:48:02 492

原创 TCP通信和UDP通信

(三次握手完成),失败返回。

2026-05-17 19:40:23 391

原创 网络编程基础知识

特性说明地址长度128位,理论地址数 ≈ 3.4×10³⁸头部结构固定 40 字节,取消校验和(交由上层协议处理)地址类型单播、组播、任播表示方式十六进制分段,表示连续的0,如知识点核心记忆OSI 7层应表会传网数物(从上到下)TCP/IP 4层应用、传输、网络、网络接口(OSI上三层合并,下两层合并)三次握手SYN → SYN-ACK → ACK(确认双方收发能力正常)四次挥手FIN → ACK → FIN → ACK(全双工,各自关闭)ARPIP → MAC(广播查询,单播回应)TTL。

2026-05-17 19:33:47 1726

原创 线程的互斥锁

会立即失败返回,适用于"尝试获取锁失败则做其他事"的场景。只唤醒一个等待线程(适合单生产者-单消费者),唤醒全部(适合多消费者)

2026-05-08 20:10:50 404

原创 多线程函数

若未显式设置为分离态,其终止后资源不会立即释放,

2026-05-08 19:12:31 378

原创 进程间通信

传统的进程间通信方式:无名管道(pipe)、有名管道(fifo)和信号(signal) System V IPC对象: 共享内存(shared memory)、消息队列(message queue)和信号量(semaphore) BSD:套接字(socket)无名管道是内核空间实现的机制,只能用于亲缘进程间通信,无名管道的大小的64kb;创建单向数据通道(半双工通信方式)数据只能从读端pipefd[0]读取,从写端pipefd[1]写入,方向不可逆转;数据并非在进程间进行传递,而是先

2026-05-08 18:57:40 391

原创 特殊进程-

定义:当一个进程的父进程先于它终止,该进程就会成为孤儿进程;产生原因:父进程意外崩溃、被强制终止(如kill-9),或父进程主动退出但未正确处理子进程;特点: 失去父进程后,会被系统的“祖先进程”(linux中是init或system, PID=1)收养; 仍能正常运行,完成自身任务后会正常终止,不会占用额外资源;影响: 本身是系统正常处理机制的结果,无负面影响,反而避免了进程成为“无主进程”; 例如:若父进程因bug崩溃,子进程被init收养后可继续提供服务;代码示例:二,僵尸

2026-04-22 15:21:19 363

原创 多进程相关函数

仅当WIFEXITED为true时使用,返回子进程的退出状态码(即exit(n)中的n, 取低8位);若子进程是正常终止(调用exit()/_exit()或从main()返回),则返回true;仅当WIFSIGNALED为true时使用,若子进程终止时产生了核心转储文件,则返回true;若子进程是被信号暂停(仅在使用WUNTRACED标志或子进程被跟踪时有效),则返回true;当有子进程终止时,它会回收该子进程的资源,并通过wstatus获取子进程的退出状态值。若没有子进程结束,wait会一直等待;

2026-04-21 18:39:31 397

原创 进程基础-

进程是操作系统中的一次执行过程,它是操作系统进行资源分配和调度的基本单位;

2026-04-20 14:11:19 391

原创 文件IO函数二

若无输出则拷贝成功 ✅。

2026-04-16 19:29:13 325

原创 缓冲区---

三种策略,来适配不同的场景,也支持手动修改。,这是与行缓冲的主要区别。标准 I/O 中设计了。

2026-04-16 19:23:36 214

原创 MAKEFILE

要素说明目标(target)要生成的文件(可执行文件、目标文件)或伪目标(如 clean)依赖(prerequisites)生成目标所需的文件列表(源文件、头文件、其他目标)命令(commands)生成目标的具体操作,如make工具负责读取并解析 Makefile 文件,按照其中定义的规则执行项目构建操作。变量名说明默认值CC指定 C 编译器gccCFLAGSC 编译器的编译选项,如-Wall(开启所有警告)、-g(生成调试信息)等CPPFLAGSC 预处理器的选项,如包含头文件的路径CXX。

2026-04-15 14:38:50 423

原创 标准IO函数(一)

函数头文件功能返回值(成功)返回值(失败)<stdio.h>打开文件FILE *指针NULLfclose(fp)<stdio.h>关闭文件0EOF(-1)<string.h>错误码转错误字符串错误字符串指针通用描述perror("提示")<stdio.h>直接打印错误信息fgetc(fp)<stdio.h>读取一个字符字符 ASCII 值(int)EOF(-1)<stdio.h>写入一个字符字符 ASCII 值EOF(-1)<stdio.h>读取一行字符串字符串指针s。

2026-04-10 19:56:42 391

原创 GCC与GDB

GNU 工具集由自由软件基金会发起,始于20世纪80年代初,旨在构建完全自由的操作系统,核心原则是保障用户自由使用、修改和分发软件的权利。工具类别工具名称主要功能应用场景编译器gcc/g++将 C/C++ 源代码转换为可执行程序各类 C/C++ 项目开发调试工具gdb设置断点、查看变量、分析内存,辅助代码调试软件开发调试阶段,排查程序错误项目构建工具make依据 Makefile 自动处理编译依赖源文件多、依赖关系复杂的项目目标文件分析工具objdump。

2026-04-10 19:44:52 421

原创 Linux环境变量

环境变量是由操作系统维护的一系列键值对(变量名=值),用于存储系统/用户相关的配置信息,影响进程的运行环境。例如:程序执行路径、用户目录、默认编辑器等。PATH 是 Linux 系统中最重要的环境变量,以冒号(:)分隔,有序存储着一系列可执行文件所在的目录路径。/bin:存放基础系统命令/usr/bin:容纳用户级工具~/bin:保存个人脚本要点说明优先级用户级与系统级冲突时,用户级优先;不同 shell 修改对应配置文件撤销配置用户级:删除~/.bashrc中的 export 行;sudo编辑。

2026-04-07 17:16:53 615

原创 Linux系统操作命令

命令名 --help。

2026-04-02 20:27:24 416

原创 C语言---栈和队列

队列(queue)是一种先进先出(first in first out, FIFO)的线性表,它只允许在表的一端进行插入,而在另一端删除元素。允许插入的一端叫做队尾(rear),允许删除的一端叫做队头(front)。基本操作:InitQueue(*Q) 初始化队列DestroyQueue(*Q) 销毁队列ClearQueue(*Q) 清空队列QueueEmpty(Q) 判断队列是否为空QueueLength(Q) 返回队列中的元素个数。

2026-03-24 20:36:58 342

原创 C语言--链表

1.动态数据结构:当你需要一个可以动态调整大小的数据结构时,线性链表非常适合。与数组相比,链表可以方便地在运行时插入和删除元素,而无需预先定义大小。2.频繁的插入和删除操作:在需要频繁进行插入和删除操作的场景中,链表的性能优于数组。例如,任务调度、操作系统中的进程管理等场景。3.实现其他数据结构:链表常用于实现其他复杂数据结构,如栈、队列、哈希表等。这些数据结构的基本操作可以通过链表轻松实现。4.处理不确定数量的数据:例如,处理用户输入的字符串或数据流时,链表能够灵活地扩展以适应不同的数据量。

2026-03-24 20:36:22 406

原创 C语言--数据结构

要求理解每段代码含义,实现下面的功能)重点。

2026-03-23 15:19:40 52

原创 C语言指针

特性常量指针const int *p指针常量int * const p能否修改指向的数据?×不可以☑可以能否修改指针的指向?可以×不可以修饰对象被指向的数据指针本身典型用途防止函数误改数据(输入参数)固定指针指向的地址(硬件寄存器、内核变量等)延伸:同时限制两者(双重保护)有时我们既不希望修改指针,也不希望修改它指向的数据:constint* constptr= &a;

2026-03-18 19:29:15 416

原创 C语言-函数

在C语言中,递归函数是一种直接或间接调用自身的函数。递归是一种解决问题的编程技术,其中问题被分解为一个或多个更小的相同问题,直到达到最基本的形式,然后逐步解决每个问题。1.递归函数的基本原理递归函数通过重复调用自身来解决问题。每个递归函数至少需要两个部分:基线条件 (Base Case):递归终止的条件,当满足该条件时,递归停止,避免无限循环。递归步骤 (Recursive Step):在每次递归调用时,问题被分解为一个或多个更小的问题。2.递归函数的结构//基线条件,终止递归。

2026-03-16 19:56:34 381

原创 聚合数据类型

struct 结构体名 {数据类型成员名1;数据类型成员名2;//其他成员int age;定义结构体类型后,可以通过以下方式定义结构体变量#include#includeint age;//初始化结构体成员//输出结构体成员return 0;int x;int y;//定义一个Point类型的变量p1int width;int height;//定义了两个Rectangle类型的变量rect1和rect2int id;

2026-03-12 20:27:59 423

原创 C语言中的数组

字符数组是用于存储字符序列的数组,每个元素是一个字符类型 (char)。字符数组通常用于表示字符串,但本质上它只是字符的集合。声明语法:示例://声明一个长度为10的字符数组显式初始化:可以直接在声明时为字符数组赋值。示例:数组name存储字符序列Hello,但不会自动加上字符串结束符\0.字符串初始化:使用字符串字面量直接初始化字符数组。示例:自动在末尾添加字符串结束符\0.字符串初始化时数组的大小可以不显式指定,编译器会自动推导。

2026-03-10 20:25:16 443

原创 C语言中的循环结构

具体作用包括:循环结构使得我们可以轻松处理大量数据或重复执行某些操作,而不需要手动编写重复的代码。例如,遍历数组、打印序列等。通过循环条件的灵活性,循环能够根据用户输入、计算结果或其他动态条件来控制执行的次数,从而适应不同的场景和需求。使用循环可以避免手动重复编写代码,提高程序的可维护性和扩展性。例如,一个简单的循环就能执行成百上千次计算,代替手动书写大量重复代码。循环特别适合处理集合或批量数据 (如数组、链表等),可以简便地执行操作如查找、插入、删除等。

2026-03-09 17:21:13 358

原创 C语言中条件判断结构

解释:如果a > 5条件为真,打印"a is greater than 5",否则打印"a is not greater than 5"。解释:如果 a >5 条件为真,则打印"a is greater than 5",否则不打印任何内容。//如果 condition 为真,执行这段代码。//如果condition1为真,执行这段代码。//如果condition2为真,执行这段代码。//如果condition为真,执行这段代码。//如果condition为假,执行这段代码。//可以有多个case分支。

2026-03-09 08:51:24 210

原创 C语言中的运算符

将操作数的位右移指定的次数,左侧根据符号位(对于有符号数)或0(对于无符号数)补齐。取余运算符只能用于整数类型操作数,不能用于浮点数,且通常用于判断奇偶性、循环中的计数以及其他类似用途。对于正整数,结果为非负数,结果的符号与被除数的符号一致。:可以对整型(int),浮点型(float),双精度型(double)等类型操作数进行加法操作。仅适用于整数类型,不能用于浮点数。当除数为0时,将导致除零错误,这是一个严重的运行时错误,需要特别注意。将操作数的位左移指定的次数,右侧用0补齐,左移相当于乘以2的幂次。

2026-03-06 18:34:33 344

原创 常量的学习笔记

定义:const 关键字用于定义具有类型的符号常量。使用 const 修饰的变量不能被修改。语法:const 数据类型 常量名 = 常量值;示例:特点:const 常量有类型限制,编译器会进行类型检查。const 常量存储在内存中,可以参与程序运行时的计算。#define和const的区别预处理器宏与变量的区别#define 是一个预处理器指令,用于在编译前将某些文本替换为指定的值。它没有类型信息,是简单的文本替换。

2026-03-06 08:42:34 363

原创 输入输出函数

分类输入函数:scanf()、getchar()、fgets()输出函数:printf()、putchar()、puts()

2026-03-05 15:53:14 371

原创 变量错题集锦

1.2.3.4.5.6.7.8.9.10.11.12.

2026-03-05 10:17:42 26

原创 C语言 变量

变量的概念变量是用来存储数据的被命名的内存位置。变量需要用一个有名字的,具有特定属性的存储单元来存放数据。变量必须先定义后使用或先声明后使用,定义时指定名字和类型,也可以指定初值。<存储类型> <数据类型> 变量名 = 初始值变量的命名规则局部变量和全局变量的区别:注意的是:1.变量必须先声明,后使用。2.变量一旦声明,就不能再更改其类型。3.同一个作用域内不能命名重名的变量。4.变量遮盖:当在一个嵌套的作用域中定义了与外部作用域中同名的变量时,内部变量会遮盖外部变量。

2026-03-04 20:33:44 338

原创 gcc的编译过程

在链接阶段,编译器会将编译后的目标文件与库文件、其他目标文件进行链接。如果存在函数的调用,但是没有对应的函数定义(或者在链接的文件中找不到定义),链接器会报告一个“未定义引用”错误。此时,编译器会检查语法错误、类型错误等,但它通常不会检查是否有未定义的函数。在C语言中,main()函数的返回类型应该是int,表示程序的退出状态。#include指令的作用是将指定的头文件包含到源文件中,使得程序可以使用头文件中声明的函数、宏、结构体等。链接阶段的主要任务是将多个目标文件及库文件链接成一个完整的可执行文件。

2026-03-04 10:26:19 48

原创 为什么学习C语言

一- C语言的4步,(Hello.c)预处理器(cpp)(gcc -E)------(Hello.i)编译器(gcc)(gcc -S)-----(Hello.s)汇编器(as)(gcc -c)----(Helllo.o)链接器(id)(gcc)-----可执行文件。三-头文件只负责声明我们说要使用的这个函数的一个调用时候的类型格式,而不负责去定义这个函数里面具体该如何实现,他只提供一个接口。程序都是从main()函数开始执行的,main()函数是程序的入口,main()函数也被叫做。

2026-03-03 20:30:52 36

空空如也

空空如也

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

TA关注的人

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