自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 lspci/setpci用法小结

本文介绍了Linux系统中用于管理PCI设备的三个实用工具:lspci、setpci及其常见用法。lspci用于显示系统PCI设备信息,支持多种输出模式(-v详细模式、-t树状显示、-x十六进制配置空间等)和筛选选项(-s按设备地址筛选、-d按厂商/设备ID筛选)。setpci可读写PCI配置寄存器,支持-s指定设备地址、-d过滤设备ID等操作,常用于硬件调试和配置修改。文章通过具体示例展示了如何查询设备信息、分析拓扑结构、读取/修改寄存器值等操作,为系统管理员和开发者提供了实用的PCI设备管理参考。

2025-07-22 09:36:38 1025

原创 LINUX系统下的PCIe常见问题定位总结

该故障的原因也有很多,比如真正的热插拔,或者插槽松动引起的Linkdown,误码过多引起的Linkdown,还有软件配置了Link Control Register中的Link Disable导致的Linkdown等等都有可能。上图是EP的配置空间,如果这里红框中的speed和蓝框中speed需要对应的话,那这会儿的建链是有问题的,需要确认为什么speed明明支持到8G/s(GEN3)但是当前只建链到2.5Gb/s(GEN1)。没有列出的,笔者暂时没有遇到过,还不太清楚问题出现原因,就不单独描述了。

2025-07-22 09:17:45 1323

原创 PCIe枚举知识

摘要:本文详细介绍了PCIe设备的枚举流程及相关概念。主要内容包括:1.枚举先验知识,如设备在位判断、配置空间数据来源、BDF号与硬件关系等;2.设备扫描过程,采用深度优先算法,从根总线开始逐级扫描下游设备;3.BDF号组成及编号规则;4.Linux内核中的枚举流程入口;5.交换配置注意事项;6.故障定位手段,包括BIOS、lspci、dmesg等工具的使用。重点解析了PCIe点对点结构与总线模型的区别,以及桥设备在枚举过程中的关键作用。

2025-07-22 09:10:03 762

原创 PCIe之P2P应用

也就是说,该访问请求绕过了IOMMU的隔离,进行了P2P(peer to peer)传输。GPUDirect RDMA 通过绕过主机内存和 CPU,直接在 GPU 和 RDMA 网络设备之间进行数据传输,显著降低传输延迟,加快数据交换速度,并可以减轻 CPU 负载,释放 CPU 的计算能力。GPU Direct是NVIDIA开发的一项技术,利用PCIE交换实现GPU与其他设备(比如网络接口卡(NIC)和存储设备)之间的直接通信和数据传输,而不涉及CPU,从而减少不必要的内存和CPU开销,从而显著提升性能。

2025-07-22 09:02:22 1108

原创 PCIe的DPC

DPC(Downstream Port Containment)是一种用于处理PCIe链路中错误情况的机制。当PCIe链路上的一个设备发送错误信号的时候,。DPCDPC是Downstream Port的一个可选的规范特性。当在端口或端口以下检测到时,DPC会停止Downstream Port下方的PCI Express流量,避免任何数据损坏的潜在传播。Downstream Port通过实现一个DPC Extended Capability Struct对DPC的支持,该结构包含所有DPC控制和状态位。

2025-07-22 08:49:05 1115

原创 PCIe中的AER

PCIe AER(高级错误报告)机制详解 PCIe AER机制是一种用于检测和报告设备错误的系统,分为不可纠正(Uncorrectable)和可纠正(Correctable)两类错误。不可纠正错误包括数据链路协议错误、意外关闭错误等严重故障,可能导致链路不可用;可纠正错误如接收错误、重放超时等可通过协议机制恢复。AER通过专用寄存器记录错误信息,并支持通过中断通知系统。在Linux中,AER驱动负责初始化中断、配置寄存器并处理错误事件,针对不同严重程度的错误采取相应的恢复措施,从简单的状态清除到完整的链路重

2025-07-22 08:46:39 1343

原创 KEIL5使用CubeMX配置的FreeRtos编译报错:error: unknown type name ‘__forceinline’ note: expanded from macro‘port

