- 博客(32)
- 收藏
- 关注
原创 ethercat sdo 报文分析
(以太网头部):包含源MAC地址、目的MAC地址及帧类型标识(0x88A4表示EtherCAT协议),总长度14字节。(数据段):包含EtherCAT协议定义的子报文(Datagram),用于传输具体指令与数据。(Frame Check Sequence):4字节的CRC校验字段,用于数据完整性验证。
2025-04-16 09:16:07
547
原创 EtherCAT从站错误0x001D调试指南
PDO在DPRAM中的地址区域与其他同步管理器(Sync Manager)或邮箱(Mailbox)内存区域重叠。在TwinCAT的“Online”视图中确认SM2的起始地址和长度已更新。配置9个Output PDO(总计288字节)时触发错误代码。通过主站向新地址写入数据,监控从站响应及DPRAM数据变化。配置为3 Buffer模式(
2025-04-12 09:00:00
323
原创 条件变量核心要素
这种设计既保证了线程安全,又实现了高效的线程唤醒机制。当条件变量收到信号时,内核会选择一个(signal)或全部(broadcast)等待线程移入就绪队列,被唤醒的线程在重新获得CPU时间片后会自动尝试获取关联的互斥锁。循环是保证数据完整性的核心机制,特别是在处理高并发数据流时,任何对等待条件的简化都会导致不可预知的通信故障。
2025-04-07 14:08:23
354
原创 零长度数组
在Linux内核的「struct gpio_keys_drvdata」设计中,零长度数组(data[0])的用法容易引发误解,但当前代码中的内存分配是正确的。这是Linux内核中处理动态大小结构体的惯用模式,在内核源码树中随处可见类似写法(如。这种设计保证了内存布局的紧凑性,data数组元素直接跟在结构体尾部,通过。数据在内存中连续存放,提高缓存命中率。避免存储指针(节省4/8字节),这在需要创建大量实例时尤为重要。在Linux内核驱动开发中,在结构体中成员。,但在早期内核版本(如4.9)中仍广泛使用。
2025-03-26 08:30:00
245
原创 mknod命令与device_create函数的关系
mknod命令与函数在 Linux 设备管理中扮演不同角色,但共同作用于设备节点的创建。mknod():在内核中动态创建设备对象,并触发用户空间(如udev)自动生成设备节点。:通过注册设备类(如在类下生成设备对象(如udev监测到 sysfs 变化后,根据规则创建设备节点(如:无需手动指定设备号,通过动态分配()和 udev 自动化管理。
2025-03-25 16:08:51
556
原创 platform设备驱动模型简介
在Linux内核中,platform设备驱动模型用于管理那些不直接挂载在物理总线(如PCI、USB)上的设备,例如SoC(片上系统)内部的硬件模块(如GPIO控制器、定时器等)。这种模型通过虚拟的总线将设备()和驱动()关联起来,提供统一的资源管理和匹配机制。
2025-03-25 09:00:00
741
原创 中断向量表
中断向量表(Interrupt Vector Table, IVT)是单片机(或处理器)中实现中断机制的核心数据结构,其作用类似于硬件与中断服务程序(ISR)之间的"导航地图"。它直接决定了系统在中断触发时如何快速定位到对应的处理代码。
2025-03-17 10:41:52
1364
原创 中断功能简介
是一种关键的事件驱动机制,它允许CPU在执行主程序的过程中,即时响应内部或外部紧急事件。这种机制突破了传统顺序执行的局限性,为实时控制提供了硬件级支持。
2025-03-17 10:26:21
872
原创 Linux 内核工作队列与共享队列简介
共享工作队列:适合轻量级、临时性任务,简化代码但缺乏隔离性。私有工作队列:适用于高频、高优先级或需资源隔离的任务,提供更精细的控制。设计选择:根据任务延迟敏感性、并发需求和系统负载选择队列类型,必要时结合WQ_UNBOUND等标志优化多核性能。
2025-03-12 09:00:00
1029
原创 linux kfifo的buffer为什么是2的幂
优点性能极致优化(位操作代替取模)、代码简洁、减少边界检查、内存对齐友好。代价用户需要接受缓冲区大小被强制对齐到 2 的幂(例如申请 1000 字节实际分配 1024 字节),可能略微浪费内存。这种设计是典型的内核空间优化策略,通过牺牲少量内存换取高频操作下的极致性能。
2025-03-07 15:16:11
293
原创 Linux设备驱动程序之tasklet简介
Tasklet是Linux内核中用于处理延迟工作的机制,它允许在中断上下文中执行轻量级任务。Tasklet在软中断上下文中运行,适用于快速、非阻塞的操作。
2025-03-06 15:19:40
613
原创 Linux内核定时器使用简介
上面的终端输出中,time字段表示jiffies值,delta是自前一行来jiffies的变化值,inirq是由。,会发现定时器的上下文是进程0,即是空闲任务,该任务因为历史原因被称为“swapper”。),pid和command表示当前运行的进程,而cpu是正在使用的cpu编号。会遍历所有CPU的定时器队列,确保定时器被彻底移除。会等待其完成,防止释放内存后回调继续访问。:定时器可能被添加到任意CPU的队列中,函数返回的布尔值,如果非零表示调用。:如果定时器回调正在执行,的函数运行于中断上下文(
2025-03-05 10:16:24
1026
原创 single_open函数
相关的一个函数,用于简化虚拟文件的实现。它专门为生成静态内容的文件设计,无需实现复杂的迭代器接口(如。定义一个回调函数,该函数使用。是 Linux 内核中与。)将虚拟文件注册到文件系统。使用内核提供的接口(如。等函数生成文件内容。
2025-03-05 08:35:20
515
原创 linux内核定时器中的jiffies + HZ
是一个表示“当前时间加 1 秒”的表达式,常用于设置内核定时器的到期时间。它基于内核的时钟中断机制,是 Linux 内核中实现精准定时的重要方式。
2025-03-04 10:00:00
265
原创 Linux设备驱动程序poll
驱动程序的核心目标是实现高效的事件驱动I/O,使应用程序能够以非阻塞方式管理多个设备。其应用广泛覆盖网络通信、实时系统、用户交互等场景,是构建高性能、响应式系统的基石。一旦设备状态变化(如数据到达或缓冲区空闲),驱动唤醒等待队列中的进程,触发内核重新检查设备状态,从而通知用户程序。方法的主要目的是支持非阻塞I/O和多路复用,使应用程序能够高效监控多个设备的就绪状态。等系统调用,同时监视多个文件描述符的状态(如可读、可写或异常),而无需为每个操作阻塞。将进程添加到设备的等待队列,确保状态变化时能唤醒进程。
2025-03-02 12:50:30
278
原创 阻塞型IO简介
在Linux设备驱动开发中,阻塞型IO的核心是通过等待队列和休眠机制实现进程的阻塞与唤醒。为了更安全地实现阻塞型IO,可以使用内核提供的休眠函数(如。通过使用内核提供的休眠函数,可以更安全地实现阻塞型IO,避免手动操作等待队列带来的风险。步骤 5:操作设备文件/dev/blocking_dev。硬件设备资源有限,需要等待数据准备好。步骤 1:编写 `Makefile`多进程访问设备时,避免资源竞争。同步操作,确保数据完整性和顺序。),而不是手动操作等待队列。步骤 4:创建设备文件。
2025-03-01 12:32:12
253
原创 stm32使用两个16位定时器级联成32位定时器
16位计时器最多计数65535,那么us级别的计时最大是65.535ms,项目上可能会有计时或者延时时间大于65.535ms的情况,因此需要级联成32位扩大使用范围。
2023-11-06 22:41:40
940
原创 传输层——可靠性传输原理
传输层协议给运行在不同主机上的应用进程提供逻辑通信服务。逻辑通信,以应用层的视角,可以认为主机上运行的进程是直接连接的,但事实上,主机之间可能连接有许多路由器。应用进程使用传输层提供的逻辑通信服务进行信息传递。传输层协议有两种:TCP与UDP,每种协议均为上层应用提供里不同的服务。
2022-12-25 17:19:46
1351
原创 SPI通信
SPI简介SPI是一种串行外围设备通信接口,高速全双工通信总线,主要用于通信速率较高的场合。SPI硬件连接硬件连接图如下:SPI通讯使用3条总线及片选线,总线分别为:SCK、MOSI、MISO,片选线为SS,主要作用如下:(1)SS(片选线):用于选择从设备,成为片选信号线。当有多个SPI从设备与SPI主机相连时,设备的其他三条总线并联到相同的SPI总线,即使三条总线又从设备公用,但是片选线每个从设备都是独有的。SPI这一点与I2C协议不同,I2C通信是通过设备地址选中某个设备。SPI通信时,主
2021-03-07 15:30:38
1539
原创 DMA学习总结
DMA主要功能是传输数据,其特点是不需占用CPU,在数据传输时cpu可以做别的事。数据传输支持外设与存储器互传,存储器与存储器互传。一个处理器可能有多个DMA控制器,一个控制器下又有多个通道。DMA数据配置以下基于CORTEX-M3处理器的寄存器模式对DMA进行数据配置数据的去向传输方向一共有三个:外设到存储器,存储器到外设,存储器到存储器具体方向由DMA寄存器配置。既然传输,DMA就需要知道传输双方的地址,两者地址均由DMA控制器的寄存器控制传多少数据知道数据的流向,还需要明确传输的数据量
2021-03-04 20:20:16
621
1
原创 UCOSII学习笔记——事件控制块(Event Control Blocks)
任务与任务,任务与中断服务程序之间可以通信,通信介质称为事件控制块。通信方式有以下几种,如下图: (1)中断服务程序或者任务可以给ECB发送信号;只有任务能够等到中断服务程序或者ECB发送的信号;等待ECB设置有超时机制,如图A。 (2)当多个任务等到任务或者中断服务程序给ECB发送信号时,只有等待最高优先级的任务...
2021-02-04 17:16:22
1826
原创 UCOSII学习笔记——任务调度之优先级位图法
UCOSII学习笔记——任务调度机制1 任务描述2 创建任务2.12.4 创建任务挂载就绪队列1 任务描述2 创建任务2.12.4 创建任务挂载就绪队列 任务堆栈初始化和OS_TCB初始化完成后,需要将新创建的任务挂载到就绪队列,以便供OS_Sched调度,以下代码即表示挂载过程:OSRdyGrp|= ptcb->OSTCBBitY; //挂载任务到就绪队列OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;...
2020-12-10 00:56:16
1256
原创 arm体系结构编程-入门介绍
arm体系结构编程1 基本概念2 ARM编程模型2.1 工作模式2.2 工作状态2.3 寄存器组织结构2.3.1 和特殊功能寄存器的区别2.3.2 arm寄存器个数1 基本概念RISC,精简指令集 armCISC,复杂指令集 intel指令集 架构 SOCarmv4t ARM7 S3C44B0 之前都是三级流水线ARMV5TE ARM9 s3c2410/s3c2440ARMV6 ARM11 s3c6410ARMV
2020-11-24 00:12:25
1091
2
原创 网络中主机通信过程
主机A和主机B在同一个二层网络,直接走二层交换主机A查看arp表,检查是否有主机B的IP到MAC的映射.如果有映射,构造报文,目的IP为主机B的IP,源IP为主机A的IP,目的MAC为主机B的MAC,源MAC为主机A的MAC(这个过程是构造了一个网帧,交换机的数据包传输是基于网帧的),将数据包传给交换机,交换机进行MAC表学习,将主机A的MAC和报文端口号记录下来,然后交换机查看自己的MA...
2019-08-22 15:22:21
2185
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人