自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

123

123

  • 博客(167)
  • 资源 (2)
  • 收藏
  • 关注

原创 linux中断下文工作队列之工作队列传参(中断七)

首先我们定义工作项结构,如下所示,在结构体 struct work_data 中定义了需要传递给工作项处理函数的参数 a 和 b,然后定义一个类型为 struct work_data 的变量test_workqueue_work。当中断触发时,在中断处理函数 test_interrupt 中,通过调用queue_work 函数将工作项test_workqueue_work.test_work 提交到工作队列 test_workqueue 中。然后在模块初始化函数中,为工作项的参数 a 和 b 赋值。

2023-10-31 20:25:13 285

原创 linux中断下文工作队列之延迟工作(中断六)

延迟工作是一种将工作的执行延迟到稍后时间点进行处理的技术。通常情况下,当某个任务需要花费较长时间,不需要立即执行或需要按时执行时,延迟工作就会派上用场。延迟工作的基本思想是将任务放入一个队列中,然后由后台的工作进程会任务调度程序来处理队列中的任务。任务可以在指定的延迟时间后执行,也可以根据优先级,任务类型或者其他条件进行排序和处理。延迟工作在许多应用场景中都非常有用,尤其是在需要处理大量任务,提供系统性能和可靠性的情况下。以下是一些常用的应用场景。

2023-10-31 20:14:12 327

原创 linux中断下文工作队列之自定义工作队列(中断五)

该函数参数是一个指向 struct workqueue_struct 类型的指针wq。

2023-10-31 19:57:57 236

原创 qt5工程打包成可执行exe程序

完成打包后,在package文件夹中生成的_boxed.exe文件就是原来exe文件的绿色版本。此时在package文件夹中的生成的配置文件,可以直接点击.exe文件运行了。使用Enigma Virtual Box 工具进行打包。选择package文件夹。

2023-10-31 19:33:28 538

原创 linux中断下文工作队列之共享工作队列(中断四)

工作队列是实现中断下半部分的机制之一,是一种用于管理任务的数据结构或机制。它通常用于多线程,多进程或分布式系统中,用于协调和分配待处理的任务给可用的工作线程或工作进程。工作队列的基本原理是将需要执行的任务按顺序排列在队列中,并提供一组工作线程或者工作进程来处理队列中的任务。当有新的任务到达时,它们会被添加到队列的末尾,工作线程或工作进程从队列的头部获取任务,并执行相应的处理操作。工作队列和之前学习的 tasklet 有什么不同呢?tasklet 也是实现中断下半部分的机制之一。

2023-10-26 20:15:33 143

原创 linux中断下文之软中断(中断三)

