Linux设备驱动_概述
前言
在理解"链接"的基础上,有了跃跃欲试的感觉,好像啥都能做了---设计数据类型表达数据,设计函数(算法)表达逻辑,再把数据映射到硬件上,完整的程序就出来了.举个例子,有个叫"Robot"的硬件,他的硬件端口有8个位.那么用一段代码把Robot和程序连接起来,如下:
//伪代码 Port=端口在内存中的地址; char *Robot=Port; //指向Port *Robot=0x25; //将25写入Robot的硬件寄存器中,实现某些控制或数据传输功能还有一种更简洁的写法跟别人学的如下所示:
char Robot = * (char *)Port; Robot=0x25;通过赋值Robot,对照硬件Robot寄存器,就可以实现对硬件的控制---这是一种朴素的设计
用程序直接控制硬件,是单片机的做法.单片机适用的场景是一些功能单一,计算量小的硬件数字设备.例如家用电器---洗衣机,抽油烟机,冰箱等.在多任务计算量大的场景中,需要操作系统做支持.而操作系统就要用到Linux了---Linux的书多.
Linux的学习内容有内核和设备驱动两块.操作系统会封装设备驱动,提供操作硬件的库文件接口给软件开发者.除了硬件,操作系统还要对内存,进程,文件等内容进行管理,这些属于Linux内核的内容.以一本书<Linux设备驱动开发详解>(以下称"本书")为基础学习Linux.虽然归于嵌入式Linux,但有些内容是相通的.
程序的一些思路
编程有一些思路是通用的,时不时做个概括
函数是分层的
前面的帖子中提到了函数的几层抽象.最后一点写得不完整在这里补上.函数是分层次的,下一层函数是上一层函数的实现,上一层函数是下一层函数的封装,最底层的函数实现是由芯片电路完成.
笔者在这里提一个概念:基础函数.如果程序员只调用某个函数,无法写出函数定义,那么该函数称为基础函数.这个概念是相对的,写Java和写Java虚拟机的人面对的基础函数是不同的.笔者默认C语言做基础,那么像printf和scanf这类函数,以及if else / switch这些关键字都看作基础函数.基础函数和内核函数的含义差不多.
基础(内核)函数的特点是需要访问内核资源(数据或函数).操作系统一般不会放开访问权限,让应用程序员访问内存绝对地址,所以也不要把内核编程看得很神秘,本质上也是"数据"+"算法".不是不能写是没有权限和内核资源.程序员着眼于操作系统以上的函数,例如框架也可以嵌套其他框架.
软件也是分层的
每层函数组合在一起,就是一个软件层.软件的架构设计简单地说就是软件层的设计.一个软件分若干个软件层,每层承担什么任务,再具体到每层包含哪些函数.架构师分析需求,并给出各个层级的函数,具体函数定义由程序员编写.
以面向对象的思想来设计程序,会简单一些.架构师给出类定义---数据类,功能类,普通类---对应着数据对象(无动作),动作,数据对象(有动作).动作要表达一种逻辑,一种因果关系,否则没有意义.具体类设计交由程序员编写.这样考虑的就不是软件层,而是类与接口之间的关系.
面向对象是一种"横向"的设计,着眼于内容的完善;软件层级是一种"纵向"的设计,着眼于从代码到硬件的实现.面向对象也不是完全横向的,例如接口和对象的关系是"纵向"的.
不求甚解
1>不求甚解不是"差不多"就行了,而是在学习遇到某些不熟悉的内容时可以暂时略过.程序是一种绝对理性的存在,但程序员不是机器,可以有一些感觉在里面.
2>不求甚解是需要一定技术基础的.在编程中,就是对程序语言的熟练度.在Linux中,对C语言的结构体,函数指针等内容比较熟练.
综合来讲,建立在扎实技术基础上,一种自信从容的学习心态.
Linux设备驱动
嵌入式Linux设备驱动的内容比较多,和Linux内核有一定联系,但用起来有很多固定格式,没那么复杂.另外本书有许多代码,多读学习别人的代码思路也是可以的.
