自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 ARM时钟初始化与GPT定时器深度解析

👉 ARM 核心正式使用 PLL1 输出的高速时钟。3️⃣ GPIO / 外设再初始化。👉 CPU 通过 CNT 判断时间。临时切换到 step clock。👉 精确 1 秒翻转 LED。1️⃣ 中断系统先准备好。👉 打开所有模块的时钟。4️⃣ 定时器最后启动。使用 IPG_CLK。👉 本质还是 GPT。👉 GPT 在后台跑。

2026-01-22 19:14:26 1331

原创 裸机开发:ARMv7-A中断驱动LED/蜂鸣器实战

无操作系统(no OS)环境下实现按键中断驱动 LED/蜂鸣器响应的底层系统初始化与中断处理流程。触发条件为上电或复位,入口函数为 (位于 )。该阶段的主要目的是配置 CPU 基本工作状态,确保系统安全启动。关键操作禁用 IRQ 通过 指令实现,确保 CPU 内部禁止中断。配置异常向量表基地址(VBAR)通过 或 完成,必须在 IRQ 使能前设置。切换 CPU 模式(如 IRQ 模式 和 SYS/用户模式 )。初始化栈指针为每种 CPU 模式单独设置,例如 。清空 段通过循环写 0 实现

2026-01-21 19:57:40 1146

原创 ARM裸机开发入门:从环境搭建到外设驱动

【代码】ARM裸机开发入门:从环境搭建到外设驱动。

2026-01-20 20:27:46 839

原创 DS18B20传感器全解析:从参数到实战

测量范围:-55℃至125℃,覆盖常见环境温度需求。精度:±0.5℃,适合一般工业及民用场景。分辨率:可通过配置选择(9位至12位),默认12位(0.0625℃)。工作电压:3V-5V,兼容多数嵌入式系统电源设计。引脚定义:初始化(复位):主机拉低总线480µs以上,释放后等待DS18B20的60-240µs应答脉冲。ROM命令:发送搜索ROM(0xF0)或跳过ROM(0xCC)指令,跳过ROM可简化单设备场景。功能命令:发送温度转换(0x44)和读取暂存器(0xBE)指令。写时序:读时序:

2026-01-15 15:21:00 775

原创 UART通信全解析:从原理到实战

UART(Universal Asynchronous Receiver/Transmitter)是一种通用异步收发器,用于设备间的异步通信。[ \text{波特率} = \frac{2^{\text{SMOD}} \times \text{定时器溢出率}}{32} ] 其中定时器溢出率由初值决定。

2026-01-14 18:00:45 1048

原创 GPIO配置与中断控制全解析

按键一端接地,另一端接GPIO引脚,并配置为上拉输入模式(默认高电平)。

2026-01-13 18:10:52 604

原创 嵌入式系统与51单片机核心原理

嵌入式系统是以应用为中心、以计算机技术为基础的专用计算机系统,其软硬件可根据需求裁剪。通常用于控制、监视或辅助设备运行,具有实时性、低功耗和高可靠性特点。集成CPU、RAM、ROM、IO控制器等模块于单一芯片,适合低成本简单控制场景。仅含CPU核心,需外接存储和外设,适用于复杂应用(如运行Linux)。存储运行时的变量数据,51单片机片内RAM为256字节。集成于CPU内,支持IEEE 754标准浮点运算。负责数据运算和指令处理,性能直接影响运算速度。专用于图形渲染,性能决定图像处理质量。

2026-01-12 17:54:03 511

原创 HTML入门:从基础结构到表单实战

提供完整的HTML标签参考和交互式示例。

2025-12-30 19:24:55 630

原创 数据库入门:SQLite实战指南

数据库是用于存储和管理海量数据的系统,支持增删改查(CRUD)等操作。其层级结构为:数据库(DB)→ 表(行、列)→ 记录(行)→ 字段(列)。通过上述内容可快速掌握SQLite的基础操作与编程方法。