将 项目文件夹\Middlewares\Third_Party\FreeRTOS\Source\portable\RVDS\ARM_CM4F中的所有文件用CUBEMX固件库所在文件夹\Repository\STM32Cube_FW_F4_V1.27.0\Middlewares\Third_Party\FreeRTOS\Source\portable\GCC\ARM_CM4F中的所有文件替换。按照AI的提示,是需要更换compiler6为compiler5,但是我的5是不可用的,因此需要寻求其他的办法。

2025-07-19 19:49:08 262

原创 PCIe基础知识之Linux内核中PCIe子系统的架构

摘要:Linux PCIe驱动框架采用总线-设备-驱动模型,通过总线进行设备与驱动的匹配。PCIe控制器使用platform总线模型,设备和驱动分别为platform_device和platform_driver。驱动初始化过程包括解析设备树、分配pci_host_bridge结构、硬件配置和中断处理设置。PCIe支持两种中断方式(Legacy和MSI),通过irq_domain映射中断号。驱动核心流程涉及设备枚举、资源分配和中断处理,最终使CPU能够访问PCI设备的I/O、存储和配置空间。该框架实现了硬件

2025-07-09 17:57:31 641

原创 PCIe基础知识之中断机制(INTx/MSI/MSI-X)

本文介绍了PCIe总线中的两种中断机制:MSI(Message Signaled Interrupts)和MSI-X(Message Signaled Interrupts-Extended)。相比传统INTx中断,MSI/MSI-X采用基于消息的中断方式,通过内存写操作触发中断,提高了效率。文章详细对比了二者的差异:MSI最多支持32个连续中断向量,而MSI-X支持最多2048个非连续向量,且采用表结构存储中断信息。文中还解析了Linux内核的实现机制,包括驱动接口和中断处理流程。重点阐述了MSI和MSI

2025-07-09 17:54:16 1139

原创 PCIe基础知识之BAR(基地址寄存器)

1.Endpoint Configuration(Type 0),Endpoint是PCIe总线上的终端设备,直接与其他设备或者处理器进行通信,比如显卡,网卡,硬盘控制器等。它是数据传输的源或者目的,不可以像Switch那样转发数据到其他分支PCIe为Endpoint设备提供最多6个BAR。BAR用于映射设备的内存空间或者I/O空间,到主机的地址空间,使得主机处理器能够通过这些地址来访问设备的寄存器,缓存和数据缓冲区等。

2025-07-09 17:50:10 1266

原创 PCIe基础知识之配置空间布局

本文介绍了PCIe设备的配置空间结构。PCIe配置空间从256字节扩展到4KB,包含PCI兼容空间和扩展空间,通过BDF号唯一标识设备。配置空间分为Type0(端点设备)和Type1(根复合体/交换机)两种类型,包含设备ID、厂商ID、状态寄存器等关键信息。重点阐述了BAR寄存器的配置过程:通过写入全1并读取返回值来确定设备所需内存空间大小,系统软件据此分配地址空间并写入BAR寄存器。这种机制实现了PCIe设备内存空间的动态映射,使CPU通过访问内存即可操作设备。

2025-07-09 17:46:42 872

原创 PCIe基础知识之总线拓扑结构

PCIe总线技术采用串行点对点架构,通过差分信号实现高速传输。系统由根桥设备(RC)、终端设备(EP)、桥接设备和交换机(Switch)组成层级拓扑。PCIe采用三层协议结构:事务层处理TLP包封装和流控,数据链路层确保传输可靠性,物理层负责数据分发和编码。数据传输时,各层添加校验字段和控制信息,通过多通道并行传输实现高带宽。这种分层设计提供了灵活的扩展能力和高效的数据传输机制。

2025-07-09 17:42:58 580

原创 LINUX驱动学习之IIC驱动-----以AP3216C为例

AP3216C不做具体的介绍,本文主要介绍LInux是如何驱动IIC设备的。

2025-03-17 21:49:49 545

原创 Linux驱动学习之平台总线&设备树驱动模型

