689-电脑的外部设备&驱动程序

电脑的外部设备

设备管理

(1)回顾计算机结构
图:
在这里插入图片描述

(2)常见的外部设备

1)如何判定是不是外部设备
只要挂接在外设IO接口上的都是外部设备,与所在位置关系不大,可能在芯片内部、也可能在芯片外部,可能在机壳内部,也可能在机壳外部。

2)外部设备大致分为三类
按照用途分的话,大致分为三大类。
(a)数据的传输:比如网卡,负责数据的发送和接收,即是输入也是输出设备
(b)数据的存储:比如像磁盘,SSD(固态硬盘),负责数据的存储,既能读数据也能里写数据,所以即是输入也是输出设备。
c)数据的翻译:比如输入设备MIC,将输入的声音翻译为电信号的二进制数据。比如显示器,将电信号的二进制数据翻译为人看得见的图像和视频。
不管是哪一类的设备,要么是输入设备,要么是输出设备,要么是即使输入也是输出设备。

3)输入输出设备
(a)输入设备
·键盘:字符图形输入,按下某个按键,输入动作会被翻译为ASCII编号数据(以电信号的二进制数形式存在)。
·鼠标:光标位置输入,将鼠标移动转为电信号二进制的坐标数据
·摄像头:图形图像输入,将其翻译为电信号二进制数据
·麦克风:声音输入,将其翻译为电信号二进制数据
·触摸屏:将触摸位置翻译为电信号二进制坐标数据
·网卡:直接接受别的计算机发送的电信号二进制数据,输入给计算机
·磁盘、SSD:读取存储的数据,输入给计算机
(b)输出设备
·显示器:将CPU按照程序要求处理后的,电信号的二进制的图形、图像数据,翻译成为图形图像给人看
·喇叭:将声数据翻译成为人能听得见的声音
·打印机:将数据输出到打印机打印,打印机打印
·机械手臂:将输出数据翻译成为机械手臂的动作
·Led灯等:将输出数据翻译成为灯的亮灭
·网卡:从计算机输出数据,传输给别的计算机
·磁盘、SSD:从计算机输出数据,写到磁盘或者SSD中

4)有关外部设备
(a)外部设备非常多,根据不同的用途有不同外部设备,如果你是做纯软件开发的,了解即可,如果你是做嵌入式开发的,
需要掌握一些常见的设备开发,但是不需要掌握所有,没有意义,有了常见设备的开发经验后,根据工作需求掌握其它设备。
(b)对于嵌入式开发来说,重点不在于研究外部设备制造和工艺,比如研究显示器是怎们被制造出来,显示器实现图像现实的详细技术知怎样的,这些是设备生产者关心的事,嵌入式开发者要做的了解设备的基本工作原理,能够查阅设备手册,编写相关的驱动程序,控制外部设备工作。
b)嵌入式技术
单片机、Linux嵌入式中,会有各种常见守备队的驱动课程,驱动课程的目的就是讲解如何开发出驱动程序,驱动这些外部设备工作。

设备驱动程序

1)为什么叫要驱动程序
外部设备绝对不是连上就能用的,必须要有专门的程序来驱动才能工作,能够驱动外部设备工作的程序就是驱动程序。
图:
在这里插入图片描述
驱动程序是属于内核的一部分。

2)驱动程序到底是如何驱动外部设备
为了能够驱动外部设备工作,驱动程序关键要要两件事情,
第一件:配置外设的工作模式
第二件:通过外设输入输出数据
(a)第一件:配置外部设备的工作模式
·为什么要配置
因为大多数外部设备都有很多种工作模式,驱动程序需要通过相应的配置,选择让设备工作在那种工作模式下,如果不做配置的话,外部设备不知道该工作在什么模式下,是混乱的。
驱动程序是如何配置外部设备的呢?
通过相应的配置开关进行配置,这个配置开关就是“设备的配置寄存器”。
· 设备的配置寄存器
就是外设工作模式的配置开关,是外设专用寄存器,与CPU内部的寄存器、cache、内存(DDR)一样,只是这些寄存器被做在了外部设备的内部,是专属于外设的专用小容量内存,驱动程序向设备的配置寄存器中写入相应的
配置数据,就可以配置好外部设备的工作模式。
·为什么向配置寄存器写入配置数据,就能配置好外设的工作模式
图:
在这里插入图片描述

