自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 linux input 驱动

Linux input 驱动

2024-05-21 21:24:12 141

原创 linux platform 总线(设备树)驱动

使用设备树实现 platform driver

2024-05-16 18:38:58 152

原创 linux timer 驱动

linux timer 驱动

2024-05-14 20:51:12 232

原创 linux platform 总线驱动

platform device 和 platform driver

2024-01-13 18:57:19 505

原创 IO——poll 函数

在单个线程中,select 函数能够监视的文件描述符数量有最大的限制,一般为 1024,可以修改内核将监视的文件描述符数量改大,但是这样会降低效率!这个时候就可以使用 poll 函数,poll 函数本质上和 select 没有太大的差别,但是 poll 函数没有最大文件描述符限制,虽然poll解决了select中监听fd的上限,但是poll中还是要遍历所有的FD,且如果fd监听过多会导致性能下降。要监视的文件描述符集合以及要监视的事件,为一个数组,数组元素都是结构体。poll 函数要监视的文件描述符数量。

2023-12-22 20:15:00 487

原创 IO——select 函数

在调用 select 函数后,可以通过检查 readfds,writefds 和 exceptfds 集合的状态,以确定哪些文件描述符准备好进行 I/O 操作。然后,程序可以根据文件描述符的状态来执行相应的读、写或异常处理操作。它们都是由 fd_set 类型表示的位图结构。

2023-12-22 12:51:48 662

原创 非阻塞 IO(NIO)

程序使用时,阻塞 IO 和非阻塞 IO 的区别在于文件打开的时候是否使用了。所以驱动中需要判断文件打开标志是否支持非阻塞方式。文件打卡时,文件打开标志存放在文件结构体。,使用等待队列头实现了阻塞 IO。如果文件读取失败,循环读取。

2023-12-22 08:39:00 907

原创 阻塞 IO(BIO)

等待队列以循环链表为基础结构,链表头和链表项分别为。等待队列是内核实现阻塞和唤醒的内核机制。宏一次性完成等待队列头的定义和初始化。整个等待队列由等待队列头进行管理。等待队列头的初始化有两种方法。等待队列头使用结构体。等待队列项使用结构体。

2023-12-21 21:42:31 524

原创 linux 驱动——私有数据

前面的程序中,都只申请了一个从设备号,这里使用。分配两个设备号,这两个设备共用。

2023-12-21 08:39:19 595

原创 linux 驱动——杂项设备驱动

在 linux 中,将无法归类的设备定义为杂项设备。相对于字符设备来说,杂项设备的主设备号固定为 10,而字符设备不管是动态分配还是静态分配设备号,都会消耗一个主设备号,比较浪费主设备号。杂项设备会自己调用和来自动创建设备节点。所以可以将杂项设备看成是字符设备的一种。但是比平时写的字符设备降低了难度并节约了主设备号。杂项设备的次设备号 minor 一般使用宏,表示自动分配次设备号。杂项设备主要依赖次设备号来管理不同的杂项设备。杂项设备的头文件为。

2023-12-20 21:27:26 436

原创 音频——S/PDIF

双相符号编码(Biphase Mark Code),简称BMC,属于一种相位调制(phase modulation)的编码方法,是将时钟讯号和数据讯号混合在一起传输的编码方法。如果要传输的比特是逻辑 1,则符号的第二个状态与第一个状态不同。如果要传输的比特是逻辑 0,则符号的第二个状态与第一个状态相同。一个符号的第一个状态总是不同于前一个符号的第二个状态。每个要传输的比特由一个符号表示,该符号由。BMC 编码示例如下图。

2023-11-25 20:15:00 902

原创 linux 驱动——原子操作

Linux 内核定义了叫做atomic_t的结构体来完成整型数据的原操作,在使用是使用原子变量来代替整型变量。此结构体定义在也可以在定义原子变量的时候给原子变量赋初值,如下所示相应的也提供了 64 位原子变量的操作 API 函数,和上表用法一样,只是将 atomic_ 前缀换为 atomic64_ 将 int 换为 long long。如果使用的是 64 位的 SOC,那么就要使用 64 位的原子操作函数。

2023-11-22 21:47:49 204

原创 音频——解析 PCM 数据

PCM 数据生成与解析

2023-11-11 12:53:34 860

原创 linux 驱动——将模块编译进内核

前面两节介绍的驱动都是以模块的形式,需要手动加载,本节介绍如何将模块编译进内核。将上一节中的模块源码拷贝到。

2023-11-06 21:31:10 519

原创 linux 驱动——字符设备驱动(自动生成设备节点文件)

