预览加载中,请您耐心等待几秒...
1/9
2/9
3/9
4/9
5/9
6/9
7/9
8/9
9/9

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

C语言如何调用硬件C语言如何调用硬件大家都知道我们可以使用C语言写一段程序来控制硬件工作,但你知道其工作原理吗?本文特意为大家收集整理了C语言是如何调用硬件,希望大家喜欢!c语言在实际运行中,都是以汇编指令的方式运行的,由编译器把C语言编译成汇编指令,CPU直接执行汇编指令。所以这个问题就变成,汇编指令是如何操作硬件的?如果把硬件平台限制在x86环境下,那么汇编指令操作硬件基本上只有两种方式:方式一:通过向内存空间写数据。硬件会把硬件上的各种寄存器(外行可以理解为访问硬件的接口或者操作硬件的工具)映射到某一块内存地址空间上,之后只要用汇编指令,甚至C语言去读写这一段内存地址空间(并非真正操作物理内存),就可以达到操作硬件的目的了。如果题主还有WindowsXP环境(虚拟机也可以),就可以用汇编指令直接操作显存:MOVAX,B800MOVES,AXXORDI,DIMOVCX,0800MOVAX,5555REPZSTOSB硬件的各种寄存器会被映射到某一块物理内存中,这种方式称为MMIO,在Windows的设备管理器里,右键点设备,看属性-》资源里,不少硬件设备都有“内存范围”的参数,这里的内存范围就表示这个硬件的资源可以通过访问这一段内存来控制它。方式二:x86汇编中,还有两个特殊的指令是IN和OUT,这是x86平台才独有的,上面图里的I/O范围,就是用IN/OUT这两个指令来访问和控制的。以上两种访问硬件的方式,第一种是可以用C语言实现的,上面一段汇编,本质上类似于C语言代码:charptr=0xB8000;inti;for(i=0;i《0x800;i++){ptr+i=0x55;}第二种IN/OUT方式没有直接的C语言语法对应,需要自己封装汇编。那么为什么平时很难用C语言操作硬件呢?这是因为平时写的代码大多数都在保护模式下,保护模式下,直接访问物理地址会受到限制,C语言操作的地址都是虚地址。对于Windows来说,要访问物理地址,需要工作在内核模式,也就是的写驱动才行。而在显存方面,首先,题主要先明白物理地址和虚拟地址的概念。原来的8086cpu设计的时候,地址空间有一块区域(640K-1M)之间,有一块作为显存使用这里你说的预留的地址,是指物理地址,这一段地址的准确范围是000A0000-000BFFFF,不管是32位还是64位CPU,这一段物理内存地址一直都保留给显存使用,不区分32位还是64位,也不区分保护模式还是实模式。可见这一段内存至今仍然是留给显卡使用的。那么现在为什么不能直接用这段内存了?因为现在的软件都运行在保护模式下,访问的地址都是虚拟地址,而并非物理地址,包括你使用cmd命令打开的环境,都是虚拟地址,虽然32位XP里能用debug命令向000B8000上写数据并能显示在cmd的界面里,但本质上,这都是虚拟出来的。如果要想用这段显存怎么办?自己写一个简易的操作系统,不启动显卡的各种图形加速功能,CPU进入保护模式后在GDT里映射一个4G的数据段,与物理地址一致,那么向000B8000上写数据,就会像过去DOS一样显示在屏幕上,所以保护模式下也可以访问这一段内存。所以,保护模式下,也可以用它。显卡那么多显存是怎么映射的.?有很多内存地址被映射给显存了,就是通过这种映射关系,把一些物理地址留给显存,使得CPU能像访问内存一样访问显存资源。当然,实际情况是,2G显存未必完全映射,而是只映射一部分地址,显卡有一些开放的寄存器能够控制哪部分显存映射过来,这样就能使得CPU在使用比较少的物理地址范围的情况下,访问全部的显存。还有一个很有意思的事情:在虚拟机里,找到映射的高地址部分的第一块内存区域,写一个能直接访问物理地址的程序(比如一个驱动),去读这一块内存,然后写到文件里,再用屏幕截图,也写到文件里,会发现截图的内容和显存里读出来的内容基本上是一样的。要回答你的问题,我们需要要知道:硬件是一种什么样的存在什么是驱动。C语言怎么操作硬件我就不严格去定义这些概念了,我就以一个例子来通俗地讲解一下吧。首先讲硬件:先介绍一款单片机芯片STM8。这款芯片里面有cpu,内存,寄存器(先不要觉得看到新名词压力大,继续往下看)等等,相当于我们的电脑了,但还要外接其它硬件。这里你需要知道的概念是:芯片的引脚跟寄存器是相对应的,寄存器是8位的内存单元(对,存在于内存上面),当你往这个内存单元里面写入数据时,芯片的引脚的电压会发生变化,比如说我写入的是01100001,则芯片上与之对应的8个引脚的电压状态(分为高电平与低电平两种)会输出:低高高低低低低高。cpu可以执行代码指令,指令可以操作内存。结论:所以从上面两点可以我们可以知道,cpu可以执行指令,使芯片的引脚电平(电压)发生变化。关于这款显示器,我们需要知道的是:它是有引脚的,这些引