自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 PWM学习PWM+SG90

SG90舵机接受固定周期、可变脉宽5V(扩展板提供)​固定周期​:始终20ms(50Hz)​可变部分高电平持续时间线性关系:高电平时间 ∝ 舵机角度角度脉冲宽度占空比说明0°500μs2.5%最小位置45°1000μs5.0%四分之一90°1500μs7.5%中心位置135°2000μs10.0%四分之三180°2500μs12.5%最大位置黄、红、棕三根线分别对应:PWM信号线、5V电源线、GND线。

2025-12-05 20:07:39 727

原创 DOCKER打包制作ARM64交叉编译环境,安装蓝牙库等

本文介绍了使用Dockerfile构建ARM64交叉编译环境的完整过程。首先基于Ubuntu 24.04镜像,配置清华APT源并安装必要的交叉编译工具链。在编译过程中发现缺少nlohmann/json库和ARM64版libbluetooth-dev库,通过下载deb包并解压到正确路径解决了依赖问题。验证了生成的二进制文件确实为AArch64架构,最后将完整的编译环境打包为tar.gz文件进行备份和恢复测试,确保所有工具和库文件都能正确保存。整个过程展示了Docker在构建跨平台开发环境中的应用,以及处理交叉

2025-11-28 18:22:06 449

原创 三、memblock 内存分配器

本文详细介绍了Linux内核启动初期的内存管理机制——memblock分配器。在完整内存管理系统初始化前,memblock作为临时管理器负责记录可用物理内存(memory区域)和已分配内存(reserved区域)。文章阐述了memblock的数据结构、初始化流程(通过e820表获取物理内存信息)、内存分配/释放机制,以及如何与后续的Buddy System和Slab分配器进行交接。memblock采用分区管理策略,通过简单高效的算法实现早期内存分配,为内核启动提供关键的内存管理支持。

2025-08-16 21:29:40 723

原创 一、内核初始化中与内存管理相关的函数

本文梳理了Linux内核启动过程中内存初始化的关键流程。首先分析了start_kernel函数中的内存初始化步骤,包括早期基础设施、分配器核心和后期初始化三个阶段。重点剖析了setup_arch函数,详细说明其四个阶段:早期环境准备与内存探测、关键内存区域保留、memblock初始化及高级内存管理。最后总结了从BIOS E820到memblock再到伙伴系统的整体数据流向,并列举了物理内存探测、内存保留、NUMA配置等核心API。文章通过流程图和代码注释的方式,完整呈现了Linux内核内存子系统的初始化过程

2025-08-16 11:23:19 855

原创 二、DOCKER常用命令

