自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 ARM | 让蜂鸣器发声!

本文介绍了使用STM32固件库控制蜂鸣器的实现方法。首先通过原理图确认蜂鸣器连接GPIO5_IO01引脚,低电平触发。具体步骤包括:1)使能外设时钟;2)配置引脚复用功能;3)设置电气属性;4)将GPIO5配置为输出模式;5)通过控制GPIO5的DR寄存器实现蜂鸣器开关和翻转功能。文中提供了完整的函数实现和Makefile编译脚本,并说明了程序烧录到SD卡的方法。整个过程展示了嵌入式系统中GPIO控制外设的典型开发流程。

2026-03-27 18:59:20 435

原创 ARM | 点亮LED灯!

解压之后由于我们使用的Ubuntu之前安装过更古老版本的交叉工具链,我们必须先把原来那个屏蔽掉。LED0接的是GPIO 3引脚,GPIO 3默认为GPIO第一组的03号引脚。LED灯负极接GPIO1_IO03,正极接VCC。连接电源,按下电源开关键,即LED灯亮(红灯)GPIO属于外设,时钟不开,GPIO不工作。GPIO输出1 -> 灯灭。设置CPU工作模式+各模式栈指针(CPU复位后第一条执行。(1)设置引脚为GPIO模式。(3)设置GPIO为输出模式。(2)设置引脚的电气属性。,表示接低电平,灯亮。

2026-03-26 19:16:00 834

原创 汇编语言 | 立即数、常用指令、混合编译、模式切换

本文摘要:ARM汇编技术要点包括:1)立即数判断规则(12位数值范围、二进制位限制);2)CPSR寄存器NZCV标志位更新条件;3)栈的四种分类及ARM默认使用满减栈;4)常用汇编指令(移位、加载存储、位操作、跳转等);5)汇编与C语言混合调用的参数传递规则;6)处理器模式切换流程(寄存器操作、栈指针管理)。重点阐述了ARM架构下立即数处理、状态标志、栈操作和混合编程等核心概念。

2026-03-25 19:08:20 713

原创 ARM | 内核架构、寄存器组、工作模式

ARM公司不生产芯片,只设计处理器架构(内核)

2026-03-24 19:20:25 447

原创 单片机 | 温度传感器(DS18B20)

DS18B20在60us内进行采样,如果采到低电平,代表主机发送了一个‘0’主机如果在60~240us检测到总线出现低电平,代表DS18B20恢复了一个“存在脉冲”主机先将总线拉低至少480us,再释放总线(至少15us),代表主机发送了一个复位脉冲。DS18B20在45us内进行采样,如果采到高电平,代表主机发了一个1。主机将总线拉低大于1us,释放总线,引脚变为高电平。DS18B20最终释放总线,总线为高电平。主机释放总线,将引脚拉高。:发送复位脉冲,拉低总线,然后释放,等待传感器响应脉冲。

2026-03-23 17:41:05 719

原创 单片机 | 带你认识和应用单片机!

本文系统介绍了51单片机的基础知识与应用开发。主要内容包括:单片机最小系统构成(电源、晶振、复位电路);51单片机架构特点(RAM/ROM区别、MCU/MPU对比);芯片内部结构(CPU、内核);位运算操作技巧;中断机制与处理流程;开发板各模块应用(LED流水灯、数码管显示、按键检测、定时器控制、蜂鸣器发声);PWM脉宽调制原理;串口通信技术(UART协议、全双工/半双工模式、电平标准、数据格式)。通过具体代码示例展示了各模块的编程实现方法,为单片机开发提供了实用参考。

2026-03-22 15:05:48 660

原创 数据库 | 数据库编程

高效对大批量数据管理的一种软件。

2026-03-09 20:45:01 623

原创 应用层协议 | HTTP协议 | TCP并发服务器

服务端需要连接多个客户端时,服务器需要使用accept等待三次握手连接,同时还需要recv等待接收所有客户端发送的数据,由于。用一个函数接口监听多个文件描述符是否产生IO事件,只要其中一个产生事件,则不再阻塞,用户可以处理对应的事件。//设置fd为异步IO(当有事件发生时,内核会发送SIGIO信号通知应用层。,当事件发生时需要产生一次内核层向应用层数据的拷贝,会产生资源开销。效率低,数据没来时不阻塞等待,向后执行,但需要。//判断revents中是否有事件发生(fd中是否有事件可读)

