- 博客(9)
- 资源 (6)
- 收藏
- 关注
原创 mmap(内存映射)
1、mmap的引入我们都知道,应用程序是不能直接访问驱动程序的。对于数据量较小的数据交互,我们可以使用copy_to_usr()(read())和copy_from_usr()(write())来进行用户态buffer和内核态buffer之间的拷贝。但是,对于数据量较大的情况,还用这种方式进行buffer的拷贝,效率低下。为了解决这个问题,我们使用mmap()。将内核态的buffer映射到用户态,让APP直接在用户态进行读写。2、什么叫内存映射问题的引入:当我们同时运行两个程序:我们可以看出
2021-04-15 15:58:30 3906
原创 linux之定时器
1 问题的引入—》软件消抖在实际的应用中,如按键按下的的现象应该是:松开(高电平)-》按下(低电平)-》松开(高电平)但是由于实际按键的硬件原因导致的机械抖动,会导致产生多次中断,上报多次按键值。可是实际上,我们只要一次按键值。为了避免这种情况的发生1)、我们可以使用中断来处理,死等:在按键中断程序中,可以循环判断几十亳秒,发现电平稳定之后再上报。但是这样违背了中断的原则之一:将尽可能的快。2)、使用定时器每次产生中断,在中断执行函数中,我们做的不是读按键值,而是修改定时器的超时时间:
2021-04-15 15:28:09 299
原创 POLL机制
1、poll机制概述使用休眠和唤醒机制等待某个事件发生,方法简单。但是不能做其他事情。因为如果一个事件等待很久才发生,那么我就要一直等待。为了避免这种事情的发生,我们给他加上一个超时时间,这就是poll机制。2、实现流程其核心的实现流程如下:但是在内核中,他具体的实现方式如下:驱动程序部分:在应用程序中,可以指定poll的休眠时间:总结:对于POLL机制的使用,对于驱动编写人员来说,只是做了两件事情:1、使用poll_wait()函数,将线程放入等待队列(
2021-04-15 15:18:56 1791 1
原创 休眠与唤醒
本文的分享,基于获取按键值得历程:1、用户程序通过休眠与唤醒机制获取按键值图示2 重要函数分析这里,我们重点分析两个函数。1)、休眠函数2)、唤醒函数函数分析:wake_up函数哪里找到要唤醒的进程或者线程呢?答案就是他的参数:wq(wait queue),等待队列.他会从这个队列里面,取出线程。进行唤醒。当某个进程、线程要休眠的时候,他会调用休眠函数wait_event_xx将自己放入到等待队列中。event参数的含义是,false:不休眠。true:休眠。
2021-04-15 15:09:27 571
原创 linux中断系统中,重要的数据结构
1、硬件中断的发生这里举得例子有点难度,我们先来介绍一下:什么是共享中断?多个中断源,使用同一个GPIO引脚(这个GPIO引脚,已经配置好了,用做中断引脚)。2 中断系统中用到的关键结构体:3 硬件中断号和虚拟中断号3.1 假设,有两个中断,分别是GPIO1模块中的5号中断和GPIO2模块中的5号中断。虽然他们用的是同一号中断,但是属于不同的模块。显然,在设备树中,他们的配置是不同的。在设备树中,指定一个中断的方式如下://表示要使用的GPIO 1模块里面的引脚interrupt -
2021-04-15 14:59:45 151
原创 linux中,中断的处理方法的改进 中断线程化
前言之前使用的用内核线程去处理中断(任务队列),对于单CPU系统来说,是很高效的一种方式,但是随着CPU越来越多,这种方法就显得不是很高效。因为,一个CPU只能创建一个内核线程Kworker。多个中断的work都是由一个worker线程来处理。这会导致内核线程kworker对CPU的占用率过高,而其他CPU却空着。这对于多CPU系统来说,显然不能被接收!!1 改进改进的地方在于:我们不用再自己定义work结构体,也无需再使用函数schedule_work(&work)。我们可以使用reque
2021-04-15 14:55:17 426
原创 linux中,中断的处理方法 工作队列
1、前言为了提高中断的执行速度,我们将不是特别耗时的任务交给下半部tasklet来做(tasklet在在中断的上下文中工作,无法休眠),但是,当有非常复杂的操作需要执行的时候,如果依旧采用下半部tasklet来做,虽然系统依旧可以响应中断,但是,应用应用程序是不能执行的。因为整个系统都在执行软中断或是硬中断。将耗时的操作放在某一个线程(内核线程)去做,可以解决系统的卡顿问题,因为线程可以休眠。这就是工作队列。2 内核线程的介绍:内核会为我们自动创建一个kworker线程(一个CPU一个*),每个
2021-04-15 14:47:27 464
原创 RK3399 tftp和nfs服务器的搭建
自己编译buileroot固件,在uboot命令行ping不通虚拟机。无法使用tftp和nfs。排查流程:1、启动开发板,进入跟文件系统,参考正点原子的测试。发现tftp和nfs都无问题。排除,是tftp和nfs配置出错的原因,也排除防火墙原因。2、换用官方的buildroot固件,同样不能ping通。排除是编译问题。突发奇想。用ubuntu固件的u-boot,用自己编译的内核和buildroot的跟文件系统启动。结果,能启动内核,但是不能挂在跟文件系统。总结,和nfs有关,还未进行排查的地方
2021-04-10 22:07:10 528
原创 linux中,中断的处理方法 tasklet软中断
1、在linux中,对中断的处理有原则对中断的处理原则有两个:1)、中断不能嵌套中断(即使发生了更高优先级的中断)–》防止栈空间不够用。因为每个中断被执行,都要先保存现场。如果中断1在执行的过程中,嵌套了中断2;那么在中断2在被执行之前,中断1的现场应该先被保存(保存在栈中)。同样,如果还嵌套了其他中断,还要将现场保存在栈中。这样,就会发生一个问题,如果嵌套的中断很多,那么可能会导致栈空间不够用。为了避免这个问题,不允许中断嵌套。2)、对中断的处理应当越快越好。假设系统只有一个CPU,一个进程在执
2021-04-01 13:25:33 521
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人