linux驱动
文章平均质量分 65
Kashine
欢迎大家加入QQ群交流,编程语言、单片机、linux应用驱动等技术
展开
-
linux开发板访问互联网 笔记本win10中虚拟机
一、需求分析开发平台:物理机:笔记本 windows10虚拟机:Ubuntu16.04开发板:正点原子阿尔法I.MX6ULL在开发板、虚拟机、物理机相互ping通的情况下,使物理机的无线网共享给linux开发板和虚拟机中的Ubuntu使用。也就是说只要笔记本连接无线网(不能是校园热点),那么虚拟机和linux开发板都能访问互联网。二、物理机配置1. 网络信息查看打开网络适配器选项:先来介绍一下这些网卡,简单来讲,无线网卡就是你的wifi,有线网卡就是你的网线。原创 2022-04-14 21:06:30 · 1901 阅读 · 0 评论 -
【005 中断】IRQ和FIQ有什么区别,在CPU里面是是怎么做的?
IRQ与FIQ是ARM处理器的两种不同编程模式。原创 2023-06-15 22:56:19 · 2043 阅读 · 0 评论 -
【008 基础知识】什么是GPIO?
例如用一根引脚连到led的一极来控制它的亮灭,也可以用一根(一些)引脚连到一个传感器上以获得该传感器的状态,这给cpu提供了一个方便的控制周边设备的途经。原创 2023-06-15 22:13:28 · 138 阅读 · 0 评论 -
【003 中断】tasklet和workqueue的区别和底层实现的区别
(1)softirq和tasklet都属于软中断,tasklet是softirq的特殊实现;workqueue是普通的工作队列。(2)tasklet和workqueue,两者都是中断下半部的一种实现方法。区别在于workqueue基于线程的封装,原创 2023-06-15 21:37:02 · 538 阅读 · 0 评论 -
【004 中断】中断和轮询哪个效率高?怎样决定是采用中断方式还是采用轮询方式去实现驱动?
中断是CPU处于被动状态下来接受设备的信号,而轮询是CPU主动去查询该设备是否有请求。或者有大量数据请求的网络设备,那么轮询的效率比中断高。2.如果是一般设备,并且该设备。则用中断效率要高一些。原创 2023-06-15 13:14:48 · 654 阅读 · 0 评论 -
【007 基础知识】驱动里面为什么要有并发、互斥的控制?如何实现?讲个例子?
指的是多个执行单元同时、并行被执行,而解决竞态问题的途径保证对共享资源的互斥访问。所谓就是指。原创 2023-06-14 13:31:44 · 803 阅读 · 0 评论 -
【006 基础知识】实现原子操作有哪些方法?
原子操作关注点在于数据安全;同步机制关注点在于线程安全。原创 2023-06-14 13:07:27 · 159 阅读 · 0 评论 -
【005 基础知识】Linux同步机制?
使用同步机制(如互斥锁、信号量等),可以如不采取必要的同步措施,将会对一些关键数据结构进行交错访问和修改,从而导致这些数据结构状态的不一致,进而导致系统崩溃。因此,为了确保系统高效稳定有序地运行,linux 必须要采用同步机制。原创 2023-06-14 10:52:05 · 1022 阅读 · 0 评论 -
【011 设备驱动】framebuffer机制?
Framebuffer设备是标准的字符设备,主设备号为29,对应于/dev/fbn设备文件。Framebuffer是linux系统为显示设备提供的一个接口,它将显示缓存区抽象,允许上层应用程序在图形模式下。转载 2023-06-13 16:06:44 · 127 阅读 · 0 评论 -
【004 基础知识】列举最少3种你所知道的嵌入式的体系结构,并请说明什么是ARM体系结构
复杂指令集(CISC)和精简指令集(RISC)。怎么说这两个的区别呢?CISC的设计思路更加注重性能的发展,是一种高性能高功耗的芯片,在高密度的计算上更具有优势;RISC的设计思路更注重低功耗小尺寸,多用于移动端设备,在重复性任务上占优。ARM架构,过去称作进阶精简指令集机器(Advanced RISC Machine,更早称作:Acorn RISC Machine),是一个32位精简指令集(RISC)处理器架构,其广泛地使用在许多嵌入式系统设计。原创 2023-06-13 15:54:35 · 344 阅读 · 0 评论 -
【003 基础知识】嵌入式系统中的死循环C语言写法
每循环一次都要判断常量1是不是等于零,在这里while比for多做了这点事不过从汇编的角度来说,都是一样的代码。空语句,编译器一般会优掉的,直接进入死循环。转载 2023-06-13 15:26:32 · 255 阅读 · 0 评论 -
【010 设备驱动】ioctl和unlock_ioctl有什么区别?
大部分驱动除了需要具备读写设备的能力外,还需要具备例如,要求设备报告错误信息,改变波特率,这些操作常常通过ioctl方法来实现。原创 2023-06-13 14:55:54 · 815 阅读 · 0 评论 -
【007 Linux内核】内核函数mmap的实现作用
mmap 的全称是 memory map,中文意思是。其用途是:将文件映射到中,这样就可以效果等同于直接读写该文件。原创 2023-06-13 12:42:39 · 156 阅读 · 0 评论 -
【001 基础知识】自旋锁、信号量
五、在中断服务程序里面的互斥是使用自旋锁还是信号量?使用自旋锁的进程不能睡眠,使用信号量的进程可以睡眠。四、自旋锁和信号量在互斥使用时需要注意哪些?三、自旋锁和信号量的区别。原创 2023-06-13 09:16:04 · 1108 阅读 · 0 评论 -
【002 基础知识】什么是原子操作?
不行。这种方法有几个问题:线程上下文切换。如果在一个线程正持有锁时,线程上下文发生切换,切换到另一个线程,那么这个另一个线程也可能通过if条件进入临界区,导致两个线程同时访问临界区。重入。如果一个线程需要重复访问临界区,需要加锁多次,这种方法实现不了。优雅抛出异常。如果在临界区发生异常,需要释放锁,这种方法没有提供释放锁的方式。扩展性差。如果后期需要支持多线程同时访问指定数量的资源,这种方法很难实现。所以,这种简单的自旋锁的实现并不可靠,不适用于生产环境。flag = 1;//3。原创 2023-06-12 09:30:21 · 350 阅读 · 0 评论 -
【007 设备驱动】copy_to_user()和copy_from_user()主要用于实现什么功能?一般用于file_operations结构的哪些函数里面?
由于内核空间和用户空间是不能互相访问的,如果需要访问就必须借助内核函数进行数据读写。当然,如果ioctl没有用到内存数据复制,那么就不会用到这两个函数。一般用于file_operations结构里的。copy_from_user():是完成。copy_to_user(): 完成。转载 2023-06-09 09:56:56 · 222 阅读 · 0 评论 -
【006 Linux内核】应用程序中open()在linux中执行过程中是如何从用户空间到内核空间?
当我们在用户空间想要实现对内核的操作,比如使用 open 函数打开/dev/led 这个驱动,由于用户空间不能直接对内核进行操作,因此必须使用一个叫做的方法来实现从用户空间“陷入”到内核空间,这样才能实现对底层驱动的操作。原创 2023-06-08 14:16:40 · 1024 阅读 · 0 评论 -
【005 Linux内核】什么是内核链表?为什么内核链表具有通用性?
内核链表一般就是就像一条绳子串起所有的结构体,这样做的好处,就是可以用内核链表来串起各个不同类型的结构体。内核中由于于是内核设计者就想到了使用通用链表来处理,原创 2023-06-08 08:59:26 · 127 阅读 · 0 评论 -
【004 Linux内核】用户空间与内核通信方式有哪些?
对于进程来说,它既有也有不管是内核空间还是用户空间,它们都处于虚拟地址空间。内核空间和用户空间交换数据的方式有很多。用户空间发起的有系统调用、proc、虚拟文件系统等。内核空间主动发起的有get_user/put_user、信号、netlink等。原创 2023-06-07 14:31:39 · 1858 阅读 · 0 评论 -
【003 Linux内核】什么是内核空间,用户空间?
对 32 位操作系统而言,它的寻址空间(虚拟地址空间,或叫线性地址空间)为 4G(2的32次方)。也就是说一个进程的最大地址空间为 4G。操作系统的核心是内核(kernel),它独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。具体的实现方式基本都是由操作系统将虚拟地址空间划分为两部分,一部分为内核空间,另一部分为用户空间。针对 Linux 操作系统而言,最高的 1G 字节(从虚拟地址 0xC0000000 到 0xFFFFFFFF)由内核使用,称为内核空间。原创 2023-06-06 13:30:37 · 2398 阅读 · 0 评论 -
【002 Linux内核】内核中申请内存有哪几个函数?有什么区别?
kmalloc() 申请的内存位于物理内存映射区域,而且在物理上也是连续的,它们与真实的物理地址只有一个固定的偏移,因为存在较简单的转换关系,所以对申请的内存大小有限制,不能超过128KB。原创 2023-06-06 08:49:05 · 1009 阅读 · 0 评论 -
【006 设备驱动】insmod,rmmod一个驱动模块,会执行模块中的哪个函数?
即init申请,eixt释放。要注意的就是,尽量使。原创 2023-06-03 22:41:27 · 282 阅读 · 0 评论 -
【005 设备驱动】驱动中操作物理绝对地址为什么要先ioremap?
要映射给的物理起始地址。要映射的内存空间大小。ioremap 的类型,可以选择 MT_DEVICE、MT_DEVICE_NONSHARED、MT_DEVICE_CACHED 和 MT_DEVICE_WC,ioremap 函数选择 MT_DEVICE。__iomem 类型的指针,指向映射后的虚拟空间首地址。原创 2023-06-03 22:34:55 · 776 阅读 · 0 评论 -
【004 设备驱动】字符设备和块设备有什么主要区别?
提供连续的数据流,应用程序可以顺序读取,通常不支持随机存取。相反,此类设备支持按字节/字符来读写数据。字符终端、串口、鼠标、键盘、摄像头、声卡和显卡等就是典型的字符设备。1.字符设备只能以字节为最小单位访问,而块设备以块为单位访问,例如512字节,1024字节等2.块设备可以随机访问,但是字符设备不可以3.字符和块没有访问量大小的限制,块也可以以字节为单位来访问。原创 2023-06-02 13:08:09 · 1079 阅读 · 0 评论 -
【002 设备驱动】/dev/下面的设备文件是怎么创建出来的?
驱动加载成功需要应用程序就是通过操作这个设备节点文件来完成对具体设备的操作。原创 2023-06-02 10:36:39 · 1389 阅读 · 0 评论 -
【002 中断】为什么中断要区分上半部和下半部?
中断处理函数执行时间越短越好,但是有些中断处理过程就是比较费时间。因此,那些对时间敏感、执行速度快的操作可以放到中断处理函数中,也就是上半部。剩下的有工作都可以放到下半部去执行。原创 2023-06-01 20:55:55 · 879 阅读 · 0 评论 -
【001 中断】什么是硬中断?什么是软中断?它们有什么区别?
主要是用来通知操作系统系统外设状态的变化。比如当网卡收到数据包的时候,就会发出一个中断。我们通常所说的中断指的是硬中断(hardirq)。原创 2023-06-01 20:39:21 · 1706 阅读 · 0 评论 -
【Linux驱动开发】024 INPUT子系统
左边就是最底层的具体设备,比如按键、USB 键盘/鼠标等,中间部分属于Linux 内核空间,分为驱动层、核心层和事件层,最右边的就是用户空间,所有的输入设备以文件的形式供用户应用程序使用,可以看出 input 子系统用到了我们前面讲解的驱动分层模型。我们编写驱动程序的时候只需要关注中间的驱动层、核心层和事件层,这三个层的分工如下:驱动层:输入设备的具体驱动程序,比如按键驱动程序,向内核层报告输入内容。核心层:承上启下,为驱动层提供输入设备注册和操作接口。通知事件层对输入事件进行处理。原创 2023-04-11 23:27:46 · 1590 阅读 · 0 评论 -
【Linux驱动开发】023 platform设备驱动
如果id_table不存在的话,直接比较驱动和设备的name字段,相当表明匹配成功。原创 2023-04-11 09:28:09 · 2164 阅读 · 0 评论 -
【Linux驱动开发】022 异步通知
阻塞读取以及非阻塞读取这两种方法都是应用程序主动读取,但是最好的方式就是驱动程序能够主动发送信号给应用程序,表示驱动已经准备好读取或写入数据。接下来我们就开始学习通过异步通知完成按键的读取工作。...............原创 2022-06-05 10:00:42 · 313 阅读 · 0 评论 -
【Linux驱动开发】021 非阻塞IO
应用程序以非阻塞形式访问设备文件,驱动程序就需要相应的非阻塞处理方式,也就是轮询。应用程序中进行非阻塞访问的函数有三个:select、poll、epoll函数,这三个函数的主要作用就是:在应用程序中查询设备是否可以操作,如果可以操作就从设备读取或写入数据。......原创 2022-06-06 13:31:20 · 686 阅读 · 0 评论 -
【Linux驱动开发】020 阻塞IO
阻塞访问:当进程访问的驱动不可用或数据未准备好时,进程进入interruptible的休眠状态,也就是将当前进程添加到等待队列,等到按键按下进入中断,在中断中将线程唤醒(如果通过定时器消抖也可以在定时器中将线程唤醒),读取按键值。...原创 2022-06-07 10:21:45 · 533 阅读 · 0 评论 -
【Linux驱动开发】019 中断
我们在使用 request_irq 申请中断的时候注册的中断服务函数属于中断处理的上半部,只要中断触发,那么中断处理函数就会执行。我们都知道中断处理函数一定要快点执行完毕,越短越好,但是现实往往是残酷的,有些中断处理过程就是比较费时间,我们必须要对其进行处理,缩小中断处理函数的执行时间。比如电容触摸屏通过中断通知 SOC 有触摸事件发生,SOC 响应中断,然后通过 IIC 接口读取触摸坐标值并将其上报给系统。原创 2023-04-10 20:50:23 · 1925 阅读 · 0 评论 -
【Linux驱动开发】018 内核定时器
硬件定时器提供时钟源,时钟源的频率可以设置, 设置好以后就周期性的产生定时中断,系统使用定时中断来计时。中断周期性产生的频率就是系统频率,也叫做节拍率(tick rate)(有的资料也叫系统频率),比如 1000Hz,100Hz 等等说的就是系统节拍率。Linux 内核中有大量的函数需要时间管理,比如周期性的调度程序、延时程序、对于我们驱动编写者来说最常用的定时器。原创 2023-04-01 12:03:15 · 1184 阅读 · 0 评论 -
【Linux驱动开发】017 信号量与互斥体
举一个很常见的例子,某个停车场有 100 个停车位,这 100 个停车位大家都可以用,对于大家来说这100 个停车位就是。假设现在这个停车场正常运行,你要把车停到这个这个停车场肯定要先看一下现在停了多少车了?还有没有停车位?当这个值到 100 的时候说明停车场满了。比如 A 与 B、C 合租了一套房子,这个房子只有一个厕所,一次只能一个人使用。某一天早上 A 去上厕所了,过了一会 B 也想用厕所,因为 A 在厕所里面,所以 B 只能等到 A 用来了才能进去。原创 2023-04-01 09:23:26 · 1034 阅读 · 0 评论 -
【Linux驱动开发】016 自旋锁
原子操作只能对整形变量或者位进行保护,但是,在实际的使用环境中怎么可能只有整形变量或位这么简单的临界区(所谓临界区就是共享数据段)。比如,这些工作上面的原子操作都不能胜任,需要本节要讲的锁机制,在 Linux内核中就是自旋锁。自旋锁正在被线程 A 持有,线程 B 想要获取自旋锁,那么线程 B 就会处于忙循环-旋转-等待状态,线程 B 不会进入休眠状态或者说去做其他的处理,而是会一直傻傻的在那里“转圈圈”的等待锁可用。从这里我们可以看到自旋锁的一个。原创 2023-03-31 13:14:02 · 1318 阅读 · 0 评论 -
【Linux驱动开发】015 原子操作
C 语言要先编译为成汇编指令,ARM 架构不支持直接对寄存器进行读写操作,比如要借助寄存器 R0、R1 等来完成赋值操作。//定义原子变量 b 并赋初值为 0,宏 ATOMIC_INIT 向原子变量赋初值。来完成此功能,Linux 内核提供了两组原子操作 API 函数,一组是对整形变量进行操作的,一组是对位进行操作的。ldr r1, = 3 /* 要写入的值 *///定义原子变量 a,可以理解为上面的a,通过a可以调用原子函数。举个例子:C语言中a=3。原创 2023-03-31 10:12:31 · 1086 阅读 · 0 评论 -
【Linux驱动开发】014 并发与竞争
并发就是多个“用户”同时访问同一个共享资源,并发访问带来的问题就是竞争。原创 2023-03-31 13:12:20 · 134 阅读 · 0 评论 -
【Linux驱动开发】013 与gpio相关的OF函数
在上节,我们提供了驱动中gpio子系统相关的API函数,主要用来申请释放gpio、设置gpio输入输出、获取设置gpio的值。我们进行上述设置的前提是:在驱动程序中需要读取 gpio 属性内容。为此,Linux 内核提供了几个与 GPIO 有关的 OF 函数。用于统计设备树某个属性里面定义了几个 GPIO 信息,要注意的是空的 GPIO 信息也会被统计到:of_gpio_named_count 函数可以统计任意属性的 GPIO 信息,而此函数统计的是 “gpios” 这个属性的 GPIO 数量:此函数获取原创 2023-03-26 11:33:56 · 1342 阅读 · 0 评论 -
【Linux驱动开发】012 gpio子系统API函数
gpio 子系统向驱动开发人员屏蔽了具体的读写寄存器过程。这就是驱动分层与分离的好处,大家各司其职,做好自己的本职工作即可。此函数用于设置某个 GPIO 的值,此函数是个宏,定义如下。用于申请一个 GPIO 管脚,在使用一个 GPIO 之前,原创 2023-03-26 11:15:25 · 1481 阅读 · 0 评论