自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(87)
  • 资源 (1)
  • 收藏
  • 关注

原创 linux-3.4.2 的v4l2驱动框架分析

应用程序调用时,其实就是去打开__video_register_device里注册的字符设备文件,本质上就是去调用v4l2_fops里的那些函数,例如当打开一个文件时,就会调用v4l2_fops的open函数,open函数里会通过打开的文件属性获得数组下标找到video_device,在进行相关判断后会调用video_device的fops的open函数,也就是vivi_template的fops的open函数,其他读写函数调用也是如此。__video_register_device注册时存放到数组里的。

2023-08-21 17:29:03 273

原创 内核驱动调试常用方法

当然,如果内核没有打印回溯信息,自己可以通过栈信息推导出调用链,因为当前错误指令地址会被打印,而通过该指令可以具体定位到是哪个模块的函数出了错(剧吐定位方法和前面说过的一样),然后反汇编该模块,通过对照汇编码和栈信息就可以找出该函数的lr寄存器保存的调用函数下一条指令的pc值,该pc一定属于调用函数的一本分,通过搜索就可以找到调用函数,依次按此方法进行递归查找,最终就会找到一条完整的调用关系链。前面我们说了裸机调试常用方法,当然,在linux内核上进行驱动开发也也有常见方法。一般为打印法(printk)

2023-07-04 11:50:56 369

原创 驱动开发之常见裸机调试方法

所谓点灯法就是在没有串口打印的情况下,如果要找到某段代码哪里出了问题,则用一段可使led灯亮的断码放在该段代码某处,如果led亮则证明该位置之前的断码没有问题,然后继续挪动点灯代码,直到找到一个led不能亮的位置,则该位置之前的代码就是问题代码。软件断点流程为:如果需要把数据为123的某地址设为断点,那么就把地址A或B的数据修改为123即可,这样当运行到A或B地址处就会产生断点,当然这样做提前提前保存A或B地址处的值,断点后需要恢复A或B处的值。.当jtag的地址等于某个值时,让cpu停止(硬件断点)

2023-07-03 20:52:37 538

原创 linux-2.6.22.6内核i2c驱动框架源码分析

接下来就是发数据了,这个过程是由8个数据位和一个ack位组成,如果是读,这8位数据由从机驱动,第9位ack由主机发出(因为此时是主机向从机读数据,主机需要确认是否收到数据),如果是写,则这8位由主机驱动,第9位ack由从机发出,发数据这个过程是可以反复进行的,一旦发送或者读取完成,主机就会发出一个停止信号(SDA由低变高)来结束通信,这所有的过程都是在SDA上进行的。开发一个i2c驱动时,我们只需关心从设备部分,主要提供主机控制器操作所需要的从设备信息,这就是另一部分。i2c框架主要分为两大部分,

2023-07-01 17:07:12 444

原创 linux-2.6.22.6内核网卡驱动框架分析

cs89x0_probe1里又进一步对net_device 进行了填充,其中hard_start_xmit 就是发送数据函数,然后通过register_netdev进行注册。入口函数里,首先分配了net_device 结构体,然后对该结构体进行进行填充,最后调用cs89x0_probe1进行下一步处理。总结:发送数据和接受数据是通过hard_start_xmit 和netif_rx完成的,而数据的载体都是sk_buff 结构体。net_interrupt里又调用net_rx(dev);

2023-07-01 09:38:48 151

原创 linux-2.6.22.6内核nand flash框架分析

总结:块设备和字符设备这两类存储类驱动最终都会用到nand_scan_tail里面构造的mtd_info信息,最终的的读写函数都会定位到mtd_info的具体函数,不过块设备更复杂,分层更多,它主要分为硬件层、nand协议层和块设备层,硬件层知道怎样发命令,需要构造nand_chip结构体,协议层知道要发什么来操作。主要构造mtd_info结构体,块设备层使用mtd_info信息,并用电梯调度算法进行优化。

2023-06-29 18:29:14 215

原创 linux-2.6.22.6内核总线设备驱动模型

在led_probe里获取了device信息,并创建了设备信息,应用程序就可依此进行相关操作。开发一个驱动程序时,不免涉及到对硬件的相关操作,例如读取寄存器和引脚,在不利用任何框架的基础上,硬件代码总是和其他操作耦合到一块,这样做的坏处是代码耦合性太强,例如有三盏led灯,驱动程序每次只打开一盏灯,就如想换盏灯打开,那么每次都得修改寄存器和引脚等硬件相关的信息,由于对硬件的操作是通用性的,而这些操作和硬件本身的信息封装在了一块,所以这种修改可能会对这些通用操作产生影响。