Linux 源码 linux_sdk/kernel/include/linux/interrupt.h 文件中定义了一个枚举类型,用于标识软中断的不同类型或优先级。每个枚举常量对应一个特定的软中断类型。enum {HI_SOFTIRQ:高优先级软中断TIMER_SOFTIRQ:定时器软中断NET_TX_SOFTIRQ:网络传输发送软中断NET_RX_SOFTIRQ:网络传输接收软中断BLOCK_SOFTIRQ:块设备软中断IRQ_POLL_SOFTIRQ:中断轮询软中断。

2023-10-26 19:53:14 101

原创 linux中断下文之tasklet(中断二)

在申请 GPIO 中断时使用 request_irq,但是request_irq绑定的中断服务程序指的是中断上文。在 Linux 内核中,tasklet 是一种特殊的软中断机制,被广泛用于处理中断下文相关的任务。它是一种常见且有效的方法,在多核处理系统上可以避免并发问题。Tasklet 绑定的函数在同一时间只能在一个 CPU 上运行,因此不会出现并发冲突。然而,需要注意的是,tasklet 绑定的函数中不能调用可能导致休眠的函数,否则可能引起内核异常。

2023-10-26 19:37:31 164

原创 linux中断(中断一)

中断是操作系统中至关重要的机制,它能够显著提高系统的响应性能和并发处理能力。中断是指在 CPU 正常运行期间,由外部或内部事件引起的一种机制。当中断发生时,CPU会停止当前正在执行的程序,并转而执行触发该中断的中断处理程序。处理完中断处理程序后,CPU 会返回到中断发生的地方,继续执行被中断的程序。中断机制允许CPU在实时响应外部或内部事件的同时,保持对其他任务的处理能力。

2023-10-26 19:06:19 168

原创 Linux驱动调试方法(高级字符设备八)

在编写Linux驱动程序时,通常都使用 printk 函数打印相应的提示信息从而对驱动进行调试,除了printk 函数之外,还有其他的方式来调试驱动呢。

2023-10-26 08:37:31 124

原创 Linux的ioctl 驱动传参(高级字符设备七)

ioctl 是设备驱动程序中用来控制设备的接口函数,一个字符设备驱动通常需要实现设备的打开、关闭、读取、写入等功能,而在一些需要细分的情况下,就需要扩展新的功能,通常以增设 ioctl()命令的方式来实现。

2023-10-25 20:31:42 282

原创 Linux 内核打印(高级字符设备六)

内核所有的打印信息都会输出到循环缓冲区 ‘log_buf’,为了能够方便的在用户空间读取内核打印信息,Linux 内核驱动将该循环缓冲区映射到了/proc 目录下的文件节点kmsg。通过cat 或者其他应用程序读取 Log Buffer 的时候可以不断的等待新的log,所以访问/proc/kmsg的方式适合长时间的读取 log,一旦有新的 log 就可以被打印出来。在终端使用 dmseg 命令可以获取内核打印信息,该命令的具体使用方法如下所示:dmesg 命令。-C,–clear 清除内核环形缓冲区。

2023-10-25 20:13:16 505

原创 Linux 内核定时器(高级字符设备五)

在 Linux 内核中很多函数是基于定时器进行驱动的,但是内核定时器的精度并不高,所以不能作为高精度定时器使用。并且内核定时器的运行没有周期性,到达计时终点后会自动关闭。如果要实现周期性定时,就要在定时处理函数中重新开启定时器。/**/#endifstructtimer_list0例如可以使用以下代码对定时器和相应的定时处理函数进行定义//定义一个定时器定时器定义完成之后还需要通过一系列的 API 函数来初始化此定时器,部分函数说明如下函数作用。

2023-10-25 20:04:19 258

原创 linux信号驱动IO(高级字符设备四)

信号驱动 IO 不需要应用程序查询设备的状态,一旦设备准备就绪,会触发SIGIO信号,进而调用注册的处理函数。

2023-10-25 19:39:25 132

原创 linux的IO 多路复用(高级字符设备三)

IO 多路复用是一种同步的 IO 模型。IO 多路复用可以实现一个进程监视多个文件描述符。一旦某个文件描述符准备就绪,就通知应用程序进行相应的读写操作。没有文件描述符就绪时就会阻塞应用程序,从而释放出 CPU 资源。在应用层 Linux 提供了三种实现 IO 多路复用的模型,分别是select、poll 和epoll。poll 函数和select 函数都可以监听多个文件描述符,通过轮询来获取已经准备好的文件描述符。但是epoll 函数将主动轮询变成了被动通知,当事件发生时被动接收通知。

2023-10-25 14:28:26 103

原创 Linux阻塞IO(高级字符设备二)

在 Linux 驱动程序中,阻塞进程可以使用等待队列来实现。等待队列是内核实现阻塞和唤醒的内核机制,以双循环链表为基础结构,由链表头和链表项两部分组成,分别表示等待队列头和等待队列元素//自旋锁struct list_head task_list //链表头。

2023-10-24 20:22:11 359

原创 linux驱动的IO 模型(高级字符设备一)

IO 是英文 Input 和 Output 的首字母,代表了输入和输出。操作系统(Linux)负责对计算机的资源进行管理和对进程进行调度,应用程序运行在操作系统上,处于用户空间。应用程序不能直接对硬件进行操作,只能通过操作系统提供的API 来操作硬件。需要将进程切换到内核空间,才能进行 IO 操作,并且应用程序不能直接操作内核空间的数据,需要把内核空间的数据拷贝到用户空间。应用程序运行在用户空间,它不存在实质的 IO 过程,真正的IO 是在操作系统执行的。

2023-10-24 19:35:30 86

原创 Linux 错误处理(字符设备基础三)

在Linux字符设备驱动中,即使是最简单的注册字符设备,也存在注册失败的可能性,因此在之前编写的驱动代码中采用检查函数返回值的方式,确认函数是否成功执行。

2023-10-24 19:20:19 151

原创 linux驱动文件私有数据(字符设备基础二)

文件私有数据的概念在 Linux 驱动中有着非常广泛的应用,文件私有数据就是将私有数据private_data 指向设备结构体。open 函数中私有数据的使用如下所示。Linux 中并没有明确规定要使用文件私有数据,但是在 linux 驱动源码中,广泛使用了文件私有数据,这是 Linux 驱动遵循的“潜规则”,实际上也体现了Linux 面向对象的思想。在上述代码中,定义了一个设备结构体 dev1,然后在 open 函数中,将私有数据private_data指向了设备结构体 dev1。

2023-10-24 19:01:32 251

原创 字符设备驱动框架(字符设备基础一)

编写字符设备驱动框架:首先驱动向 Linux 内核进行设备号申请,之后的字符设备注册时,会对申请的设备号进行使用。而 Linux 内核会将字符设备抽象成一个具体的struct cdev结构体,该结构体记录了字符设备的字符设备号、内核对象等信息,cdev_init(…)函数对结构体进行初始化之后,cdev_add(…)函数将设备号和 cdev 结构体进行链接,这时设备号才真正指向了内核中注册的设备。设备注册成功之后,此时还不能对字符设备进行文件操作,所以需要设备节节点来充当内核和用户层通信的桥梁。

2023-10-24 09:10:17 137

原创 RK3568驱动模块编译进内核

然后保存配置将信息保存到.config 文件。首先在drivers/char目录下创建hello文件夹,然后在hello文件夹下创建hello.c 文件、Kconfig和Makefile文件。编译成功之后,进入到 drivers/char/hello 目录下,可以看到会生成对应的.o 文件。需要修改上一级目录的 Kconfig 文件和 Makefile 文件,也就是 driver/char 目录。如果在图形化配置界面中选择的 M,也就是编译成驱动模块,则生成 helloworld.ko 文件。

2023-10-18 16:22:05 282

原创 Linux内核的.config 配置文件和defconfig 配置文件

图形化配置界面配置好了以后,会得到一个.config 配置文件。在编译内核的时候会根据这个.config 文件来编译内核。当我们使用 make menuconfig 的时候,会通过 mconf 程序去解析 Kconfig 文件,然后生成对应的配置文件.config。mconf 程序源码在内核源码 scripts/kconfig 目录下。有了.config 配置文件以后,内核就可以根据这个配置文件来编译内核,比如控制某些驱动编译进内核,或者控制某些驱动不编译内核。

2023-10-18 14:38:12 3215

原创 linux内核模块符号导出

驱动程序编译生成的 ko 文件是相互独立的,即模块之间变量或者函数在正常情况下无法进行互相访问。而一些复杂的驱动模块需要分层进行设计,这时候就需要用到内核模块符号导出。内核符号导出指的是在内核模块中导出相应的函数和变量,在加载模块时被记录在公共内核符号表中,以供其他模块调用。符号导出所使用的宏为 EXPORT_SYMBOL(sym)和 EXPORT_SYMBOL_GPL(sym)。它们定义在 “/include/linux/export.h”文件中。

2023-10-18 14:14:03 277

原创 linux驱动模块传参

驱动模块传参是一种可以随时向内核模块传递、修改参数的方法。例如可以传递串口驱动的波特率、数据位数、校验位、停止位等参数,进行功能的设置,以此节省编译模块的时间,大大提高调试速度Linux 内核提供了 module_param(name, type, perm)、module_param_array(name, type, nump, perm)宏和 module_param_string(name, string, len, perm)宏,分别进行基本类型、数组和字符串参数的传递。

2023-10-18 11:21:51 160

原创 linux静态库与动态库

库是一种可执行的二进制文件,是编译好的代码。使用库可以提高开发效率。在Linux 下有静态库和动态库。静态库在程序编译的时候会被链接到目标代码里面。所以程序在运行的时候不再需要静态库了。因此编译出来的体积就比较大。以 lib 开头,以.a 结尾。使用 ar 命令创建静态库。动态库(动态库也叫共享库)在程序编译的时候不会被链接到目标代码里面,而是在程序运行的时候被载入的。所以程序在运行的时候需要动态库了。因此编译出来的体积就比较小。以lib 开头,以.so结尾。使用 gcc 命令创建动态库。

2023-10-17 19:19:43 282

原创 C++ Builder 将运行时需要的库打进运行的程序包

一、打开【工程】–【选项】–【Linker】-- 设置【Use dynamic RTL】为 False。二、打开【工程】–【选项】–【组件包】-- 设置【和运行时组件包一起编译】为 False。

2023-10-17 16:38:32 84

原创 Linux 下I/O操作

文件 IO 是直接调用内核提供的系统调用函数,头文件是 unistd.h,标准IO 是间接调用系统调用函数,头文件是 stdio.h,文件 IO 是依赖于 Linux 操作系统的,标准 IO 是不依赖操作系统的,所以在任何的操作系统下,使用标准 IO,也就是 C 库函数操作文件的方法都是相同的。文件 IO 是 Linux 系统提供的接口,针对文件和磁盘进行操作,不带缓存机制;标准IO是C 语言函数库里的标准 I/O 模型,在 stdio.h 中定义,通过缓冲区操作文件,带缓存机制。

2023-10-16 20:26:01 196

原创 linux应用程序使用系统命令点亮LED

将字符串输出重定向,当前目录没有 test.txt,则创建 text.txt ,并将字符串输出到test.txt 文件中。和直接使用 vi 编辑器打开 test.txt 然后输入 hello 的效果是一样的。在应用程序中,我们可以使用system 函数来调用命令。

2023-10-16 20:06:46 192

原创 makefile 基本语法(下)

一、wildcard 函数二、notdir 函数三、dir 函数四、patsubst 函数五、foreach 函数

2023-10-16 19:51:12 34

原创 makefile 基本语法(上)

使用这个 makefile 虽然也可以成功编译,但是,一旦编译的文件多了,如果我们还这样来编写makefile就会变得非常复杂接下来我们一步一步的来简化这个 makefile。=”来赋值,如果 变量前面没有被赋值,那么就给它赋值,如果前面已经赋值了,就使用前面的值。使用“=”来赋值,是延迟赋值,使用它来赋值是 makefile 里面最后被指定的值。使用“+=”赋值是追加赋值,是在我们前面定义的好的字符串里面在添加进去新的字符串。= ” “ := ” “ += ”使用“ :=” 给变量赋值,是立刻赋值。

2023-10-16 19:42:27 84

原创 字符设备和杂项设备总结

字符设备是 3 大类设备(字符设备、块设备和网络设备)中的一类,其驱动程序完成的主要工作是初始化、添加和删除 cdev 结构体,申请和释放设备号,以及填充 file_operations 结构体中的操作函数,实现file_operations 结构体中的 read()、write()和 ioctl()等函数是驱动设计的主体工作。

2023-10-12 20:31:47 87

原创 linux驱动模块传参

在装载内核模块时,用户可以向模块传递参数,形式为“insmode(或 modprobe)模块名参数名=参数值”,如果不传递,参数将使用模块内定义的缺省值。如果模块被内置,就无法insmod 了,但是bootloader可以通过在 bootargs 里设置“模块名.参数名=值”的形式给该内置的模块传递参数。

2023-10-12 20:24:33 138

原创 Linux 用户层、内核层和MMU

设备驱动:设备驱动程序(device driver),简称驱动程序(driver),是一个允许高级(High level)计算机软件(computer software)与硬件(hardware)交互的程序,这种程序建立了一个硬件与硬件,或硬件与软件沟通的界面,经由主板上的总线(bus)或其它沟通子系统(subsystem)与硬件形成连接的机制,这样的机制使得硬件设备(device)上的数据交换成为可能。主设备号标识设备对应的驱动程序,次设备号由内核使用,用于确定设备节点所指设备。

2023-10-12 20:08:36 329

原创 MISC驱动

设备号包含主设备号和次设备号,设备号是计算机识别设备的一种方式,主设备号相同的就被视为同一类设备,主设备号在 Linux 系统里面是唯一的,次设备号不一定唯一。所有的 misc 设备驱动的主设备号都为10,不同的设备使用不同的从设备号。注册杂项设备有一个通用的思路和方法,总结为三个步骤:(1)、填充 miscdevice 这个结构体(2)、 填充 file_operations 这个结构体(3)、 注册杂项设备并生生成设备节点。

2023-10-11 19:13:50 113

原创 Linux 环境变量

概念:环境变量是系统预设值的参数。Linux 是一个多用户的操作系统,所以每一个用户也都有自己的环境变量。常用变量 PATH 决定了要去哪个路径下去寻找我们的程序或者命令。使用这个方法环境变量是立刻生效的,但是只是临时改变,我们重新打开再关闭终端就没有了,而且只对当前用户生效。命令格式:export 变量=新增的变量值:$变量。命令格式:export 变量=新增的变量值:$变量。我们直接在这个配置文件里边加上我们的环境变量。更新一下,或者从新打开关闭终端也可以生效。设置完不是立刻生效的,要使用命令。

2023-10-10 20:22:11 134

原创 Linux 文件链接

Linux 下的文件链接有两类。一个是类似于 win 电脑的快捷方式,我们称为软链接,软链接也可以叫做符号链接。另一种是通过文件系统的 inode 连接来产生的,类似于 windows 电脑的复制,但是不产生新的文件,我们称为硬链接。硬链接也可以称作为实体链接。

2023-10-10 19:18:14 494

原创 Linux 常用命令

用创建多级目录,加上-p 参数.例如要在test 路径里面创建一个 test1 ,然后在 test1 下面再创建一个test2。-r 参数:递归复制,就是说我们要把 test 这个目录下所有的东西都复制到 test1 里面去。-l :显示文件的详细信息,比如说文件的形态、权限、所有者、大小信息等。格式:tar [参数] 压缩文件名 要压缩的目录或者文件的名字。ls 命令常用的参数有两个:第一个是 a ,第二个是 l。这个命令有三个常用的参数为 -r -f -i,注意:删除目录一定要加上 -r 参数。

2023-10-10 17:39:42 3985

原创 Vim编辑器的使用

我们要切换到编辑模式,直接按键盘上的 i ,出现 INSERT ,则现在所处的模式就是编辑模式。这三种模式我们都是通过 ESC 来退回的,是按键盘上的“:”,或者是“i”键来切换的,这就是 vi 编辑器的三种模式。这个命令它会与我们使用apt-get update 下载的软件列表的软件进行对比,如果发现安装的版本过低,就会提示更新,如果软件已经是最新版本,就不必要更新了。软件的卸载,我们使用的是 apt-get remove 加我们软件的名字,我这里卸载安装的vim软件,我们输入。下载前首先要更新软件。

2023-10-10 11:37:38 3302

原创 Ubuntu 启用 root 用户

在安装系统的时候, root 用户是被禁用的,提示创建的用户是被分到 admin 组的,使用 admin 组的用户,可以启用并设置 root 用户。

2023-10-10 10:54:28 4929

原创 buildroot添加package包

本文通过一个简单的例子介绍如何在 RK3568的buildroot/package 目录下添加一个自己的package(软件包)

2023-10-06 19:09:54 4837

原创 Buildroot添加自定义文件

  在日常开发中,我们经常会向buildroot文件系统里添加自定义文件。本文介绍几种添加的方法  skeleton能够在目标文件系统编译完成后将指定文件覆盖到某个目录。通过这种方式,我们可以方便地添加或修改一些文件到根文件系统。此目录有着有则覆盖,无则新建的特性。  比如说,在开发板的/根目录下创建app目录,具体步骤如下所示:  若buildroot/system/skeleton目录下无app目录,新建即可,之后放进app目录的文件会覆盖开发板上的app目录,保持有则覆盖,无则新建的特性。  重新

2023-09-26 19:58:27 6159

ZMQ安装包V4.3.4

ZMQ安装包V4.3.4

2023-01-04

Boost程序库完全开发指南.pdf

Boost程序库完全开发指南.pdf Boost库使用入门手册!

2017-09-29

空空如也

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

TA关注的人

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