2026-03-07 17:05:28 684 1

原创 TCP通信 | 操作流程、函数接口、与UDP通信的区别

成功返回新的套接字文件描述符(返回的新的文件描述符用于通信)backlog:未处理的三次握手请求的最大排队个数。addrlen:接收发送端IP地址的长度。sockfd:套接字文件描述符。sockfd:套接字文件描述符。sockfd:套接字文件描述符。buf:发送的数据的空间首地址。sockfd:套接字文件描述符。sockfd:套接字文件描述符。addrlen:目的地址的长度。功能:处理三次握手等待队列中的第一个连接请求。TCP包头至少占20个字节。len:发送数据的长度。len:存放数据的长度。

2026-03-04 20:43:52 639

原创 网络|网络协议、网络的配置、UDP通信

C类私有IP地址:192.168.0.0 - 192.168.255.255。B类私有IP地址:172.16.0.0 - 172.31.255.255。A类私有IP地址:10.0.0.0 - 10.255.255.255。(4)一个局域网内能容纳主机的个数:2 ^ 主机位 - 2。dest_addr:目的IP的空间的首地址。将字符串IP地址转换为32位的IP地址。公有地址:能够直接上互联网的地址;私有地址:不能直接上互联网的地址;(3)子网掩码:用来区分IP地址的网络位和主机位。

2026-03-02 22:03:01 848

原创 进程间通信 | 消息队列、共享内存、信号灯

shmflg:标志 IPC_CREAT 不存在就创建。shmflg:属性 IPC_CREAT 不存在就创建。IPC对象的名称,一个键值对应一个IPC对象,功能:根据pathname和proj_id生成IPC对象的键值。msgflg:IPC_CREAT 不存在就创建。功能:根据pathname和proj_id生成IPC对象的键值。功能:根据pathname和proj_id生成IPC对象的键值。msgp:发送消息空间的首地址;msgp:存放消息空间的首地址;ipcs:查看IPC对象的信息。

2026-02-27 21:19:50 965

原创 进程间通信 | 管道、信号

本文介绍了进程间通信的几种主要方式:管道(无名管道和有名管道)、信号、消息队列、共享内存和信号灯。重点阐述了无名管道仅适用于亲缘关系进程,通过pipe()函数创建读写文件描述符;有名管道通过mkfifo()创建,可实现任意进程通信,并详细说明了其读写特性。在信号部分,列举了常用信号类型及其处理方式(缺省/忽略/捕捉),介绍了signal()、kill()等关键函数,并通过父子进程信号交互的实例演示了实际应用。文章还简要提及了共享内存作为最高效的通信方式,为开发者提供了全面的进程通信方案参考。

2026-02-26 20:20:24 985

原创 线程间通信 | 避免资源竞争、实现同步通信

本文介绍了多线程编程中的通信与同步机制。主要内容包括:1)线程间通过共享数据段和全局变量通信,需使用互斥锁避免资源竞争;2)互斥锁的使用方法及函数接口(初始化、加锁、解锁、销毁);3)死锁的产生条件及解决方法;4)信号量机制实现线程同步,通过申请/释放资源控制执行顺序。文中提供了互斥锁和信号量的代码示例,展示了如何正确使用这些同步机制来协调多线程的执行流程,确保数据一致性和执行顺序。

2026-02-25 16:45:14 889

原创 网络编程 | 线程

线程是轻量级进程,与进程的主要区别在于:线程共享进程的文本区、数据区和堆区,但拥有独立栈区。进程是资源分配的最小单元,线程是CPU调度的最小单元。线程创建时会分配8MB独立栈空间,调度遵循"宏观并行,微观串行"原则。多线程优势在于高效调度和便捷通信,但线程崩溃会导致整个进程终止;多进程则更安全但效率较低。线程通过pthread_create创建,需指定线程函数和参数,编译时需链接pthread库。线程执行是多执行流并行,拥有独立栈空间,而函数调用是单线程内的串行操作。