linux 自动创建设备节点之后,就不用手动创建了,可以直接查看 /dev 目录下已经生成了设备节点文件。dev 目录下的节点不是由驱动本身生成的,是由文件系统中的工具 mdev 生成的;当系统启动后,加载完内核再去加载文件系统,执行文件系统中的脚本,脚本会执行。文件保存了每个驱动的主设备号、次设备号,以及驱动名。配置 linux 内核使之自动创建设备节点文件。这里文件是有的,这个时候执行。可以看到设备节点文件自动创建了。下的所有文件,寻找所有名为。生成设备节点的依赖有两个。程序),该命令会去遍历。

2023-11-05 21:59:31 418 1

原创 linux 驱动——字符设备驱动

创建设备节点起始就是在 /dev 目录下创建一个文件,这样。就可以访问这个文件了。创建完成以后就会存在。查看模块文件是否存在。查看当前系统中的设备。

2023-11-05 11:15:03 214

原创 VScode clangd 插件浏览 linux 源码

VScode clangd 插件浏览代码却决于文件生成该文件有很多种方法这里只介绍 bear 和 linux 内核脚本。

2023-10-30 20:43:28 981

原创 linux 模块安装与卸载

网卡没有处于 AP 模式,处于 Managed 模式的无线网卡没有足够多的信息做网桥,只能转换成。解决方法就是在内核顶层的 Makefile 直接定义这两个变量(有点粗暴),这样直接将编译的 ko 放到网络文件系统中,直接启动内核即可。之后,将生成的 ko 文件拷贝到根文件目录下,然后重新打包。这个有点复杂,超出了研究 linux driver 的目的。模块编译好之后,最好的方法就是将 rootfs 设置为。的形式,如果想让 qemu 联网,需要建立网桥,但是。脚本传进去的,编译模块的时候又没有指定这些。

2023-10-29 11:30:03 723

原创 VScode 调试 linux内核

VScode 调试 linux 内核,这里调试的 linux 内核是通过运行的内核。

2023-10-28 21:33:41 950

原创 u-boot 通过 SD 卡启动 Linux(三)

将 kernel + dtb + rootfs 打包到一个 SD 卡镜像中。可以看到分区 1 为 kernel + dtb。分区2 为 rootfs。前面几节中,分别介绍了。

2023-10-25 21:33:38 865

原创 Linux+SD卡(rootfs)(二)

镜像中就包含了 rootfs 目录下的所有内容,此时linux的根文件系统就已经制作完成,下一步就是使用这个 rootfs.ext3 镜像来启动 linux 内核。上述步骤执行完后在 busybox 根目录生成了一个 _install 文件夹。busybox 下载链接 https://busybox.net/随便找一个目录,来创建 linux 的根文件系统。这里比之前多指定了一个 sd 镜像。上面的步骤执行完后,linux 启动文件。linux 启动日志。

2023-10-16 22:13:08 1147

原创 qemu 运行 linux(一)

从日志中可以看到,挂载 VFS 文件系统失败,导致内核 panic。下节将介绍 rootfs。可以在浏览器中点击下载,也可以使用命令行下载。在根目录 linux-6.5.7 执行。在根目录 linux-6.5.7 执行。在根目录 linux-6.5.7 执行。linux 内核下载地址。

2023-10-15 21:04:04 508

原创 VSCode 调试 u-boot

VSCode 调试 u-boot

2023-10-15 16:04:47 889 2

原创 qemu基础篇——VSCode 配置 GDB 调试

qemu 启动选项多了 -s -S ,表示启动之后就 stop 等待 GDB 连接,在启动调试之前先启动 qemu ,让其等待 GDB 连接。上一节中直接使用 GDB 命令行调试,本节介绍如何使用 VSCode 来进行调试。选择 Node.js,此时在当前工作区域会新建一个 launch.json 文件。如果找不到 Node.js 模块,使用如下命令安装。Node.js 安装。

2023-10-14 20:35:13 2467

原创 u-boot 编译与运行

u-boot 编译与 qemu 运行

2023-10-12 21:59:46 263

原创 graphviz 绘制森林

【代码】graphviz 绘制森林。

2023-10-11 21:37:13 83

原创 graphviz 绘制红黑树

【代码】graphviz 绘制红黑树。

2023-10-11 21:32:52 98

原创 graphviz 绘制二叉树

【代码】graphviz 绘制二叉树。

2023-10-11 21:27:41 356

原创 graphviz 绘制单链表

【代码】graphviz 绘制单链表。

2023-10-11 21:06:39 94

原创 PlantUML 绘图

PlantUML 绘图

2023-10-10 21:40:24 497