2025-12-29 18:40:41 595

原创 IO多路复用:高并发核心技术揭秘

IO多路复用是一种单线程或单进程同时监控多个文件描述符(fd)是否可执行IO操作的技术。在TCP服务器中高效处理多个客户端请求。对多个可能阻塞的设备进行IO操作,优先处理数据就绪(可读/可写)的设备。

2025-12-28 17:50:00 664

原创 网络协议分析:从MAC到TCP的奥秘

位于数据链路层,包含源MAC地址和目标MAC地址,用于局域网内设备间的直接通信。无连接协议,头部简单,仅包含源端口、目标端口、长度和校验和,不提供可靠性保证。

2025-12-25 19:20:20 858 1

原创 CS与BS模型对比:协议、功能、资源全解析

CS模型客户端通常承担更多逻辑处理(如本地计算、缓存),功能更复杂。BS模型将主要逻辑放在服务器端,客户端功能简化,适合轻量级应用。节点既是客户端也是服务器。例如下载工具中,初始阶段从其他节点获取数据(作为客户端),下载进度提升后为新节点提供数据(作为服务器)。CS模型可使用自定义协议或标准协议(如FTP、SMTP),灵活性高。BS模型通过浏览器作为通用客户端,无需安装额外软件,跨平台兼容性更强。BS模型的资源完全由服务器动态提供,客户端仅负责展示。网络规模越大,可用资源越多,适合文件共享、区块链等场景。

2025-12-24 19:02:38 924

原创 OSI与TCP/IP:网络协议栈深度解析

【代码】OSI与TCP/IP:网络协议栈深度解析。

2025-12-23 19:51:25 862

原创 信号VS共享内存:进程通信谁更强?

信号是Linux系统中用于异步通信和事件通知的机制,适用于随机事件处理。信号适合轻量级事件通知(如进程终止);共享内存适合大数据量交换(如图像处理)。内核收到信号后暂停进程当前执行流,跳转到注册的处理函数,完成后恢复原流程。共享内存无读写阻塞,需搭配信号/信号量实现同步;信号处理可能被中断。共享内存数据持久化直至显式删除;信号仅传递事件无数据存储。通过合理选择机制,可高效实现进程间协作与数据交互。信号是异步事件通知,共享内存是同步数据共享。

2025-12-21 23:00:45 509

原创 进程间通信IPC机制全解析

进程空间独立,但实际应用中存在数据共享或交互需求,因此需要IPC机制。IPC方式多样,根据场景选择合适方法。

2025-12-18 20:16:39 711

原创 Linux线程:轻量高效但需谨慎

Linux线程是轻量级进程(LWP),属于某个进程并共享其资源(如内存),但各自拥有独立的栈区。相比进程,线程的优势在于创建开销小(仅需分配8MB栈区,而进程需3GB空间)、并发度高,但稳定性较差——一个线程崩溃可能导致整个进程退出。

2025-12-17 18:31:33 630

原创 Linux线程操作全指南

线程与进程对比线程是轻量级进程,属于某个进程,共享进程资源但拥有独立栈区(默认8MB)。进程资源独立,稳定性更高;线程崩溃可能导致整个进程崩溃。线程创建开销更小(仅需分配栈区),并发度高于进程。

2025-12-16 18:53:01 531

原创 掌握exec族函数:进程替换核心技巧