2026-02-11 19:11:12 911

原创 网络编程 | 进程创建、调度、接口

本文介绍了进程管理的基本概念和相关操作。主要内容包括:1)进程与程序的区别,进程是程序动态执行的过程;2)常用进程管理命令如top、ps、kill等;3)进程创建的关键函数fork()及父子进程关系;4)进程调度的主要算法如时间片轮转、优先级调度等;5)进程的7种状态及其转换;6)进程地址空间管理机制。文章通过代码示例详细说明了如何创建多级子进程,并分析了fork()函数的使用注意事项。

2026-02-10 21:43:18 1008

原创 Linux网络编程 | 文件IO、目录IO、时间接口

本文介绍了Linux系统中的文件I/O和目录I/O操作。文件I/O是直接的系统调用,无缓存,适合处理设备文件;而标准I/O是库函数,有缓存,适合普通文件。详细讲解了open、close、read、write、lseek等文件操作接口的使用方法和参数说明。在目录操作方面,介绍了opendir、readdir、closedir等接口,以及mkdir、rmdir等目录管理函数。最后还介绍了时间相关接口time、localtime和mktime的使用。文中通过多个代码示例展示了如何实现文件拷贝、目录遍历等常见操作。

2026-02-09 21:25:26 1031

原创 Linux软件编程|IO编程

本文介绍了Linux系统中的IO编程基础,重点讲解了标准IO操作。主要内容包括:1) 文件类型分类(块设备、字符设备、目录、普通文件等);2) IO接口分类(标准IO、文件IO、目录IO);3) 标准IO的基本操作流程(打开、读写、关闭文件);4) 三种缓存类型(全缓存、行缓存、不缓存)及其刷新条件;5) 常用标准IO函数(fopen/fclose、fgetc/fputc、fgets/fputs、fscanf/fprintf等)的使用方法和示例代码。文章详细说明了文件操作的基本概念和实际应用,为Linux系

2026-02-06 22:27:45 1074

原创 Linuv软件编程 | Shell命令

本文摘要: 本文系统介绍了Linux软件编程的基础知识,主要内容包括:1)操作系统概念与Linux组成(内核、Shell、库函数);2)常用Shell命令(文件查看、搜索、权限管理等);3)软件包管理工具(dpkg和apt-get);4)Shell脚本编程基础(变量、分支、循环、数组和函数)。文章详细讲解了Shell脚本开发流程、环境变量使用、流程控制结构以及常用命令操作,为Linux系统管理和脚本开发提供了实用指南。

2026-02-05 22:21:05 843

原创 排序和查找算法:插入排序、希尔排序、快速排序以及二分查找

本文介绍了五种经典排序算法(冒泡、选择、插入、希尔、快速排序)和二分查找的实现。排序算法部分详细说明了每种算法的时间复杂度、稳定性特点,并提供了关键代码示例。其中冒泡和插入排序是稳定的O(n²)算法,而快速排序和希尔排序是不稳定的O(nlogn)算法。二分查找部分强调其O(logn)的时间复杂度,要求数据有序,并给出了递归实现的代码。全文通过代码示例清晰地展示了各算法的核心逻辑和实现方法。

2026-02-04 20:01:50 685 2

原创 完全二叉树、非完全二叉树、哈希表的创建与遍历

本文介绍了二叉树和哈希表的数据结构实现方法。在二叉树部分,详细说明了完全二叉树的递归创建、前序/中序/后序遍历、销毁及层序遍历的实现,以及非完全二叉树的创建和非递归遍历方法。哈希表部分重点阐述了哈希冲突的链地址法解决方案,包括有序插入、查找、遍历和销毁等操作。所有实现均提供了关键代码示例,涵盖了内存管理、错误处理等细节,展示了数据结构的基本操作原理和实现技巧。

2026-02-03 22:44:18 891

原创 队列 | 二叉树

无论是入队(Tail 后移)还是出队(Head 后移),都通过。遵循“先进先出,后进后出”的原则。1.队头:出队的一端;

2026-02-02 23:13:42 978

原创 数据结构 | 双向链表、双向循环链表、栈

