【linux驱动开发】-gpiolib概念与实践 在平常的硬件驱动过程中,很多的硬件都要用到GPIO,GPIO会复用,如果同一时刻GPIO被两个驱动同时控制了,那么就会出现bug,所以内核提供了gpiolib来统一管理系统中所有的GPIO,gpiolib本身就是属于驱动框架的一部分!
【linux驱动开发】-驱动入门之LED 可以清晰的看出与之前的区别,之前我们写"散养的"驱动时,我们首先需要注册,这中间就需要调用很多的内核函数,除此之外我们要在sys/class/下面创建类和设备,也需要调用其他的函数,而在驱动框架里,所有的一切都在框架里帮我们完成了,也就是在led-class.c中的led_classdev_register函数!都能够实现,并且程序里使用的led_classdev结构体,也是驱动框架里提供,我们直接用就可以,他的一些变量,比如name、brightness、brightness_set函数指针都是可以直接
【linux驱动开发】-字符设备驱动高级 在字符设备驱动基础章节,我们使用的注册字符设备驱动的接口为register_chrdev,在本章节我们要学习一种注册字符设备驱动的新接口register_chrdev_region/alloc_chrdev_region+cdev
【linux驱动开发】-字符设备驱动基础(二) (1)裸机中操作硬件,直接操作的是寄存器的物理地址;习惯用函数指针操作寄存器的方法!(2)操作系统中操作硬件,操作的是寄存器物理地址在内核中映射的虚拟地址。内核中习惯用封装好的io读写函数来操作寄存器,已实现最大程度的可以执行。...
【linux驱动开发】-字符设备驱动基础(一) API里面的函数,比如open、close等实际调用驱动程序中的open、close这些函数,这些函数直接对接硬件!驱动里面的open、close等操作函数,是定义在file_operations结构体中的,每个设备驱动都需要一个该结构体类型的变量!当设备驱动向内核注册时提供该结构体的变量。向内核中注册时使用的是register_chrdev函数注册!...
【linux驱动开发】-关于驱动学习你得知道的 准确的说,驱动是和操作系统挂钩的,在操作系统中,去操作硬件的那一段代码,才能叫做硬件的驱动程序。平时在裸机程序中,去操作硬件的代码,我们不叫驱动,只是大家都习惯了,所以我们有时候也叫裸机驱动!...
【基础算法】-简单选择排序 基本思想:(1)首先在一个无序数列中,找到一个最小的值,然后把它与第一个数互掉位置;(2)固定第一个值(最小数),然后在剩余无序数列中找到次小数,将它与第二个数互换位置;(3)重复前面的步骤之后,可以得到一个排列好的数列;...
【基础算法】-希尔排序 (1):把待排序列,分为多个间隔为h的子序列,然后对每个子序列进行直接插入排序;(2):重复(1)多次,每次间隔h不同,并且越来越小;(3):最后一次选取,间隔h=1,完成排序!
【算法基础】-冒泡排序 1.比较相邻的元素,如果前一个数的值大于后一个数的值,那么交换他们的位置2.对每一个相邻的元素做同样的比较,从开始到最后,这步做完,最后一个元素就是当前数组中最大的元素。3.当2的步骤执行完毕后(也就是第一轮比较完毕),此时把序列中最大的值排在了最后一位,然后得到了一个新的序列。对这个新的序列再执行2步骤,就可以把次大值排在倒数第二序列,以此类推,可排列为从小到大的一个序列!...
【基础算法】-快速排序 首先,在所有序列元素中随机找出一个,作为“基准值”,然后把整个序列基于基准值进行重新排列,小于基准值的放在它左边,大于基准值的放在它的右边,重新排列完,这个基准值元素的位置就是排序后的位置了,同时,也产生了两个子序列,然后对两个子序列再用同样的方式,找一个基准值,对子序列重新排列…,直到最后子序列只有一个元素或0个元素(递归最底层的情形),这时,序列就排完序了。...
C语言整理-双向链表和单项链表那些事 链表一般细分为:1、不带头节点的单链表2、带头节点的单链表3、不带头结点的双链表4、带头结点的双链表5、带头结点的双向循环链表其具体的实现过程可以由下图表示:头指针: 头指针是指链表指向第一个结点的指针,若链表有头结点,则是指向头结点的指针 头指针具有标识作用,所以常用头指针冠以链表的名字 无论链表是否为空,头指针均不为空,头指针是链表的必要元素 头节点: 头结点是为了操作的统一和方便而设立的,放在第一元素(首元节点)的结点之前,其数据域一般无意义
【linux网络编程】-实战 socket编程接口介绍服务器需要socket、blind、listen、accept第一个参数是网络域,也就是网络范围;是ipv4/ipv6第二个参数是指定类型;比如TCP类型第三个参数用来制定协议;如果是0就是默认协议;accept返回值是一个fd,accept正确返回就表示我们已经和前来链接我的客户端建立起一个TCP链接了,以后就要通过这个连接和客户端进行读写操作,读写操作就需要一个fd,这个fd就由accept来返回了!客户端用socket、con
【linux应用编程】-线程全解 第一点线程的引入接上节我们处理同时监测鼠标和键盘的例程,我们再提出一种解决方案-多进程处理!使用多进程处理时的优势:CPU时分复用,单核心CPU可以实现宏观上的并行,微观上其实是串行!实现所任务的系统需求进程的劣势:进程间切换开销大进程间通信麻烦而且效率低!......
【linux应用编程】-信号 第一点什么是信号信号是一种内容受限的异步通信机制!他的目的是在于通信!信号是异步的(对比硬件中断)本质上是int型数字编号!信号的来源有:用户在终端按下按键;硬件异常后由操作系统内核发出信号;用户使用kill命令向其他进程发出信号;某种软件条件满足后也会发出信号,如alarm闹钟时间到会产生SIGALARM(sigalarm)信号,向一个读端已经关闭的管道write时会产生SIGPIPE(sigplpe)信号;其实通俗的说,信号就是来源于硬件和软件两部分,硬件产生即通
【linux应用编程】-进程全解 第一点程序的开始和结束程序的开始在操作系统中的应用程序其实在main函数执行前也是需要先执行一段引导代码的,但是我们在写代码之前完全不用考虑引导代码的问题,因为这些都由内部封装完成!上述的这些步骤,拆开的讲就是编译和链接,这两个步骤 由链接器完成,得到我们使用的a.out然后下一步骤再由加载器(操作系统中的程序)负责将这个程序加载到内存中去执行这个程序!程序的结束程序结束分为两种,一种是正常终止(return、exit、_exit) 另一种是非正常终止(自己或他人发信号终止进程)
【linux应用编程】-获取系统时间 第一点关于时间的概念GMT时间格林尼治时间,可自行百度!UTC时间现在常用的时间概念!自行百度计算机中的时间点时间(RTC:实时时间)段时间(定时器实现)第二点linux系统中的时间jiffies的引入他是内核中的一个全局变量,用来记录以内核节拍时间(也就是调度时间、取决于操作系统的配置、一般为1ms/10ms)为时间单位的一个时间长度。linux系统如何记录时间liunx内核启动时,jiffies就有一个基准值(是通过调用RTC所获得的当前时间点值换