计算机中数据已电信号存在,向设备配置寄存器写入配置数据,其实就是将电信号导入配置寄存器,配置寄存器中就把这个电信号锁存起来,这个电信号承载的是一个二进制数,所以就将电信号的二进制数据写入了配置寄存器中。
(b)第二件:输入/输出数据
配置好工作模式后,驱动程序就可以驱动设备工作了,此时需要用外设的“数据寄存器”。
为什么需要数据寄存器呢?
因为输入输出数据时,数据需要暂时存放在数据寄存器中,存数据时,存储的其实就是电信号。
·输入设备
输入设备有两种情况,
第一种:直接得到就是二进制数据,比如像网卡和存储器,能够直接输入数据
第二种:需要经过传感器的翻译,比如像麦克风、摄像头,需要利用传感器将外部输入的声光等其它信号形式的数据,转为二进制电信号形式的数据。
CPU执行输入设备驱动程序时,从输入设备的数据寄存器中取出数据,并将数据保存起来,专门进行数据处理的程序就可以处理这些输入的数据了。
图:
在这里插入图片描述

·输出设备
输出设备也有两种情况,
第一种:直接将二进制数据输出给其它设备,比如网卡就是这样的
第二种:需要将数据翻译为其它信号形式的数据,比如显示器需要将二进制电信号的视频数据,翻译为光信号的图像数据,供人识别。
CPU执行输出设备的驱动程序时,会将电信号形式的数据写到设备的数据寄存器中,输出设备的
图:
在这里插入图片描述

·输入输出设备
有些外部设备既是输入设备也是输出设备,那就是上述的综合情况。

驱动程序的种类

stm32 51
分为两种,第一种是裸机驱动程序,第二种是基于OS的驱动程序。
1)裸机驱动程序
(a)裸机驱动程序的特点
· 裸机程序大致分为两部分,第一部分为业务逻辑代码,第二部分为驱动代码,

  • 业务逻辑代码:专门负责数据的处理,比如计算1+2结果
  • 驱动代码:专门负责驱动外设,实现数据的输入输出,比如控制键盘输入1和2,控制显示屏显示3
    ·裸机程序结构图示
    图:
    在这里插入图片描述

地址:
程序使用地址有两种形式,
第一种:间接使用
int a;//a一般是4个字节,每个字节都有一个地址,不过只有变量的第一个字节的地址,才作为整个变量的地址
a = 10;//a->地址,编译器会将变量名和地址联系起来,0x2342
但是使用变量名操作时,虽然还是使用的是地址来操作的,但是变量名操作会受到限制
void fun(void)
{
int a;//a->地址
}
在Java里面全部使用变量名这种形式,也就是间接使用地址的形式,所有的高级语言都有变量这个东西,使用变量名时,其实间接使用的是地址,那么这个变量名到底和什么地址对应起来的,这个就看编译器在编译的时候,怎么对应。
有些高级为了减少直接使用地址带来的危险,都不在直接使用地址操作,而是使用变量操作。
第二种:直接使用
int a;//a->地址
int *p = &a;//编译器在编译时,会直接使用地址将&替换
int *p = 0x325234;
那么我们在底层的驱动程序中,一般来说都是用C语言来开发,在c语言的驱动程序中,访问内存空间,以及寄存器空间时,基本都是以上这两种,直接使用地址操作的形式,来访问对应的空间。
如果说你的底层驱动程序是使用java来开发的话,java的语法特性是不允许你直接使用地址操作,但是在底层驱动里面,特别是访问寄存器空间时,我们非常需要直接使用地址操作,因为设备手册上,直接给你的就是寄存器地址,那么你只能直接使用地址操作,java没办法直接使用地址操作,所以说底层驱动程序基本不会使用java来编写。
那么那些情况下会直接开裸机驱动程序呢?
一般情况下,开发计算机资源有限的单片机产品时,都会直接开发裸机驱动程序,我们开发单片机程序时,程序里面既包含业务逻辑代码,同时也包含驱动程序代码,当然可能是有一个人完成的,也可能由不同人完成。
(b)基于OS的驱动程序
图:
在这里插入图片描述在这里插入图片描述