本文介绍了双向链表和双向循环链表的基本操作与实现。双向链表每个节点包含前驱和后继指针,支持头插法、尾插法创建,插入时需处理前后节点指针关系,删除时需调整相邻节点的指针。双向循环链表首尾相连,创建时节点指针指向自身。文章还对比了数组和链表的区别,指出链表在插入删除效率上的优势。最后简要说明了栈的先进后出特性及其分类(增栈/减栈、空栈/满栈),以及入栈出栈操作。通过代码示例详细展示了各种数据结构的实现方法。

2026-01-31 21:58:26 976

原创 数据结构:链表常见的操作方法!!

本文介绍了单向有头链表的各种操作方法,包括修改节点数据、查找节点(单个节点、中间节点和倒数第k个节点)、销毁链表、链表倒置、排序(冒泡排序和选择排序)以及判断链表是否有环。通过定义辅助指针并遍历链表,实现了这些基本操作。重点讲解了查找中间节点和倒数第k个节点的双指针技巧,以及两种排序算法的实现原理。这些方法为链表操作提供了完整的解决方案。

2026-01-30 22:28:12 967

原创 数据结构|概念及单向有头链表

程序由数据结构与算法构成,数据结构决定数据存储方式,算法确保高效操作。程序效率通过时间复杂度和空间复杂度衡量,常见复杂度包括O(n)、O(n²)等。数据结构分为逻辑结构(线性、树形、图形)和存储结构(顺序、链式、索引、散列)。顺序表通过连续内存存储数据,链表则通过指针连接节点,分为单向、双向和循环链表。单向链表又分为有头和无头两种,有头链表通过哨兵节点简化操作,包含创建、遍历、查找和删除等基本操作。

2026-01-29 22:14:27 934

原创 C 语言核心库函数解析与内存问题调试指南

本文介绍了C语言常用库函数和内存调试方法。常用库函数包括sprintf/sscanf(字符串格式化)、strtok(字符串分割)和strstr(子串查找),使用时需注意内存越界问题。内存调试部分涵盖三种常见问题:1)内存越界,表现为偶现性BUG;2)段错误,可通过打印法或gdb调试;3)内存泄漏,可用valgrind工具检测。文章还详细说明了valgrind工具的安装配置方法,并提供了统计子串个数的示例代码。调试技巧包括打印法、gdb调试和内存检测工具的使用。

2026-01-26 20:56:20 995

原创 C语言进阶必备| 多文件编程及Makefile使用

本文介绍了C语言多文件编程的关键技术要点:1.头文件包含方式区别,<>从系统目录查找,""优先从项目目录查找;2.防止头文件重复定义的方法;3.Makefile工程管理工具的基本语法、变量使用和GCC编译选项;4.重点讲解了Makefile的三个常用格式替换函数(wildcard、patsubst、notdir)及其应用;5.对比了动态库和静态库的特性差异,包括加载时机、代码体积影响以及运行依赖性等。内容涵盖了从多文件组织到自动化构建的核心开发技术。

2026-01-25 00:04:13 1062

原创 硬核干货|C 语言 5 大核心知识点:共用体 + 枚举 + 位运算 + 内存管理全解析

本文介绍了C语言中的几个重要概念:1)共用体(联合体)的定义和使用,其成员共享内存空间;2)枚举类型的定义和特性;3)typedef关键字用于类型重命名;4)位运算操作符及其应用场景;5)内存管理中的栈区和堆区区别,包括malloc/free函数的使用。重点阐述了结构体与共用体的内存差异、位运算技巧以及内存空间管理方法。这些知识点对理解C语言底层编程和内存操作具有重要意义。

2026-01-23 22:47:42 655

原创 从基础到实战:C 语言 main 函数传参和结构体使用教程

本文摘要: 主要内容包括C语言中的主函数传参和结构体使用。主函数传参部分介绍了int main(int argc, const char **argv)的常用写法,其中argc表示参数个数,argv指向参数字符串数组。结构体部分详细讲解了:1)结构体定义和变量声明;2)初始化方法(全部初始化和局部初始化);3)成员访问方式(.和->运算符);4)内存对齐原则;5)作为函数参数的传递方式(传值和传指针)。最后给出了一个综合示例,展示了结构体在日期处理中的应用,包括获取日期、判断闰年和计算年天数等功能。