exec族函数用于执行系统中的可执行文件,通常与fork配合使用。fork创建子进程后,子进程调用exec执行新程序。调用exec后,进程的代码段会被新程序替换,新程序执行完毕后进程结束。若需调用当前可执行程序,所有函数均需传入完整路径(

2025-12-15 18:31:42 656

原创 父子进程关系与终止机制详解

系统调用创建,是父进程的副本。现代Linux内核(如Ubuntu 18的Linux 5.4)采用写时复制(Copy-On-Write, COW)技术:子进程初始共享父进程的内存空间,仅当任一进程尝试修改共享数据时,内核才会为子进程分配独立的内存副本。这优化了性能,避免了不必要的内存复制。长期运行的父进程若频繁创建短生命周期子进程,可能导致系统资源耗尽。子进程终止后,其PCB(进程控制块)未被父进程回收(通过。父进程先于子进程终止时,子进程被。进程(PID 1)接管,由。→ 刷新缓冲区 → 执行。

2025-12-14 19:14:36 729

原创 程序与进程:解密运行背后的奥秘

是程序执行的动态实例,包含内存分配、CPU调度等资源管理。通过上述机制,操作系统实现多进程的高效管理和资源分配。是静态存储在硬盘上的代码和数据集合。

2025-12-11 19:53:42 649

原创 掌握readdir与Makefile核心技巧

功能从目录流中读取文件信息,返回一个包含文件信息的结构体指针。若读取到目录流末尾或出错则返回NULL。参数:通过打开的目录流指针。返回值:包含文件名、inode号等信息的结构体指针。需注意后续调用会覆盖该结构体内容,如需保留需手动复制。示例代码片段功能关闭已打开的目录流对象,释放相关资源。参数:需关闭的目录流指针(通常为的返回值)。返回值成功返回0,失败返回-1并设置。注意事项重复关闭同一目录流会导致未定义行为。典型错误处理方式:基础语法结构目标文件: 依赖文件[TAB]编译命

2025-12-10 19:18:58 299

原创 标准IO函数全解析:从读写到缓冲机制

标准IO函数提供带缓冲区的文件操作接口,分为输入/输出、文件定位等类别,适用于跨平台开发。以下分类说明核心函数及缓冲机制。标准IO函数提供带缓冲区的文件操作接口,分为输入/输出、文件定位等类别,适用于跨平台开发。以下分类说明核心函数及缓冲机制。

2025-12-09 20:55:13 1375

原创 Linux文件操作:标准IO与7种文件类型详解

系统编程,会学习到大量的函数(有linux系统提供的函数)文件操作相关内容,对文件的内容进行读写操作。Linux中文件的类型,7种。

2025-12-08 18:09:55 608

原创 树与哈希:数据结构核心解析

【代码】树与哈希:数据结构核心解析。

2025-12-05 20:17:31 764

原创 深入解析队列:从概念到实战应用

队列是一种遵循先进先出(FIFO)原则的线性数据结构,分为顺序队列和链式队列两种实现方式。顺序队列使用数组实现,通过头尾指针管理元素,循环队列是其优化版本,通过取模运算避免指针越界。链式队列采用链表实现,适合动态数据场景。队列操作包括创建、销毁、入队、出队及判空/满等,广泛应用于任务调度、消息队列和广度优先搜索等场景。循环队列适合固定缓冲区,链式队列适合动态数据集。

2025-12-04 17:26:26 437

原创 深入解析栈:数据结构与系统栈

系统栈,是0-3G内存中的一段(8M),存储函数的调用关系,局部变量,参数,返回地址。定义:栈是限定仅在表尾进行插入和删除操作的线性表。数据结构栈,内存空间在堆空间开辟。应用:递归,回溯问题,和优先级有关的问题。区别:数据结构中的栈和系统中栈的关系。特性:先进后出,后进先出。指针指向的地址,是最后入栈的元素的位置。指针指向的地址,是新元素待插入的位置。栈底:不允许操作的一端。增栈,新增元素元素后。指向的内存地址慢慢变大。减栈,新增元素元素后。指向的内存地址慢慢变小。栈顶:允许操作的一端。

2025-12-03 19:46:28 484

原创 Linux开发必备:GDB调试4大技巧

Gdb 调试器,检查程序的逻辑错误gnu debugger。Linux软件开发人员,必须会的4个工具。Gcc编译器,把源文件转换为可执行程序。如果你的程序需要命令行参数时候。如果你的程序需要命令行参数时候。进入函数体一步运行,只进入自定义函数。Vim linux下,文本编辑器。Makefile 工程管理工具。当前代码中,是否有函数调用。

2025-12-02 18:55:51 783

原创 单向链表:高效解决动态存储难题

特点:线性表链式存储结构的特点是一组任意的存储单位存储线性表的数据元素,存储单元可以是连续的,也可以不连续。所以前面的顺序表只需要存储数据元素信息就可以了。在链式结构中还需要一个元素存储下一个元素的地址。外,还需要存一个指示器直接后续的信息。把存储元素信息的域叫数据域,把存储直接后继位置的域叫指针。这个函数的功能是查找要给用户,在设计函数的时候,希望查找功能,可以按照不同的条件进行查找。解决顺序存储的缺点,插入和删除,动态存储问题。尾插,新节点是链表中的最后一个有效元素。来说,除了存储其本身的信息。

2025-12-01 19:15:28 999

原创 高效存储:数据结构与算法实战

存储什么类型的数据,都是可以的。具体体现,C语言中,出现在.h中的内容。数据元素:描述一个相对完整的一个事物,就会有很多的属性,这里的属性被称为数据项。算法:是解决特定问题求解步骤的描述,计算机中表现为指令的有限序列,每条指令表示一个或多个操作。广义:如何把数据高效的存储在计算机内存中,方便后续的使用(增删改查)。数据:可输入、输出,还提供基本的操作。定义:相互之间存在一种或多种特定关系的元素的集合。逻辑结构:从人的思维角度去分析数据与数据的关系。数据对象:是数据元素的集合。线性表的内存空间都在对空间。

2025-11-28 17:46:13 625

原创 C语言联合体与枚举实战指南

使用完毕后,不释放空间,导致可用空间越来越少,最终内存泄露。程序因申请不到内存,最终异常退出。指的是二进制位操作,操作对象是整形的变量。约定变量的取值范围。,后面枚举值就在前一个值的基础上。应用:多用于一些硬件寄存器操作。如果没有指定值的那么它的值就是。也可给每个枚举值赋新值进去。

2025-11-25 17:28:42 491

原创 万能指针void*

解引用,void*再赋值后,存储的是对象的地址。没有办法执行*(解引用操作,因为没有void类型的变量)从void*到其他类型(int*,char*,double*...)需要强制转换,才可以使用。任意类型到void*,直接复制就可以,不需要其他的操作。结构体指针变量,访问成员变量的时候,使用。Void*,本质:存储一个变量的地址。结构体变量,范围跟成员变量的时候使用。运算符,就是表达式,类型是成员变量(运算符,就是表达式,类型是成员变量(用途:函数的参数,函数的返回值。目的:为了cpu高效的读写内存。

2025-11-24 20:05:45 909

原创 指针数组与数组指针深度解析

一维数组的数组名是,指向第一个元素的指针,数组名+1,步进值是sizeof(基类型)的大小。二维数组的数组名是,第一行第一个元素的地址。数组名+1,步进值是一行的大小。对一维数组的数组名&:值不变,类型就升级为数组指针,第一。*,地址值不变,类型就会降级,指向数组中第一。指针,主要是用来访问数据。指针数组,数组,元素 是指针。数组,主要是用来存储数据。

2025-11-21 17:37:27 270

原创 深入解析C语言指针与函数

应用,降低耦合度,增加灵活性,在代码开放阶段,函数需要执行的功能,不确定。这里的add,sub,会在程序运行起来后,根据不同情况会被调用,add,sub被称为回调函数。1. 加static;2. 改成全局变量;二级指针变量中存储是一个地址,在解引用后,存储的还是一个地址。不能返回栈上的变量和地址,(局部变量),如果返回局部变量,做如下调整。应用,在被调函数中,需要修改指针的方向。被const修改的变量,称为只读变量。函数指针:本质是一个指针,指针指向了一个函数。指向指针变量的指针。typedef 别名。

2025-11-20 18:34:32 779

原创 指针传参:值传递与地址传递详解

注意:如果传递的是一个字符串数组的话,那被调函数在设计的时候,就只需要一个指针接受实参传递的数组名,不需要第二参数(长度)。原因是C语言规定字符串都是以‘\0’结尾。数组名的类型可理解为 int *(除下面的3个区别外)数组的组名是指向第一个元素的指针常量。Int[ ] 和 int*字符数组和字符串的传递。

2025-11-19 18:29:40 492

原创 指针精髓:高效访问与底层操作

iii. 所有的指针都是8个字节(64bit),不论什么类型。2. 根据类型,sizeof(基类型),从首地址开始,加上sizeof(基类型)大小后,再取出内存中的数据;i. 再解引用操作过程中,和指针的类型有关,会从首地址开始,加上sizeof(基类型)大小后,再取出内存中的数据。//int*,相当于变量类型升级,升级为对应基类型的指针。a) &:取地址运算符,获得对应变量的内存的首地址(在内存中存储这个变量的起始的内存编号);指针算术运算: + , - , ++ , --

2025-11-18 17:24:16 807

原创 递归函数及预处理操作

函数自己调用自己本身的,被称为函数的递归。带参宏的表达式中,能被圆括号括起来的,都括起来。宏定义:#define PI 3.14。应用:回溯类型,逆向思维。

2025-11-17 18:17:41 530

原创 变量作用域与存储类型

3. 函数在被定义后,默认是全局作用域,意味着在本工程中所有的源文件都可以使用,访问。在函数前加static修饰,将会限定函数只能在本源文件中使用或调用。1. 在函数内部 局部变量前加static关键字修饰。那么这个变量,生命周期为全局生命周期(从程序开始运行就存在,在程序结束才释放)。将会限定变量的作用域只能在本源文件中使用,其他的源文件不能访问。值传递,实参会把自己的内容复制一份给形参。地址传递:可以读出实参的内容,也可以修改实参的内容。在被调函数中,不能修改实参。只需要读实参的内容。

2025-11-14 19:15:12 319

原创 掌握二维数组

如果函数的定义,需要放在本函数被调用地方的后面,那么这个函数需要先声明,声明不包含函数体,只包含函数头,起到一个说明的作用,告诉编译器,告诉函数参数类型,个数,返回值。调用函数过程中,需要传递参数,参数类型最好一致,如果不一致,至少也要能隐式转换,否则函数调用就失败。被调函数,被主调所调用的函数,被称为被调函数,执行到return ,就要回到主调的地方。主调函数,主动调用别的函数的的函数,被称为主调函数main();传递参数的过程中,实参的参数需要和形参参数的类型对应,名字可以不一样。

2025-11-13 18:33:13 161

原创 二分查找与字符数组实战指南

二分查找是一种高效的查找算法,适用于已排序的数组。

2025-11-12 17:59:31 307

原创 数组的排序

1. 冒泡排序:相邻元素比较大小;外层循环走一次,会找到本次最大值。2. 选择排序:依次比较;外层循环运行一次,最小放在数组前面。排序:把数组编程,一个有序的序列,方便后续的查找。3. 插入排序:把待插入元素放入,一个有序序列中。

2025-11-11 18:10:26 119

【中文】【吴恩达课后编程作业】Course 1 - 神经网络和深度学习 - 第四周作业(1&2)_https___blog.csdn.net_u013733326_article_details_7-CSDN博客.pdf

【中文】【吴恩达课后编程作业】Course 1 - 神经网络和深度学习 - 第四周作业(1&2)_https___blog.csdn.net_u013733326_article_details_7-CSDN博客.pdf

2023-10-13

空空如也

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

TA关注的人

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