原创 【GDB】使用 GDB 自动画红黑树

前面几节中介绍了 gdb 的 python 扩展,参考并且 python 有 graphviz 模块,那么可以用 gdb 调用 python,在 python 中使用 graphviz 绘图。

2023-09-30 10:03:51 189

原创 【GDB】用 python 扩展 gdb

gdb.parse_and_eval 接受一个字符串作为表达式,并以 gdb.Value 的形式返回表达式求值的结果。那么 gdb.parse_and_eval(‘i + 1’) 的结果是一个 gdb.Value 的实例,其 value 属性的值为 4。如果想把输出结果转存到字符串中,设置 to_string 为 True:gdb.execute(cmd, to_string=True)。当我们通过 python 接口跟这些值打交道时,gdb 会把它们包装成一个 gdb.Value 对象。

2023-09-29 21:10:17 1025

原创 【GDB】常用操作

不过在调试真正的程序时,watch 断点非常实用,尤其当你对相关代码不熟悉时。另外结合 debugger 运行时修改值的能力,你可以在值变化的下一刻设置目标值,观察走不同路径会不会出现类似的问题。一个办法是给内存的分配和释放加上日志,再编译,然后重新运行程序,谋求复现内存泄露的场景。也即是说,就算不退出 gdb,每次运行的也会是当前最新的版本。若如果用 print 大法,就在 binary_search 中插入几个 print,运行后扫一眼,看看 target=5 的时候运行流是怎样的。

2023-09-29 17:11:59 167

原创 【GDB】 command 命令

这样会提示你输入你要执行的命令,以 end 结束。这个 bread_id 就是用 info b 打印出的结果,其实就是当前已经设置的断点序号。2 个断点都加了 command 命令。当断点被触发时,这些命令会被执行,这样的好处是不需要手动敲 c 来将程序继续执行下去,方便调试。command 命令是一个很好用的调试命令,它配合断点使用,可以在指定的断点执行预先设置的命令。在断点 1 设置了命令。在断点 2 设置了命令。

2023-09-29 11:59:21 320

原创 【GDB】常用命令

GDB 常用命令

2023-09-29 09:54:21 230

原创 【GDB】命令脚本

另外 gdb 还提供了很多输出命令。比方说 echo 命令,如果仅仅是输出一段文本,echo 命令特别方便。此外还有和 C 语言很相似的支持格式化输出的 printf 命令,等等。因为这样做会使 gdb 按照相应的脚本语言去解析命令脚本,结果自然是不对的。首先对于命令脚本的命名,其实 gdb 没有什么特殊要求,只要文件名。脚本文件的注释也是以 # 开头的,这个同很多其它脚本语言都一样。命令脚本:新建一个文件。python 文件内容。编译并调试 C 代码。编译并调试 C 代码。

2023-09-27 22:14:08 285

原创 【GDB】自定义命令

.gdbinit 文件的使用示例 脚本中输入如下内容运行https://blog.csdn.net/weixin_41572450/article/details/124883629

2023-09-27 21:33:38 155

原创 【GDB】 .gdbinit 文件

这个文件,并把它的内容作为gdb命令进行解释,所以如果我把脚本命名为。gdb 在启动的时候通常想加入一下自己的命令,例如。gdb 在启动的时候,会在你的当前工作目录下查找。,这样在启动的时候就会处理一些你常用的命令。1、在/home/tyustli 下添加一个。(即你要Debug的目录)下,同样添加一个。实际使用时,会存在一个问题,比如你需要在。写代码, 因此,你想在当前目录下添加。, 默认GDB初始化时会调用这个文件。新建一个 shell 脚本。, 然后调用 GDB。

2023-09-27 21:15:56 867

原创 dot 绘图

当然,在编写好. dot 或者. gv 的文件之后,需要有专门的程序处理这些文件并将其渲染成为图片,dot 就是其中一款程序,它可以将 DOT 语言描述的图形渲染成. png、.jpg、.pdf 等多种类型。当然,作为工具,dot 本身是很原始的,就像 gcc 之于 c 代码,g++ 之于 cpp 代码一样,或许某些程序员会热衷于在终端使用这些工具,但也有很多人喜欢交互式的界面,所以就有了 gvedit 之类的工具,它提供交互式的窗口来使用 dot 等工具渲染 DOT 语言描述的图形。

2023-09-27 16:36:42 431

原创 python 绘制 graphviz

只安装 python 的包是不够的,还需要安装。, python 要想使用还需安装 pip 包。上一节中在本地安装了。

2023-09-27 16:36:05 164

空空如也

空空如也

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

TA关注的人

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