2026-01-22 22:36:43 721

原创 实战详解:二级指针 /void 指针 /volatile 指针 / 数组指针的使用

本文介绍了四种指针类型及其应用:1.二级指针(指向指针的指针),用于修改外部指针变量和指针数组传参;2.void指针(无类型指针),用于通用内存地址操作,需注意类型转换;3.volatile指针,防止编译器优化,确保每次访问内存;4.数组指针与指针数组的区别及应用,包括二维数组操作和字符串排序实现。通过代码示例详细说明了各种指针的使用场景和注意事项。

2026-01-21 22:37:25 865

原创 C语言进阶:函数指针与指针函数

本文摘要: 1.指针函数:返回指针类型的函数,需注意不能返回局部变量地址(如栈区变量),但可返回字符串常量地址(数据区)。示例展示了正确返回字符串常量的方法,以及指针函数在链式调用中的应用(如strcpy嵌套调用)。 2.函数指针:指向函数入口地址的指针,声明格式为"返回类型(*指针名)(参数类型)"。函数名即函数地址,可直接赋值给函数指针。示例演示了如何声明和使用加法函数的指针。 3.const指针: const int*p:指针可变,指向的值不可变 int*const p:指针不可变

2026-01-20 20:50:58 633

原创 C语言进阶:指针!

摘要:本文介绍了C语言中指针的基本概念与应用。指针作为内存地址的变量,通过&和*运算符实现地址获取和内存访问。指针变量需初始化以避免野指针问题,其算术运算遵循数据类型大小偏移。指针可作函数参数实现传址调用,常用于数组操作,数组名即为指向首元素的指针常量。文中还展示了指针与一维数组的关系,并通过冒泡排序案例演示了指针在数组处理中的应用,包括输入、排序和输出功能封装。

2026-01-19 21:43:08 871

原创 进阶必看 | C语言函数传参+宏定义

本文介绍了C语言中函数传参、递归调用和预处理命令的核心概念。函数传参包括值传递(复制副本)、全局变量传递(共享访问)和数组传递(地址引用),需注意数据修改权限和效率问题。递归函数强调终止条件的重要性,避免无限递归。预处理命令重点讲解了带参宏和不带参宏的使用技巧,指出宏与函数的区别在于文本替换机制,使用宏需注意括号和运算符优先级问题。文章还通过实例演示了字符串处理和斐波那契数列的递归实现,强调编程中要区分值传递与地址传递,合理使用递归和宏定义。

2026-01-17 20:03:08 980

原创 C语言底层通关:函数与内存的核心密码

本文系统介绍了C语言函数与内存管理的核心知识。函数部分重点阐述了定义、调用和声明三要素,强调其模块化编程价值,并解析了局部变量与全局变量的作用域特性。内存管理方面,详细说明了C程序的五大内存分区(栈区、堆区、数据区等)及其功能特点。最后归纳了四种存储类型:auto(默认局部变量)、register(寄存器优化)、extern(外部引用)和static(静态存储)。全文通过代码示例展示了函数封装、变量作用域和内存分配机制,为理解C语言底层运行原理提供了系统框架。

2026-01-16 21:39:00 810

原创 拆解 C 语言数组核心:字符数组操作 + 二维数组,附实战案例与避坑指南

本文介绍了C语言中一维字符数组和二维数组的基本概念与操作。一维字符数组用于存储字符串,包括定义、访问、初始化、存储特性及字符串处理函数(strlen、strcpy、strcat、strcmp)的使用方法。二维数组部分详细讲解了整型和字符型二维数组的定义、访问、初始化、存储特性,特别强调了"行可省列不可省"的初始化规则及其本质原因。最后总结了使用数组时需注意的常见问题,包括避免越界访问、区分strlen与sizeof、正确理解数组的存储特性等,为数组的规范使用提供了实用指导。

2026-01-15 19:56:01 999

原创 新手必看:C 语言一维数组,看完这篇就懂了!