2023-06-25 17:24:16 118

原创 linux-2.6.22.6内核之输入子系统

利用input子系统开发驱动时,只需构造input_dev进行填充注册即可,input_handler层是系统已经实现好了的,当进行dev和handler注册时会进行两边id匹配,如果匹配上则调用handler的connect函数,connect会创建input_handle结构体并且把其添加到dev和handle的链表里,input_handle又保存了当前handler和dev,这样handler和dev就能查找链表找到input_handle从而找到对方。

2023-06-25 12:18:23 280

原创 yaffs文件系统测试

4.按照之前的步骤重新对文件系统进行配置,唯一不同的是lib库要使用arm-linux-gcc-4.3.2版版本的,注意要使用armv4t下的lib库,我的是/home/book/work/gcc/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib。3.按照之前的步骤重新对busybox进行编译后make install。1.前面我制作好了文件系统烧到开发板运行后,出现了如下错误。

2023-06-23 20:15:02 92

原创 yaffs格式的根文件系统制作

linux内核启动后,它接下来要做的事就是启动应用程序,而应用程序在哪里呢,类比windows,启动时要读取c盘,所以linux的文件系统就类似于c盘,并且我们使用的ls、cp等一些类命令(本质是应用程序),也都在根文件系统上,这些程序都来源于busybox,所以根文件系统制作需要busybox。13,由于应用程序需要c库,所以文件系统也需要安装这个库,这个库就用交叉编译链lib目录下的动态文件,在文件系统根目录下创建lib目录,然后把编译链lib目录下的动态文件拷贝过去就行。

2023-06-22 23:13:40 453

原创 驱动之按键防抖

4.例如,mod_timer(&buttons_timer, jiffies+HZ/100)就表示把定时器中断时间每次延迟10ms,直到定时器中断在最后一次按键中断,设置的时间产生中断时,才会去读取按键值,这就相当于把读取按键值延迟到最后一次按键中断里,这样就避免了按键抖动带来的读取值不准确的问题。2.为了保证读取的值是准确的,则应该在最后一次中断里读取按键值,定时器的解决思想是,因为定时器也会在指定的时间产生中断,并且它的中断时间是可以修改的,所以把读取按键值的逻辑放在定时器的处理函数里。

2023-06-21 00:41:24 506

原创 linux-2.6.22.6内核信号量、阻塞和费阻塞

所以,信号量其实就代表着互斥锁,当某个进程获取到这个信号量时,其他进程就只能进入休眠状态,只有当该信号量被之前占用的进程释放后,当前进程才能被唤醒获取到信号量,所以这就很好对共享资源进行了保护。

2023-06-20 23:43:52 60

原创 linux-2.6.22.6内核原子操作

由于这三步不是原子操作,所以当app1读取lock_val的值为1但没修改时,app2又进来读取lock_val的值,此时lock_val仍为1,所以app2把lock_val减一并打开设备,此时app1读取的还是原先的1,所以app1也会把lock_val减一并打开设备,此时app1和app2同时打开了设备,这种情况虽然发生概率很小,但仍有可能发生,所以需要把lock_val定义成原子变量。1.读取lock_val的值。2.修改lock_val的值。3.把修改后的值放回去。

2023-06-20 19:37:57 66

原创 linux-2.6.22.6内核异步通知

应用程序也通过 signal(SIGIO, my_signal_fun)进行了注册,此时注册函数my_signal_fun就会读取按键值,这就是异步通知,不用应用程序主动查询状态,而是产生结果后主动通知应用程序。fcntl会把自己的pid告诉通知方,Oflags 和fcntl会改变flag状态从而触发s3c24xx_fasync的调用,s3c24xx_fasync调用fasync_helper对button_async进行初始化,button_async是异步通知需要的参数,这是自动进行的。

2023-06-20 18:40:09 68

原创 linux-2.6.22.6内核poll总结

2.poll的执行流程为,当应用层调用poll函数时,会调用内核里面的sys_poll,sys_poll里的调用关系如下,也就是说最终通过do_pollfd这个函数去调用驱动的poll,如果驱动poll不返回0,则count++,在下面的if判断中成立,则跳出循环,并返回count,此时count不为0,代表有结果产生,如果为0,代表没有结果产生,应用层依次来判断是否继续某个操作。当然这是符合常理的,按下按键,代表有中断产生,就应该把休眠的读数进程唤醒,去读取按键值。

2023-06-20 16:15:19 205

原创 linux-2.6.22.6内核值中断总结