在总线上驱动和设备的名字匹配的时候,就会调用驱动的probe函数,其主要目的就是初始化驱动程序并且注册设备,使得能够与内核和其他驱动程序进行交互int err;/* 设备树中定义有: sr501-gpios=<...>;*//*该行代码的作用:从设备树中获取与 pdev 关联的设备上的 "sr501" GPIO 线。&pdev->dev: 指向 struct device 结构体的指针,这个结构体描述了一个设备。

2025-03-09 21:30:00 1752

原创 嵌入式LINUX驱动开发(三)-设备树驱动led

配置电气属性配置设备编写makefilemake编译得到ko文件和可执行文件移植到开发板insmod操作,将.ko文件注册进入设备可以通过lsmod查看是否注册成功,同时也可以切换到 cd /dev 设备是否注册然后就可以开始运行,示例:./ledtest /dev/gpioled 1led_test。

2025-02-22 18:21:47 1016

原创 嵌入式LINUX驱动开发(二)-控制LED灯亮灭-GPIO驱动

Linux的GPIO子系统中可以通过如下函数配置GPIO。

2025-02-16 10:52:31 990

原创 嵌入式LINUX驱动开发(一)之hello驱动(基于IMX6ULL-MINI开发板)

比如驱动程序中这样包含头文件: #include <asm/io.h>, 其中的asm是一个链接文件,指向asm-arm或asm-mips,这需要先配置、编译内核才会生成asm这个链接文件。开发板上运行到内核是出厂时烧录的,你编译驱动时用的内核是你自己编译的,这两个内核不一致时会导致- -些问题。库可以和系统内核相连接,我们写了一个驱动程序,就需要告诉内核,这个过程叫做注册。其实应用程序到库是比较容易理解的,比如我们刚学习C语言的时候,使用了printf,scanf等等这些函数。而这些函数就在库中。

2025-02-10 16:36:45 1334

原创 IIC通信及设备驱动

AP3216C 是红外、光强、距离三合一的传感器。以读出光强、距离值为例。⚫ 复位:往寄存器 0 写入 0x4 ⚫ 使能:往寄存器 0 写入 0x3 ⚫ 读光强:读寄存器 0xC、 0xD 得到 2 字节的光强 ⚫ 读距离:读寄存器 0xE、 0xF 得到 2 字节的距离值 注意,AP3216C 的设备地址是 0x1E,假设节在 I2C BUS0 上,操作命令如下: 这里我们使用的是i2c-tools在开发板上进行测试,不知道这个工具的可以自行百度。

2025-02-09 16:00:04 1270

原创 SPI通信及设备驱动

SPI 主机驱动就是 SOC (System on Chip,系统级芯片或片上系统)的 SPI 控制器驱动,类似 I2C 驱动里面的适配器驱动。......​......​............​......第 41 行:transfer 函数,和 i2c_algorithm 中的 master_xfer 函数一样,控制器数据传输函数。

2025-02-09 15:56:41 1756

原创 UART通信详解&&基于IMX6ULL实现

用。

2025-02-09 15:53:17 928

原创 串口通信必须要了解的基础知识概念

使用DMA方式,外部设备在数据准备好之后只需向DMA控制器发送一个命令,把数据的地址和大小传送过去,由DMA控制器负责把数据从外部设备直接存放到内存。外部设备准备好之后,向CPU发送中断信号,CPU收到中断信号后停止当前的工作,会根据中断信号指定的设备号处理相应的设备。全双工通信允许数据同时在两个方向上传输,即有两个信道,因此允许同时进行双向传输。数据位在导线中同时传输,下图显示了二进制(01000011)中字母“C”的并行传输: 当时钟线为高电平时,8个数据位同时接受数据,高电平为1,低电平为0。

2025-02-09 15:48:15 1143

原创 select、poll、epoll三者的优缺点

用户可以注册多个socket,然后调用select函数读取被激活的socket,从而实现在同一个线程内同时处理多个IO请求,在这点上select函数与同步阻塞模型不同,因为在同步阻塞模型中需要通过多线程才能达到这个目的。事实上,同时连接的大量客户端在一时刻可能只有很少的处于就绪状态,因此随着监视的描述符数量的增长,其效率也会线性下降。epoll使用一个文件描述符管理多个描述符,它将文件描述符的事件放入内核的一个事件表中,从而在用户空间和内核空间的复制操作只用实行一次即可。

2025-01-19 23:01:41 735

原创 基于select实现并发处理

待检测集合(第2、3、4个参数)需要频繁的在用户区和内核区之间进行数据的拷贝,效率低内核对于select传递进来的待检测集合的检测方式是线性的如果集合内待检测的文件描述符很多,检测效率会比较低如果集合内待检测的文件描述符相对较少,检测效率会比较高使用select能够检测的最大文件描述符个数有上限,默认是1024,这是在内核中被写死了的。5.循环调用select(),周期性的对所有的文件描述符进行检测6.select()解除阻塞返回,得到内核传出的满足条件的就绪的文件描述符集合。

2025-01-19 22:57:26 763

原创 IO多路复用详解-select&poll&epoll

epoll全称eventpoll,是linux内核实现IO多路转接/复用(IOmultiplexing)的一个实现。IO多路转接的意思是在一个操作里同时监听多个输入输出源,在其中一个或多个输入输出源可用的时候返回,然后对其的进行读写操作。epoll是select和poll的升级版,相较于这两个前辈,epoll改进了工作方式,因此它更加高效。对于待检测集合select和poll是基于线性方式处理的,epoll是基于红黑树来管理待检测集合的。

2025-01-19 22:53:02 1543

原创 进程间通信详解之管道&&消息队列&&共享内存

进程间通信

2025-01-05 11:38:56 1923

原创 万字解读文件IO基础与深入

文件IO

2024-12-28 11:20:48 1681

原创 gcc&linux静态库&动态库学习

最近系统学习了gcc,因此写下面这个博文进行总结,所参考的主要是博主:爱编程的大丙。

2024-12-17 21:23:09 1641

原创 Keil下载芯片包时找不到根目录的办法

2.重新安装的时候,一定要记住默认路径的格式(Keil_v5,,,,千万不要写为Keil5,不然识别不出来)经过三次的安装发现,在安装选择路径的时候,一定要按照默认的格式,不要瞎改,不然根本识别不出来!问题得以解决,最后附上网盘下载链接(Keil 5.39版本)

2024-12-02 19:27:34 2099

原创 QT报错:error: allocation of incomplete type ‘Ui::‘解决办法

ui文件

2024-11-26 21:20:42 1458

原创 Qt学习之多界面跳转,界面传递参数,布局管理器,简易计算器举例

QT多界面跳转

2024-11-25 22:19:25 983

原创 C++11-chrono时间库解析

chrono用法

2024-11-21 17:53:20 1398 1

原创 Qt 字符串、信号槽详解

QT信号槽以及字符串使用

2024-11-20 22:27:26 1666

原创 解决Keil中中文解释乱码的问题

解决Keil中中文解释乱码的问题

2024-11-20 19:18:51 2097

原创 Vim 命令、操作、文件操作示例

vim文档快捷键

2024-11-19 21:21:12 1114

原创 C++关键字之explicit

explicit关键字

2024-11-19 10:45:13 467

原创 代码随想录之栈与队列

栈与队列

2024-11-18 22:00:56 1111

原创 QT入门之下载、工程创建、学习方法

QT入门

2024-11-17 21:43:31 1458

原创 C++泛型编程-函数模板、类模板

函数模板&类模板

2024-11-17 14:31:27 458

原创 代码随想录之双指针刷题总结

双指针刷题总结

2024-11-09 18:06:41 1057

原创 最实用的C++编码规范

最实用的C++编码规范

2024-11-08 20:46:32 655

latest design of board

latest design of board

2025-06-04

该电路板的作用是为WIFI模块以及惯性传感器模块提供电源支持

该电路板的作用是为WIFI模块以及惯性传感器模块提供电源支持

2025-05-30

电路设计电路设计,供电电路以及电路板设计设计设计设计

电路设计电路设计,供电电路以及电路板设计设计设计设计

2025-05-30

空空如也

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

TA关注的人

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