总结一下:一维整型数组是C语言最基础的“数据容器”,核心就是搞懂“怎么定义、怎么拿东西、怎么初始放东西、怎么存的、怎么用它做常见操作”这几件事。把这些搞明白,不仅能解决基础编程题,后面学更复杂的内容也能轻松上手,重点记住:别乱翻超出范围的“盒子”,定义的时候按规矩来就行。定义的时候要说明“盒子数量”(必须是固定的数,不能是变量),拿盒子里的东西得按“序号”来——这个序号叫“下标”,从0开始算(比如第一个盒子是0号,不是1号),千万别乱翻超出范围的盒子,不然程序会出问题。“相邻的两个比,大的往后挪”

2026-01-14 21:43:29 652

原创 C语言循环结构全解析:从for到goto,帮你彻底搞懂C语言的循环结构,写代码信手拈来!

本文介绍了C语言中循环结构的重要性及四种实现方式。循环结构能简化重复性代码,提升程序效率。重点讲解了for循环(适合已知循环次数)、while循环(适合未知次数但明确终止条件)、do-while循环(至少执行一次)以及goto语句(谨慎使用)。通过0-100累加和九九乘法表示例,展示了不同循环的应用场景。文章强调根据需求选择合适的循环类型,并指出结构化编程的重要性。最后建议通过思维导图系统掌握各类循环的特点。

2026-01-13 20:17:43 521

原创 C语言:学流程控制,告别“流水账”,让你的代码学会“做选择”!

本文介绍了编程中的流程控制概念,重点讲解顺序结构和分支结构。顺序结构指代码按顺序执行,而分支结构则根据条件做出不同选择。文章详细讲解了分支结构中的运算符(关系、逻辑、特殊运算符)和两种主要分支方式:if语句(包括简单分支、阶梯分支和嵌套分支)和switch语句(用于固定整型常量判断)。通过马路行驶的比喻,生动说明了流程控制的作用,并提供了多个练习示例帮助理解。最后强调分支结构能让程序更具灵活性,实现不同条件下的选择执行。

2026-01-12 20:50:17 748

原创 C语言基础(三):常用的输入输出函数

本文总结了C语言程序的基本运行流程和常用输入输出函数。程序从main函数开始执行,介绍了函数的定义、使用条件(需包含stdio.h头文件)和分类。重点讲解了putchar(输出字符)、getchar(输入字符)和printf函数的使用方法,包括格式控制符(如%d、%f等)、转义字符和格式化输出技巧。同时详细说明了scanf函数的用法,包括输入控制符的使用注意事项,特别指出%c会接收空格和回车作为输入数据。这些内容为C语言基础输入输出操作提供了系统性的指导。

2026-01-10 19:50:41 430

原创 C语言基础(二):常量和变量、类型转换、表达式

由上一条开始,我们进入C语言的学习啦,学好数据类型、常量和变量、表达式以及类型之间的转换,为掌握C语言算法和熟练写出代码打好基础!//存储形式为:'a'—ASCII码表—十进制数(97)—二进制数(0110 0001)需要强调的是,即使有这些规则,大家写代码的时候最好还是同类型赋值,这样不会出错哦。小数据放入大空间需要拓展,有符号数扩符号位,无符号数扩0;获得c语言中数据类型或变量所占的空间大小,单位为字节(用“%ld”打印)#define只是代码的替换,中间不会做数据运算的操作。

2026-01-09 20:15:27 423

原创 C语言基础(一):编译步骤、基本数据类型

最后学习的是常量和变量,这部分的内容比较重要,大致将常量的类型做了归纳,后续将重点学习常量和变量。CPU是运算核心,执行编译器的指令,协调内存与外存之间的数据读写,控制整个编译流程。内存是临时工作区,编译时,CPU将外存中的工具和文件加载到内存中进行处理;协作逻辑:外存是数据仓库,程序编译完成后,存储生成的目标文件,可执行文件等;是错误的,void表示类型缺省,这样表示计算机不知道a的类型,无法进行操作。符号位(1位)+指数位(11位)+尾数位(52位)符号位(1位)+指数位(8位)+尾数位(23位)

2026-01-08 19:37:29 1113

空空如也

空空如也

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

TA关注的人

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