Docker核心指令摘要:Dockerfile常用指令包括FROM(基础镜像)、RUN(执行命令)、COPY/ADD(文件复制)、CMD/ENTRYPOINT(启动命令)等基础指令;ENV(环境变量)、ARG(构建变量)、EXPOSE(端口声明)等环境配置指令;以及VOLUME(挂载点)、USER(用户设置)等资源管理指令。Docker常用操作涵盖镜像管理(pull/build/rmi)、容器操作(run/exec/logs)、网络管理(network)、数据卷管理(volume)和系统维护(prune/i

2025-08-15 21:42:53 893

原创 一、Docker本地安装

本文介绍了在Ubuntu系统上安装和配置Docker的详细步骤。首先指出服务器虚拟化与容器技术的区别,然后提供了从官方源下载安装Docker引擎、CLI及相关组件的具体方法。针对国内用户可能遇到的镜像拉取问题,给出了配置多个国内镜像源的解决方案,包括创建daemon.json文件和添加多个加速地址。最后通过运行hello-world镜像验证安装成功,并展示了如何检查镜像是否正常拉取。文章内容实用,解决了Docker安装过程中的常见问题,特别是针对国内网络环境提供了有效的优化方案。

2025-08-15 21:42:00 515

原创 二、linux内存管理学习(1):物理内存探测

本文分析了Linux内核的内存管理初始化过程。在内存探测阶段,通过e820__memory_setup()从BIOS获取原始E820表,构建主表、kexec表和firmware表,并处理BIOS表128条目的限制问题。物理内存整理阶段包括:解析早期参数(parse_early_param)、保留setup_data区域(e820__reserve_setup_data)、确保内核区域被标记为RAM(e820_add_kernel_range),以及确定物理内存边界(e820__end_of_ram_pfn)

2025-08-14 23:38:37 1227

原创 PCIe BAR 0- BAR 15含义

本文介绍了PCI设备资源编号(BAR0~BAR15)的内核定义。标准PCI设备使用BAR0~BAR5作为I/O或内存映射资源,BAR6用于可选扩展ROM。支持SR-IOV的设备额外使用BAR7~BAR12作为虚拟功能资源。PCI桥接器则使用BAR13~BAR16作为桥接窗口资源。根据设备类型不同,普通PCI设备最多使用6个BAR,SR-IOV设备可达13个,桥接器设备则使用4个BAR。这种分层设计确保了不同类型PCI设备的资源能够被统一管理和正确分配。

2025-08-10 11:22:11 1054

原创 VSCODE+GDB+QEMU调试内核

本文介绍了在VSCODE中配置Linux内核调试环境的方法。首先需要确保已搭建好QEMU和内核编译环境,包括kernel、initramfs等组件。然后通过生成compile_commands.json文件,配置launch.json调试参数,建立与QEMU的GDB连接。调试时可在kernel_init、acpi_init等关键函数设置断点,利用continue、stepover、stepinto等调试功能单步执行代码,并可查看变量值和执行堆栈,实现内核代码级的调试分析。

2025-08-10 10:51:12 448

原创 Busybox编译、制作initramfs,并在QEMU中运行

本文详细记录了编译BusyBox并制作initramfs镜像的过程。首先下载BusyBox源码后,通过make menuconfig配置静态编译选项,使用多线程编译生成静态链接的busybox可执行文件。随后创建initramfs目录结构,编写init启动脚本挂载proc文件系统并设置Shell提示符。最后通过find|cpio|gzip命令链将文件打包成压缩的initramfs.img镜像,配合编译好的Linux内核bzImage,在QEMU虚拟机中成功启动并显示自定义Shell环境"Zenus

2025-08-09 23:05:01 675

原创 使用qemu运行与GDB调试内核

本文介绍了Linux内核调试环境的搭建过程。首先需要准备bzImage内核镜像、gdb和QEMU工具,并具备内核编译和制作initramfs的基础知识。内核编译时需开启调试选项,生成包含调试信息的vmlinux文件。使用QEMU运行内核时,通过"-S -s"参数开启GDB调试服务器,并禁用地址随机化(nokaslr)。最后给出了一个完整的Makefile示例,包含initramfs制作、内核镜像复制和QEMU启动命令,其中QEMU参数设置了512MB内存、串口输出和调试选项。调试时可通过

2025-08-09 23:01:27 337

原创 PCIe RAS专题学习(4):DPC流程梳理

PCIe DPC(下游端口遏制)机制分析 摘要:本文详细分析了PCIe规范中的DPC功能实现机制。DPC是一种可选功能,用于在检测到不可纠正错误时隔离下游端口并支持软件恢复。关键点包括:1) 触发条件包括未屏蔽错误或ERR_FATAL消息;2) 触发后硬件自动禁用链路并记录错误源;3) 软件需等待链路完全禁用后清除状态位;4) 恢复流程需重新训练链路。文章还剖析了Linux内核中的DPC实现逻辑,包括初始化、中断处理、错误解析和链路恢复等关键流程,并分析了三种典型错误场景的处理差异。DPC机制通过硬件错误隔

2025-07-20 12:47:13 1615

原创 PCIe RAS学习专题(3):AER内核处理流程梳理

本文分析了Linux内核中PCIe高级错误报告(AER)驱动的关键处理流程。AER驱动作为PCIe端口服务模块注册到portdrv_core,主要处理根端口和RCEC设备的错误事件。核心流程包括:1) 中断处理分为上下半部,上半部快速读取错误状态并存入FIFO,下半部通过aer_isr_one_error分类处理可纠正/不可纠正错误;2) 错误定位通过find_source_device在设备树中搜索错误源;3) 错误恢复采用分级策略,通过pcie_do_recovery函数按严重程度执行不同恢复流程,包括

2025-07-19 23:24:24 1239

