C语言竟是如何调用硬件的

大家都知道我们可以使用C语言写一段程序来控制硬件工作,但你知道其工作原理吗/p>

方式一:

C语言竟是如何调用硬件的

方式二:

ptr = 0xB8000;
int i;
for (i = 0; i 《0x800; i++)
{ptr + i = 0x55;
}

C语言竟是如何调用硬件的

C语言竟是如何调用硬件的

  • 硬件是一种什么样的存在

  • 什么是驱动。

  • C语言怎么操作硬件
    我就不严格去定义这些概念了,我就以一个例子来通俗地讲解一下吧。
    首先讲硬件:

  • 先介绍一款单片机芯片STM8。

    C语言竟是如何调用硬件的

    这款芯片里面有cpu, 内存,寄存器(先不要觉得看到新名词压力大,继续往下看)等等,相当于我们的电脑了,但还要外接其它硬件。

    这里你需要知道的概念是:

    芯片的引脚跟寄存器是相对应的,寄存器是8位的内存单元(对,存在于内存上面),当你往这个内存单元里面写入数据时,芯片的引脚的电压会发生变化,比如说我写入的是01100001,则芯片上与之对应的8个引脚的电压状态(分为高电平与低电平两种)会输出:低高高低低低低高。

    cpu可以执行代码指令,指令可以操作内存。

    结论:所以从上面两点可以我们可以知道,cpu可以执行指令,使芯片的引脚电平(电压)发生变化。

  • 接下来我们再来看另一个硬件,液晶显示器LCD1602(对,我就是这么迷你):

    C语言竟是如何调用硬件的
    C语言竟是如何调用硬件的

    关于这款显示器,我们需要知道的是:

    它是有引脚的,这些引脚可以跟到前面介绍的那款单片机芯片的引脚相连。
    该显示器有自带的内存,用于存储要显示的字符,显示器从该内存里面读取字符来来显示。

    单片机芯片与该显示器相连后,可以通过引脚往该显示器的内存里写数据(通过多个引脚电平的高低不同来代表不同的数据,比如说:低高高低低低低高  代表01100001,这个数据写在显示器的内存里面,被显示器所显示,当然,会根据ASCII来显示数字对应的字符,01100001对应的字符是‘a’),除了接收数据的引脚外,还有控制显示器的引脚(这个我们会在驱动那里介绍,继续往下看)。

    结论:单片机芯片与显示器相连,可以通过引脚输出的电平来控制显示器的字符显示。

    那么,综合上面,也就是说,单片机芯片cpu可以通过执行指令来控制显示器的字符显示。

    而这里,题主所说的硬件,指的就是这个显示器了。

    接下来讲驱动:

    那么,什么是驱动呢动无非就是硬件跟软件的中间层,但我们不纠结这种关系,直接来看一下,对于我们这个例子,驱动指的是什么。首先我们要知道:

    显示器支持很多种操作,比如说清除显示,光标移动,读取数据,写数据等等。

    这些操作数据引脚和控制引脚来实现。

    引脚可以通过单片机芯片来控制。

    结论:我们可以通过在单片机芯片里面写显示器的“驱动”程序来屏蔽掉硬件(显示器硬件)层。

    于是这里驱动程序,指的是显示器所支持操作的程序表示。比如说清除显示,我们可以编写一个clear()函数,光标移动,我们编写一个move_cursor()函数,读取数据和写数据分别为read()和write(),然后分别实现就可以了(通过向寄存器里写数据的形式,进而控制引脚的电平变化,再而控制显示器,这个过程前面已有介绍)。这些函数就是驱动程序了。为什么上面说驱动程序可以屏蔽掉硬件呢为程序员可以使用前面的驱动程序来直接操作显示器(硬件),而不用知道太多关于硬件的事情,而一般的驱动程序也可以由厂家来提供。

    再说明一点:一般这些驱动程序可以用汇编写(出于运行效率的考虑),也可以用C语言来编写的,比如说我上面的例子,就可以直接用C语言来编写。当然C语言内联汇编的形式也可以。

    最后讲C语言怎么操作硬件:

    相信到这里,C语言是怎么操作硬件的已经比较明白了。
    这里总结一下:

    C语言由CPU运行(实际上是先编译成机器码存在芯片里面然后执行),可以去操作内存。

    内存里有一段是跟寄存器相对应的,而寄存器是跟芯片的引脚相对应的,于是操作该段内存就能控制芯片引脚的电压变化。

    硬件(比如说显示器)有引脚(或者说排线,这些也是一样的东西),这些引脚跟芯片的引脚相连可以接受芯片的控制。

    可以把对某个硬件的操作做成一系列操作函数,这些操作函数就是驱动程序了。

    于是我们的C语言只要去调用这个驱动程序就可以直接操作硬件了。(当然驱动程序也可以由C语言来编写,所以C语言操作硬件并不一定要经过驱动程序)。

  • p = 。..;p = 。..;

    p = SCREEN_ADDR;p = RGBA(0xff,0xff,0xff,0xff);
    这样的代码来实现对硬件的操作了。
    3  那这个地址怎么拿到呢么样的数据才是合法的呢解答这些问题,就需要查阅具体设备的spec了。例如这个一眼看过去就能的明白的例子(一眼没看明白请反复阅读以完全理解上面第二点内容):

    你说你在单片机中写0,请问你是如何写0的键盘上敲个0际还是电平【和我们理解的数字没关系】,那个0只是你在电脑显示器上电平的呈现形式,那个所谓的0【实质是电平】可以传输到单片机中的ROM中,电平控制电平没什么疑问吧,这样就输出低电平了。

    文章知识点与官方知识档案匹配,可进一步学习相关知识C技能树首页概览113356 人正在系统学习中

    来源:xujingzhong0077

    声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

    上一篇 2016年9月8日
    下一篇 2016年9月8日

    相关推荐