2.irq_desc数组用来记录中断处理相关信息,irq_desc这个结构体里面有个handle_irq函数、irq_chip结构体以及irqaction结构体,handle_irq函数里面会调用handle_irq_event函数和irq_chip底层函数,handle_irq_event进行真正的中断处理,irq_chip用来进行清零和使能中断等操作。handle_irq和irq_chip是在s3cxxx_init里面进行设置的。

2023-06-20 14:48:21 41

原创 SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

:SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

2022-07-23 10:01:04 460 1

原创 SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

:SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

2022-07-23 10:01:04 521

原创 mybatis学习

org.mybatismybatis3.5.7

2022-07-21 23:07:33 87

原创 springmvc

代码】springmvc。

2022-07-21 11:28:59 113

原创 spring注解驱动开发

aop面向切面编程,指程序运行期间动态的将某段代码切入到指定方法指定位置执行的编程方式。2种方式激活某个环境数据源。spring思想总结。

2022-07-20 14:15:42 145

原创 springboot数据访问

配置数据源。

2022-07-19 20:39:17 156

原创 java日志框架

默认配置指定配置。

2022-07-19 11:09:47 60

原创 JUC并发编程-常用辅助类

StampedLock是一种比ReentrantReadWriteLock效率更高的锁,他是基于乐观锁的思想,也就是多个线程一开始在读的时候并不加锁,只有当当数据被其他线程修改后才会加读锁。

2022-07-18 13:30:01 106

原创 JUC并发编程-锁原理

所谓aba问题是指,一个线程把某个值从a改成b,最后又改回a,而另一个线程在获取该值时无法感知到它被修改过,所以依然能够进行cas操作,AtomicReference是无法解决该问题的,AtomicStampedReference是可以解决的,通过版本管理。jdk1.6开始synchronized进行了优化,因为monitor本身是一个重量级锁(需要用户态和核心态的转换),所以1.6开始进行了一个锁膨胀(无锁->偏向锁->轻量级锁->重量级锁)以及锁消除,锁粗化,自旋优化。.........

2022-07-17 15:59:19 233

原创 java多线程

使用yiled方法和设置优先级最终并不能真正控制线程的调度,决定权在调度器那里。

2022-07-15 11:44:07 148

原创 java集合框架

1.集合架构图 2.Collection常用功能 3.迭代器iterator,因为不同集合的存取数据方式不一样,所以迭代器的出现提供了通用的取数方法 4.迭代器原理 5.List接口,三大特点:有序的,即存储和取出顺序相同,可以重复,含有特有的包含索引的方法. 6.ArrayList集合,非同步,线程不安全 7.LinkedList集合,非同步,线程不安全 add类方法 get类方法 remove类方法 8.Vector集合,底层也是数组,同步,线程安全9.Set接口,无序,不重复.非同步,不能使用for循

2022-07-14 16:02:20 69

原创 java泛型

1.不使用泛型,默认存储Object类型,Object可以存贮任意类型元素,例如存储整型和字符串,当需要使用字符串的方法时,就会把所有元素全部转化成字符串,这时整型转换就会出现类型转化异常,而使用泛型时存储元素类型就会确定,不需要进行转型,如果不合法编译期间就会报错,并且真正数据类型在使用时才确定,这样不写死更灵活. 2.定义和使用含有泛型的类 3.定义和使用含有泛型的方法 4.定义和使用含有泛型的接口具体类型由实现类确定 接口使用什么泛型,实现类就使用什么泛型 5.泛型通配符 6.泛型通配符的受限..

2022-07-13 16:47:56 209

原创 java异常

1.异常的概念 2.java如何如理异常 3.java异常分类 4.RuntimeException运行时异常 5.CheckedException已检查异常 try-catch-finally处理异常 throws抛出异常 6.自定义异常 7.异常总结

2022-07-13 13:53:53 207

原创 java注解

1.jdk中预定义的一些注解 2.自定义注解 2.元注解 3.在程序中使用注解 4.小案例,使用注解检查程序异常结果 5.总结

2022-07-13 11:23:23 63

原创 java反射机制

1.获取class对象的三种方式 2.class对象获取常见功能 获取filed 获取constructor获取method

2022-07-12 23:59:58 54

原创 java8-stream流

1.对于一个集合来说,要取出某一些特征元素,只能使用传统的for循环进行线性遍历,如果需要再次遍历,就要再次从头循环,显示循环只是方式,取数才是目的,stream是lambda的衍生物,只关注程序目的,可以让代码更优雅。 2.流式思想3.获取流把collection或者数组转化为流4.stream的常用方法分为延迟方法和终结方法,延迟方法返回继续返回一个可操作的stream,终结方法后不再支持链式调用。 forEach方法 过滤filter方法注意: stream流只能被使用一次,当数据流转到下一个流时,