(c)以上两种驱动程序的对比
· 不同点:
· 相同点:裸机驱动和基于OS的驱动,它们所做的事情都是一样的

  • 驱动程序写配置寄存器,设置设备的工作模式
  • 通过读写设备的数据寄存器,实现数据的收发
  • 驱动程序负责的事情
  • 对上与应用程序对接(可能需要OS对接)
  • 对下驱动设备
    但是驱动的工作到设备寄存器(配置、数据)就ok了,至于设备是如何拿到寄存器的数据去工作的,这就是属于设备的自己的工作范畴,驱动程序已经管不着了,这就好比送餐送到手上就好了,难道还要喂你吃吗。
    你觉得写驱动程序的人,他的工作是什么,简单来讲就是通过驱动程序实现以上这两个目的,一个与应用对接,另一个通过寄存器去驱动设备。
    · 应用程序与驱动是否在一起呢
  • 裸机:应用和驱动代码写在了一起。
    在裸机里面,裸机驱动程序与业务逻辑代码合在了一起,开发时,这两部分代码可以由一个人全部开发,又可以分开由不同的人来开发。
  • 基于OS的驱动:
    应用和驱动懂之间完全是分开的,中间通过OS对接。
    应用和驱动是分开被开发的,由不同的两部人来分别开发,做应用的专门做应用,做驱动的专门做驱动。
    · 裸机驱动与基于OS的驱动,谁更难
    总体上来说,基于OS的更难,原因有两方面。
    - 第一方面
    之所以裸机运行程序,大部分原因是因为计算机资源比较弱,不能跑操作系统,比如类似51这类低级别单片机。
    计算机资源较弱,自然控制的设备也比较简单,比如都是一些小电动机,led灯,数码管,小LCD屏等等这类,很简单的设备,控制简单,编写的驱动程序自然也简单。
    但是基于OS的驱动就不一样,既然能够跑OS,也就意味计算机能力很足,所控制的设备自然也就很复杂,比如什么大型的液晶屏、大号的键盘、鼠标、触摸屏、磁盘、网卡等等这类复杂的设备,设备复杂了,对应的驱动程序自然也简单不了。
    - 第二方面
    有操作系统是,驱动程序必须要和OS对接,将驱动加入OS,变成OS的一部分,由OS来管理驱动程序,和OS对接本身就是一件很复杂的事情,如果是裸机的话,就省去了OS这个复杂的因素。
    但是我们说过,不管是那种驱动程序,工作的内容都是一样的,一个对上与应用对接,另一个是对象驱动设备,如果你只是想了解驱动的工作都做些设么事情,学习单片机这种裸机驱动程序的开发就可以了。
    (5)有关驱动程序的开发
    我们这里所讲的驱动,重点指是基于OS的驱动。
    1)驱动开发的行业特点
    有关驱动的开发可以分为两类
    标准化计算机驱动开发,非标准化计算机驱动开发。
    (a)非标准化计算机
    嵌入式计算机就是非标准化计算机,所谓非标注化的意思就是,硬件和软件没有统一标准化的东西,都是要进行定制的,所谓定制的意思就是说,你具体有什么需求,根据你的特殊需求定制硬件和对应软件。
    比如你的是用来控制锅炉的,那我就是专门给你设计符合锅炉环境的设备,如果你的是用于深水探测的,那我就专门定制符合深水环境的设备,相应的设备的硬件和软件需要定制,嵌入式设备的应用环境是千差万的,没办法给出标准化的东西。
    嵌入式开发时典型的非标准计算机开发和设计。
    嵌入式计算机驱动也分两种
    有OS的嵌入式设备驱动开发:开发基于OS的驱动,比如ucos和Linux系统。
    没有OS的嵌入式设备驱动开发:纯粹的单片机裸机程序开发,其中就包含裸机驱动开发。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林林林ZEYU

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值