原创 PCIe RAS专题学习(2):高级错误报告(AER)流程及相关寄存器

本文详细介绍了PCIe高级错误报告(AER)机制的处理流程及相关寄存器配置。主要内容包括:1. 错误处理流程:从错误检测、中断触发到错误源定位的完整处理链条,通过根端口状态寄存器确定错误类型,再结合错误源识别寄存器定位具体设备;2. 关键寄存器组:包括可纠正/不可纠正错误状态寄存器、错误屏蔽寄存器、头标日志寄存器等,支持错误类型记录、严重性配置和错误报文捕获;3. 根端口专用寄存器:提供错误消息接收状态、中断控制、错误源定位等功能,特别强调TLP前缀日志寄存器对错误分析的辅助作用。该机制通过分层记录和标准化

2025-07-19 11:00:14 1437

原创 PCIe RAS专题学习(1) -- PCIe错误处理机制与流程

本文介绍了PCIe的错误处理机制与流程。PCIe规范定义了基础错误报告和高级错误报告(AER)两种机制,将错误分为可纠正错误和不可纠正错误(非致命/致命)。PCIe采用分层检测机制,包括物理层CRC校验、数据链路层错误检查等,并建立错误污染机制确保只报告最严重错误。错误上报通过完成包、中毒数据包和错误消息三种方式实现。文章还详细阐述了建议性非致命错误机制及不可纠正/可纠正错误的处理流程,包括错误状态寄存器设置、掩码检查等步骤。

2025-07-19 10:40:36 1583

原创 PCIe RAS学习专题(5):热插拔内核处理流程

摘要: 本文详细分析了Linux内核中PCIe热插拔服务的实现机制。系统启动时通过pcie_portdrv_init注册热插拔服务,初始化流程包括控制器设置、中断注册和状态机建立。热插拔处理采用两阶段中断模型:顶半部pciehp_isr快速响应并标记事件,底半部pciehp_ist处理具体操作。重点分析了按钮事件、电源故障、禁用请求和状态变化四种核心场景的处理逻辑,其中按钮事件采用5秒延时确认机制,状态变化需同步检测在位信号和链路状态。该实现通过多级状态机(OFF/ON/BLINKING等)和精细的锁机制确

2025-06-15 12:46:21 447

原创 Linux学习笔记:PCIe内核篇(1):初始化与枚举流程