2022-07-12 17:14:56 176

原创 java8函数式接口和lambda表达式

1.只有一个抽象方法的接口称为函数式接口,但可以有其他方法(默认方法,静态方法,私有方法),用@FunctionalInterface注解来规范。2.函数式接口作为方法的参数。3.lambda表达式可以延迟执行,进行性能优化。4.函数式接口作为返回值来使用。1.Supplier接口,称为生产型接口,指定接口的泛型是什么类型,那么接口中的get方法就回生产什么类型的数据。2.Consumer接口是一个消费型接口,泛型指定什么类型,就可以使用accept消费什么类型数据3.Consume

2022-07-12 15:42:43 154

原创 内部类要点

1.内部类是指一个类内部包含另一个类,分为成员内部类和局部内部类,局部内部类包含匿名内部类。2.内部类可以随意访问外部类,外部类访问内部类时需要通过内部类对象。3.局部内部类是定义在方法内部的,出了这个方法就不能用了4.外部类的修饰符只能是public和default。5.成员内部类的修饰符可以是public,protected,default,private。6.局部内部类什么都不能写,但不是default。7.局部内部类需要访问所在方法的局部变量时,该变量需要用final修饰,从j

2022-07-12 10:18:34 71

原创 final和权限修饰符

final1.final修饰类,则该类不能被继承。2.final修饰方法时,该方法是最终方法,不能被覆盖重写。3.abstract不能和final同时使用,因为二者矛盾。4.final修饰局部变量时,该变量的值不能改变,对于基本数据类型来说,是变量中的数据不能变,对于引用类型来说,是变量中的地址值不可改变。5.当final修饰成员变量时,必须手动或者构造方法(全部)赋值,因为成员变量有默认值,一旦赋予默认值也不可改变权限修饰符...

2022-07-11 22:08:52 92

原创 对象的转型

向上转型1.对象的转型,其实就是多态写法,相当于把子类当作父类来使用。格式:父类 对象 = new 子类()。2.向上转型一定是安全的,因为是从小范围转向大范围,相当于猫一定是动物,但动物不一定是猫。向下转型 可用instanceof判断某对象是不是属于要转型的目标类对象,然后进行向下转型。...

2022-07-11 17:42:52 135

原创 面向对象多态

多态是指一个对象具有多种形态1.继承和实现是多态的前提,代码体现为父类引用(左边)指向子类对象(右边)。2.在多态的代码中,成员方法的访问规则是,看new的是谁,就优先用谁,没有则向上找。3.成员方法:编译看左边,运行看右边。成员变量:编译看左边,运行看左边。......

2022-07-11 17:16:41 64

原创 抽象类和接口

抽象类是对于同一类事物的描述1.不能直接创建抽象类对象,需要子类继承抽象类并重写所有抽象方法,然后使用子类。2.抽象类可以有构造方法,是供子类创建对象时,初始化父类成员用的。3.抽象类不一定有抽象方法,但有抽象方法的类一定是抽象类。4.抽象类的子类必须重写该抽象类的所有抽象方法,否则编译报错,除非该子类也是抽象类。接口可以对不同类事物的描述1.java7包含常量和抽象方法,java8默认方法和静态方法,java9增加私有方法。2.接口中的抽象方法修饰符是abstract和public两个固定

2022-07-11 16:50:28 143

原创 继承的细节

1.继承的主要目的是共性抽取。2.继承是多态的基础。3.在继承的关系中。子类可以被当作父类看待(is-a),反之不行。4.当子类和父类有重名变量时,等号左边是谁就调用谁的(A a = new A())。5.当调用方法访问成员变量时,方法是谁的就访问谁的变量。6.当父类和子方法重名时,创建的对象是谁(A a= new A()),就用谁的方法,没有则向上找。7.对于成员方法和成员变量,如果没有都是向上找(父类),不会向下找(子类)。因为父类不知道子类是谁的。8.@Override写在子类方法前面,

2022-07-11 16:06:16 79

原创 Elasticsearch学习链接

https://developer.51cto.com/article/594615.html?pchttps://cloud.tencent.com/developer/article/1488535

2022-04-13 14:10:05 1171

apache-jmeter-5.1.1.rar

这个工具可以进行压力测试,例如并发测试,具体配置可百度。

2019-08-05

空空如也

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

TA关注的人

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