- 博客(12)
- 收藏
- 关注
原创 快速掌握MISRA-C准则
指令:指令是一种指导原则,无法提供执行检查合规性所需的完整描述。指令检测可能需要其他的信息(例如可能在设计文档或要求规范中提供的信息)。因此不同静态分析工具可能解析处不同的结果规则:规则是提供完整的要求描述的准则。应该可以检查源代码是否符合规则而无需任何其他信息。二者之间的区别在于一个是强烈建议,一个是直接要求级别:必要适用:c90,c99展开:附录 G 列出了 C90 和 C99 需要被记录和理解的实现定义的行为:◆ 可能导致意想不到的程序行为;
2025-08-12 10:44:13
582
原创 中断底半部的运行机制
上半部(Top Half):中断刚发生时立即执行,尽量快,不能睡眠,主要做一些简单工作,如清中断标志、保存数据。下半部(Bottom Half):延迟执行,允许做更复杂的处理,分担上半部压力。tasklet是 Linux 中一种轻量级的底半部机制,用于延迟执行函数。它的特点:运行在软中断上下文(softirq),不能睡眠;同一个 tasklet 在任一时刻只会运行一个实例(即不会并发);支持调度/禁用等操作;优先级高于工作队列(workqueue),低于中断上半部。workqueue。
2025-08-11 17:45:01
954
原创 Linux驱动操作基石:(3)Linux驱动中的异步通知与异步IO
在 Linux 设备驱动开发中,异步通知(Asynchronous Notification)用于在。函数向驱动注册异步通知,当设备可读或可写时,内核会向用户进程发送。,从而避免用户进程轮询设备状态,提高系统效率。Linux 主要使用 F_SETOWN。用户进程可以通过 fcntl()设备有数据到达时通知用户进程。,但不适用于高性能并发处理。设备状态改变时,调用。
2025-08-11 17:36:51
279
原创 Linux驱动操作基石:(2)Linux驱动中的阻塞和非阻塞IO
Linux 等待队列与 I/O 多路复用机制 等待队列 内核机制,用于进程睡眠/唤醒 核心结构:wait_queue_head_t(队列头)和wait_queue_t(等待项) 典型应用:设备驱动阻塞I/O、同步机制 提供阻塞(wait_event)和可中断(wait_event_interruptible)等待 通过wake_up()唤醒进程 I/O多路复用 select:传统机制,监听多个fd状态 poll:改进版,无fd数量限制,使用pollfd结构 epoll:高性能版,适合高并发,使用事件驱动模型
2025-08-11 17:32:05
961
原创 块设备驱动知识点总结
注册块设备初始化请求队列分配并初始化 gendisk// 一个分区实现 request 处理函数= NULL) {else。
2025-08-11 17:28:53
605
原创 显示子系统:MIPI协议之DSI协议
MIPI协议实际上是一系列接口的协议,包含液晶、摄像头等等。液晶中所用的MIPI接口,其专业名称叫DSI,全称Display Serial Interface。顾名思义,该接口是指用于显示模块的一个串行接口,基于MIPI协议而产生,兼容DPI(显示像素接口,Display Pixel Interface)、DBI(显示总线接口,Display Bus Interface)和DCS(显示命令集,Display Command Set)。相对于一般的RGB接口,DSI有成本低,高速率的优势。
2025-07-17 17:01:19
1372
原创 显示子系统:MIPI协议之D-PHY协议
MIPI(移动行业处理器接口)是由MIPI联盟制定的移动应用处理器开放标准,主要分为物理层和逻辑层。物理层包含D-PHY、C-PHY和M-PHY三种标准:D-PHY采用差分信号传输,支持摄像头和显示屏应用;C-PHY每条通道使用3根信号线;M-PHY支持高性能芯片间通信。D-PHY具有高速(HS)和低功耗(LP)两种工作模式,HS模式采用差分信号传输,速率可达4.5Gbps/lane,而LP模式用于低速控制信号传输。MIPI接口在连接时需要区分主从设备,时钟信号为单向传输,数据信号可支持半双工通信
2025-07-17 16:51:00
1717
原创 网络设备子系统驱动分析(有线网卡与无线网卡)
Linux网络设备驱动采用四层架构:协议接口层(sk_buff)、设备接口层(net_device)、驱动功能层和硬件层。sk_buff是核心数据结构,用于表示网络数据包及其元信息,包含数据指针、长度、协议类型等字段,贯穿整个数据收发流程。net_device描述网络接口,包含设备名称、操作函数集(netdev_ops)和统计信息等,是驱动与协议栈的桥梁。驱动初始化通过alloc_etherdev分配net_device,注册操作函数并调用register_netdev完成注册。数据收发流程中,驱动层通过s
2025-07-17 16:28:16
676
原创 Linux网络设备驱动重要知识点
中定义了,核心字段如下(略去大量细节,仅保留关键成员):// 链表指针,用于队列中 struct sk_buff *prev;// 数据包关联的网络设备 struct sock *sk;// 所属 socket unsigned char *head;// 包缓存起始地址 unsigned char *data;// 有效数据起始地址 unsigned char *tail;// 有效数据末尾地址(尾部空间起点) unsigned char *end;
2025-05-07 16:42:11
975
原创 C扩展:GNU C编译器扩展
结构体的内存分配遵循成员顺序、对齐要求和填充字节的原则。了解这些原理有助于优化内存使用和提高程序性能。可变参数宏提供了一种灵活的方式来处理不确定数量的参数,特别适用于日志记录、调试信息输出等场景。通过使用,可以在宏体中访问和处理这些参数。
2024-12-04 11:49:42
1091
原创 Linux驱动操作基石:(1)Linux设备驱动中的并发控制
并发与竞态:并发指的是多个执行单元同时并行被执行,而并发的执行单元之间共享资源(硬件资源和软件上的全局变量、静态变量)的访问容易导致竞态。主要发生的场景有以下几种:编译乱序:执行乱序:解决方法:在单CPU范围内避免竞态的一种简单且有效的方式在临界区之前屏蔽系统的中断,但在驱动程序中不推荐使用。使用方法:原子操作定义:应用场景:常见的原子操作:实现机制:优点:限制:示例:自旋锁自旋锁是一种同步机制,用于保护共享资源,确保在同一时间只有一个线程可以访问这些资源。与互斥锁(如信号量)不同,自旋锁在等
2024-12-02 18:02:19
1186
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