摘要:Linux内核5.15.0中PCIe加载流程分为设备扫描和资源分配两阶段。首先通过acpi_init()初始化ACPI子系统,解析MCFG表获取ECAM资源,随后调用pci_acpi_scan_root()创建根总线并递归扫描设备(包括桥接器)。资源分配阶段通过pci_assign_unassigned_root_bus_resources()完成,包括调整桥资源大小、排序分配资源,并更新桥设备配置空间。整个过程呈现深度优先的拓扑遍历特征,涉及60余个关键函数调用,最终构建完整的PCIe设备树结构。(

2025-06-14 21:13:46 481

原创 PERST#、Hot Reset、Link Disable

PCIe设备复位机制主要有三种:PERST#(冷复位)由主板发起,全局复位设备硬件状态,适用于上电或硬重启场景;HotReset(热复位)通过软件或链路协议触发,局部复位设备功能,用于动态恢复无响应设备;LinkDisable则通过禁用链路进入节能或调试状态。三者区别在于复位范围(全局/局部/单链路)、触发源(硬件/软件/固件)和应用场景(初始化/错误恢复/节能)。PERST#需重新训练链路,HotReset保持物理层活动,LinkDisable需重新使能链路。

2025-06-12 21:10:41 802

原创 OSI 网络七层模型中的物理层、数据链路层、网络层

OSI七层模型的前三层构成网络通信基础架构:物理层传输原始比特流(0和1),使用集线器等设备;数据链路层通过帧传输实现设备间可靠通信,采用MAC地址和CRC校验,涉及交换机等设备;网络层通过IP地址和路由实现跨网络通信,处理分片重组,由路由器完成。这三层分别解决物理连接、直接设备通信和跨网络路由问题,形成网络传输的核心支撑体系。

2025-05-20 15:22:09 725

原创 Linux系统启动相关:vmlinux、vmlinuz、zImage,和initrd 、 initramfs,以及SystemV 和 SystemD

本文介绍了Linux内核启动相关的关键概念和组件。主要内容包括:1. 不同内核镜像格式的区别(vmlinux、vmlinuz、zImage、bzImage、uImage);2. initrd和initramfs的对比,详细说明了两者的工作机制和现代Linux系统更倾向于使用initramfs的原因;3. SystemV和SystemD两种init系统的核心差异;4. 内核启动流程中根文件系统挂载的关键步骤,包括如何处理initramfs/initrd以及不同init系统(/init文件)在启动过程中的作用。

2025-05-16 19:51:34 1699

翻译 Linux学习笔记:PCIe协议篇(6)---LTSSM(5)-- Recovery、Hot Reset

如果一切按预期工作,链路将直接训练至L0状态而无需进入Recovery状态。但正如之前讨论的,有两种情况可能导致进入Recovery状态:首先,如果在Configuration.Idle阶段未检测到正确的Symbol模式,LTSSM将进入Recovery状态,通过调整均衡值(Equalization)等措施尝试修正信令问题;其次,当Link以2.5 GT/s速率进入L0状态且两端设备均支持更高速度时,LTSSM会再次进入Recovery状态,尝试将Link速率升级至双方共同支持/通告的最高速度。

2025-05-07 21:19:32 523

翻译 Linux学习笔记:PCIe协议篇(5)---LTSSM(4)-- L0

这是链路正常工作时的完全运行状态。在此状态下,链路邻居之间会交换逻辑空闲(Logical Idle)、事务层数据包(TLPs)和数据链路层数据包(DLLPs)。链路训练过程完成后,链路会立即进入L0状态。此时物理层会通过设置 LinkUp 变量通知上层链路已就绪。同时,idle_to_rlock_transitioned 变量会被清零为 00h。

2025-05-06 22:23:43 302

翻译 Linux学习笔记:PCIe协议篇(4)---LTSSM(3)--Configuration

若某组通道满足:曾发送非PAD链路编号的TS1,且接收到两个连续具有相同链路编号及任意非PAD通道编号的TS1,则应发送匹配该通道编号分配的TS1(若可能实现)。任何收到过至少一个链路和通道编号均为填充符号的 TS1 序列的通道,如果现在收到两个连续的链路编号有效,而通道编号仍然为PAD符号的 TS1,那么 LTSSM 将退出至 Configuration.Linkwidth.Accept 子状态。对未分配链路编号的通道(如仅检测到Receiver但无编号),TS1中链路编号和通道编号均设为PAD。

2025-05-05 21:11:02 373

翻译 Linux学习笔记:PCIE协议篇 (3) -- LTSSM (2):Configuration State

该状态的主要目标是确定端口(Port)的连接方式,并为其分配通道(Lane)编号。例如,可能存在 8 个通道,但只有 2 个处于活动状态;或者通道可以拆分为多个链路(Link),比如两个 x4 链路。与其他状态不同,端口具有基于其面向上游(upstream)还是下游(downstream)的明确角色。因此,对这些子状态的描述将分别针对下游通道和上游通道的行为进行分组说明。DSP(即负责向下游传输数据的端口)在链路初始化过程中扮演“主导者”角色,引导完成后续各状态的处理。

2025-05-05 12:38:25 267

翻译 Linux学习笔记:PCIE协议篇 (2) -- LTSSM(1) : Detect

冷、热复位后,LTSSM 先进入 Detect 状态。链路初始化和训练由硬件自动启动,受 LTSSM 管理。其包含 11 个顶层状态:Detect、Polling、Configuration、Recovery、L0、L0s、L1、L2、Hot Reset、Loopback和Disable。Detect:复位后的初始状态,用于检测链路远端是否存在接收器,也可从其他多个 LTSSM 状态进入。Polling。

2025-05-05 01:26:08 728

翻译 Linux学习笔记:PCIE协议篇(1)--PCIe体系结构概述

(1)设备核心与事务层接口设备核心实现设备的主要功能:若为端点设备,最多可包含8个功能(Functions),每个功能都有独立的配置空间若为交换机,其核心包含数据包路由逻辑和用于实现此目标的内部总线若为根设备,根核心实现虚拟PCI总线0,其上驻留所有芯片组嵌入式端点和虚拟桥接器(2)事务层负责在发送端创建事务层数据包(TLP),在接收端解码TLP还负责以下功能:服务质量(QoS)流量控制事务排序(3)数据链路层。

2025-05-04 12:09:32 455

原创 Linux学习笔记:PCIE协议篇(7)---BAR空间

既然软件已知道这是一个对 256 字节输入输出(IO)地址空间的请求,最后一步就是用分配给该设备(具体来说是这个 BAR)的 IO 地址范围的基地址对该基址寄存器(BAR)进行编程。所有其他高位都清零。当软件确认设备的地址空间需求后(假设可满足该需求),便会从对应类型(IO、非预取MMIO或可预取MMIO)的可用地址范围中分配一段给该设备。本例中,最低有效可写位是第12位,因此该BAR请求的是2^12(即4KB)的地址空间。写入全1的目的是确定最低有效可写位的位置,该位的位置表明了所请求地址空间的大小。

2025-04-27 23:59:39 615

原创 Linux学习笔记协议篇(六):SPI FLASH设备驱动

内存分配:分配spi_nor结构体的内存,并确保在设备释放时自动释放内存。初始化spi_nor结构体设置和nor->dev。调用设置设备节点(如果存在设备树节点)。设置设备名称优先使用平台数据中的name字段。如果name不存在,则从spi_mem获取默认名称。如果平台数据中存在type字段,则优先使用type作为实际芯片名称。扫描 SPI NOR Flash识别制造商 ID 和设备 ID。确定设备的页大小、块大小等特性。

2025-04-21 23:22:36 1346

原创 Linux学习笔记协议篇(五):SPI FLASH控制器驱动

compatibleprobe因此,首先分析imx6ull设备树上存在的QSPI设备。

2025-04-19 14:52:18 1062

原创 Linux学习笔记协议篇(四):SPI通信协议

SPI(Serial Peripheral Interface,串行外设接口)是一种的串行通信协议,由摩托罗拉(现为NXP)提出,广泛应用于微控制器、传感器、存储器等外设之间的短距离通信。SPI通信需要至少4根信号线(标准SPI):信号线名称作用SCLK主设备提供的时钟信号,同步数据传输。MOSI主设备发送数据,从设备接收数据。MISO从设备发送数据,主设备接收数据。SS/CS主设备控制从设备的片选信号(低电平有效)。

2025-04-16 21:24:03 749

原创 Linux学习笔记协议篇(三):I2C内核子系统分析(下)

方法时,优先调用总线级别的probe函数(dev->bus->probe),如果没有总线probe,则调用驱动自己的probe函数(drv->probe),控制适配器(imx主机)和客户机(mag3110从机)实现I2C通信,传输数据以实现功能。遍历现有 I2C 适配器,立即处理可能匹配的设备(而非等待热插拔事件)。(2)若驱动声明支持异步探测(probe),通过。下的文件时,内核会自动调用对应的函数(如。扫描所在总线上的设备,匹配后调用驱动的。即扫描所在总线上的设备,匹配后调用驱动的。

2025-04-12 20:23:57 515

原创 Linux学习笔记协议篇(二):I2C内核子系统分析(上)

主机、从机、以及主机和从机之间一系列操作的集合Linux系统中,根据Linux设计的软硬件分离思想,当硬件发生变化时,上层的控制逻辑需要保持不变。

2025-04-11 23:33:39 1061

原创 Linux学习笔记协议篇(一):IIC通信原理

仲裁可以持续多位,它的第一个阶段是比较地址位,如果每个主机都尝试寻址相同的器件,仲裁会继续比较数据位(如果是主机-发送器),或者比较响应位(如果是主机-接收器)主机只能在总线空闲的时侯启动传输,两个或多个主机可能在起始条件的最小持续时间内产生一个起始条件,结果在总线上产生一个规定的起始条件。因为I2C总线的地址和数据信息由赢得仲裁的主机决定,在仲裁过程中不会丢失信息,丢失仲裁的主机可以产生时钟脉冲直到丢失仲裁的该字节末尾。(4) 根据地址字节中的方向位,确定的数据发送方(发送器)(2)主机发送一个字节的。

2025-04-09 22:58:09 875

原创 Linux学习笔记(四):Linux启动从kernel_init到kernel_execve切换到用户态init进程

在完成这些基础初始化后,start_kernel()会调用rest_init()函数进行最后的启动准备。在Linux内核启动过程中,当进入C语言执行阶段后,系统会调用start_kernel()函数进行核心初始化。这三种方式按照优先级依次尝试,只有当高优先级方式不可行时才会尝试下一级方式,最终确保系统总能启动一个用户空间进程。这些进程的创建标志着内核从初始化阶段转入正常运行阶段,开始提供完整的操作系统服务。

2025-04-07 22:52:01 772

原创 Linux学习笔记(三):Linux启动从rest_init 到 kernel_init创建1号进程(上)

在 kernel_clone --> copy_process 的调用.flags=CLONE_VM|CLONE_FS|CLONE_UNTRACED,表示此时子进程与父进程共享文件系统信息,以及共享内存空间。:如果子进程和父进程属于同一个线程组(CLONE_THREAD被设置),那么子进程必须共享父进程的信号(CLONE_SIGHAND被设置)。如果创建的是线程,直接返回0。如果子进程共享父进程的信号,那么必须同时共享父进程的内存描述符和所有的页表(CLONE_VM被设置)。

2025-04-06 02:10:12 1048

原创 Linux学习笔记(二):Linux启动第二阶段---从start_kernel到rest_init创建1号2号进程概述

先创建一个1号进程和2号进程,用作用户态进程的祖先和内核态进程祖先,以及管理用户态和内核态进程,同时开启调度系统并创建一个空闲进程。循环调用do_idle() ,是 Linux 内核空闲任务(idle task)的核心实现,是 CPU 空闲时执行的低功耗循环,主要职责:在无任务可调度时进入低功耗状态;此时kernel_init函数运行在内核态,后续通过execve系统调用实现态切换,从原内核线程转变为用户空间init进程,是用户态所有进程的祖先。负责所有内核进程的调度和管理,是内核所有进程运行的祖先。

2025-04-05 14:00:20 632 1

原创 Linux学习笔记(一):Linux启动第一阶段---Head.S汇编阶段(硬件环境准备)

参考代码:linux-6.6.10

2025-04-04 14:08:51 1014

原创 UBOOT学习笔记(七):UBOOT启动--从main_loop()到跳转到kernel入口点(UBOOT完结篇)

第78-84行do_bootm_states:调用do_bootm_states执行各个BOOT 阶段–BOOTM_STATE_OS_PREP 、BOOTM_STATE_OS_FAKE_GO 和BOOTM_STATE_OS_GO。**第534-551行,**调用bootm_start、bootm_find_os、bootm_find_other、bootm_disable_interrupts、bootm_load_os等,start 和 end这两个指针,用于存放解析出的内核映像的起始和结束地址。

2025-03-30 22:25:00 854

原创 UBOOT学习笔记(六):UBOOT启动--CPU架构及板级初始化阶段

考虑到以上情况,uboot的relocation动作会把自己本身relocate到ddr上(前提是在SPL的过程中或者在dram_init中已经对ddr进行初始化了),并且会relocate到ddr的顶端地址使之不会和kernel的冲突。(1)CPU 和基础外设初始化(初始化 CPU、时钟、串口、定时器等基础硬件)→ arch_cpu_init、timer_init、serial_init。ldr r0, =(CONFIG_SYS_INIT_SP_ADDR) 加载主 U-Boot 的默认栈地址到 r0。

2025-03-30 15:55:25 1164

原创 UBOOT学习笔记(五): UBOOT汇编启动阶段

根据u-boot.lds可以了解到,所有程序的入口点都是 _start 符号, _start 位于u-boot-2020.01/arch/arm/lib/vectors.S函数里:具体代码如下:因此,可以看出当发生复位时,硬件会自动跳转到_start地址,然后根据向量表执行b reset,进入reset处理函数(在start.S中定义)reset函数是U-Boot启动过程中最先执行的代码,负责将系统从硬件复位状态初始化到可以运行C代码的环境。下面我将详细分析reset函数的功能和执行流程。其中:提供

2025-03-29 23:46:25 1150

空空如也

空空如也

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

TA关注的人

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