精华内容
下载资源
问答
  • 软件 控制 硬件

    千次阅读 2011-09-07 15:17:25
    软件可以发送命令 让cpu的某一引脚 发出高低信号 从而控制硬件     我也曾遇到过这样的问题,困惑了好长时间。每每到网上看, 都说的不是我想要的问题,或者说是组成原理书上有讲呀什么的。现在我明白了, ...
      
    

     


    软件可以发送命令   让cpu的某一引脚   发出高低信号   从而控制硬件

     

     

    我也曾遇到过这样的问题,困惑了好长时间。每每到网上看, 都说的不是我想要的问题,或者说是组成原理书上有讲呀什么的。现在我明白了, 是按自己的想法明白 ,希望像我

    困惑过的正在困惑的能在这里得到答案,对你有所帮助

    软件如何控制硬件呢??(以下仅是我个人理解, 不保证正确, 如果错的希望能得到您的指点。。先谢谢)

    大家都知道。没有软件的硬件就是一堆废铁或“砂子”。您也知道cpu中有个叫做译码器的东东吧,您也知道我们写的程序要经过编译呀, 汇编呀,连接呀。最后生成可以被硬件

    执行的二进制。可是问题来了,硬件能认识个啥二进制。这里也许是你不懂的地方。其实解释的关键也就在这里了。高低电压。脉冲的有无控制硬件您能够接受吧,而我们写的程

    序(软件)其实都是以高低电压,脉冲的有无存储在磁盘上。或者以有无反射的形式存在光盘上。所谓的机器可直接执行的代码, 也就是二进制,译码器能理解。他能理解。cpu

    就能理解。cpu按照硬件设置和硬件特性,选择switch(也就是让哪一条导线是通路),以达到控制硬件。

    实际上计算机把相当复杂的问题最终都会转化成加法(ALU)来实现,(太神奇了,我还理解不了。但我知 道,呵呵,这样有助于理解。

     

     

     

    软件在工作的时候也是实体,软件的实质就是电流信号,用电压的高低代表不同是信息,用这些电流信号去控制逻辑电路的通断,靠逻辑电路的通断来控制硬件的工作。
    说到底软件就是起到一个开关信号的作用,开关要工作,必需保证硬件是加电的,没有接通电源的硬件是无法用软件来控制的。就好比没有插上电源的台灯,你怎么按开关都是不

    会亮的。
    任何软件在运行前都要有一个将其转化为电流信号的实体化过程,你写在纸上的软件代码是永远也不能控制硬件的。早期电脑用人工接线输入程序,相当于用人体的力量将软件代

    码实体化为电信号;现在我们用的软盘、硬盘是通过磁头将程序代码转化为电信号,光盘需要通过光头将程序代码转化为电信号等等。

    这个问题看似简单,其实涉及到一些很底层的内容和原理。对于一般计算机爱好者来讲,又没有办法说明白,原因就是我们从来没有考虑过电路在物理上的实现。
    计算机软件说到底,不过就是一些指导电子元件工作的指令序列,那么你一定又会问电子元件为什么会按这些序列工作呢?指令序列的在电路中的实质就是一些有规律且有一定意

    义的电脉冲,电脉冲控制电子元件的各种状态。工作过程非常复杂。最简单最基本的就是几个逻辑门电路的实现:比如“或”电路,“与”电路等等。通过将这些逻辑门电路的组

    合和协同,就能实现电脑整体上的运算和处理能力。因为这是十几个数量级的基础电路的有机集合的对外的体现,如奔腾系列CPU集成了上亿个半导体元件,要想把各个元件的功能

    彻底认知,是非常困难的。可以把它们比作每个人的活动合在一起就构成了社会.

    计算机是数字电路,数字电路是靠1,0来控制电路的.起到电流还有脉冲作用.像你键盘上敲个周字一样.同是由一大一串的0001111111111100.来产生脉冲电流对硬件发出指令的.CPU

    就是运算这些数据.然后发出机器语言指挥其它硬件工作的.

     

     

    展开全文
  • 软件是如何控制硬件的?

    千次阅读 2020-02-07 11:15:31
    文章目录通过操作系统控制硬件中断机制文字及图片的显示机制 通过操作系统控制硬件 现象: 在用 C 语言等高级编程语言开发的 Windows 应用中,大家很少能接触到直接控制硬件的指令。 结论: 硬件的控制是由 Windows ...

    通过操作系统控制硬件

    现象
    在用 C 语言等高级编程语言开发的 Windows 应用中,大家很少能接触到直接控制硬件的指令。

    结论
    硬件的控制是由 Windows 全权负责的,Windows 提供了通过应用来间接控制硬件的方法。利用操作系统提供的系统调用功能就可以实现对硬件的控制。在 Windows 中,系统调用称为  API(Application Programming Interface,应用程序接口)

    图:
    在这里插入图片描述

    ## 硬件通用术语

    I/O 控制器:而各连接器的内部,都连接有用来交换计算机主机同外围设备之间电流特性的 IC。这 些 IC,统称为 I/O 控制器

    端口:I/O 控制器中有用于临时保存输入输出数据的内存。这个内存就是 端口
    端口(port)的字面意思是“港口”。由于端口就像是在计算机主机和外围设备之间进行货物(数据)装卸的港口,所以因此得名。

    端口号:各端口之间通过端口号进行区分。端口号也称为 I/O 地址。

    图:

    在这里插入图片描述

    中断机制

    定义:IRQ(Interrupt Request) 是用来暂停当前正在运行的程序,并跳转到其他程序运行的必要机制,称为中断处理

    例子:
    从中断处理开始到请求中断的程序(中断处理程序)运行结束之前,被中断的程序(主程序)的处理是停止的。这种情况就类似于在处理文档的过程中有电话打进来,电话就相当于中断处理。

    假如没有中断功能的话,就必须等到文档处理完毕才可以接听电话。这样就太不方便了。

    由此可见,中断处理有着很大的价值。就像接听完电话后返回到原来的文档作业一样,中断处理程序运行结束后,处理也会返回到主程序中继续

    图:
    在这里插入图片描述

    作用:使用中断机制来实现实时处理?(思维风暴)
    举例
    假如主程序正在调查是否有鼠标输入,这时如果发生了键盘输入的话,该如何处理呢?结果势必会导致键盘输入的文字无法实时地显示在显示器上。而通过使用中断,就可以实现实时显示了

    文字及图片的显示机制

    VRAM(Video RAM):显示器中显示的信息一直存储的内存。该内存称为  VRAM(Video RAM)

    作用:在程序中,只要往 VRAM 中写入数据,该数据就会在显示器中显示出来

    现阶段
    显卡 等专用硬件中一般都配置有与主内存相
    独立的 VRAM 和  GPU(Graphics Processing Unit,图形处理器,也称为图形芯片)。这是因为,对经常需要描绘图形的 Windows 来说,数百兆的 VRAM 是必需的。而为了提升图形的描绘速度,有时还需要专用的图形处理器。但不管怎样,内存 VRAM 中存储的数据就是显示器上显示的信息,这一机制是不变的

    在这里插入图片描述

    展开全文
  • 作为一名入世未深的程序员,一直很好奇编写的一行行代码是如何实现对电脑硬件的驱动,明明一个感觉是虚拟的东西,而另一个是实实在在的存在,观念上感觉压根就不是一个时空的东西,他们却偏偏能产生关系,并且能如此...
    作为一名入世未深的程序员,一直很好奇编写的一行行代码是如何实现对电脑硬件的驱动,明明一个感觉是虚拟的东西,而另一个是实实在在的存在,观念上感觉压根就不是一个时空的东西,他们却偏偏能产生关系,并且能如此协调的工作着,于是便搜索相关信息,看到了比较好的解释,就借来补充一下知识面~
    

    我们不妨从最底层开始往上走。

    1. 二进制理论

    众所周知,电脑,手机以及其他大量的电子设备,都是基于复杂的数字电路进行工作的。而数字电路则通过循环往复地完成一系列的指令,来输出我们想要的结果。

    那究竟里面的工作原理是什么样子的呢?

    首先,我们需要一套数字理论。

    上帝说,我们需要一个理论。于是莱布尼茨诞生了。
    莱布尼茨提出了二进制,这成为了现代计算机理论的基础。至于是老子启发了他,还是他自己坐而悟道想出了二进制,其实已经不重要了。有了二进制,一切变得简单起来:

    我们可以只用1 和0 来代表所有数字,进行和十进制一样的代数运算。虽然对于人脑来说,二进制非常不雅观, 比如:

    10001010101010101010 * 0101001101010 = 0101101001000001010011100110100。

    但它对于计算机来说, 则最简洁,最直观,最高效。

    1.1 二进制运算

    每一位都只可能是1或者0,运算符号也就是加减乘除。虽然长,位数多,但速度极快!因为,但就每一位来说,运算之后,只会有几种情况:
    1 + 1 -> 0, 进一位(, 这个)
    1 + 0 -> 1.
    0 + 1 -> 1.
    0 + 0 -> 0.

    所以说,《三体》中,刘慈欣讲到人肉计算机一说。单个运算单元只需要记住特定指令相对应的操作即可,甚至连加减乘除都不需要会。 但这个在现实里面并不可能完成。假设这个运算恒纪元的程序有10000条指令(但显然这个条件都不成立,因为这个程序必然很复杂,涉及复杂的浮点运算和逻辑算法,甚至还有平方开放积分微分,10000条机器代码都不够塞牙缝的), 每条指令需要100个逻辑单元,每个单元的运算时间1秒钟,那么整个程序就需要1000000s (11天13小时46分钟)。。。所以可能程序还没算完,乱纪元又来了,所有人来不及脱水都死了。这还不算发盒饭,上厕所时间。

    1.2 二进制逻辑

    而且,电脑可以理解是非对错了。计算机以1表示“对”,“是”,“正确”。以0表示“错”,‘否’,‘错误’。然后又引进了“或”,‘与’,‘否定’,等逻辑语句。

    我们用 || 表示“或”,表示两者有一个成立即成立(我是学工科的(1) || 我是学计算机的(0) = 我没有女朋友(1))。
    0 || 0 = 0
    0 || 1 = 1
    1 || 0 = 1
    1 || 1 = 1
    我们用&& 表示“与”,表示两者都成立方可成立。(我是学工科的(1)&& 我是男的(1) = 我没有女朋友(1))。
    0 && 0 = 0
    0 && 1 = 0
    1 && 0 = 0
    1 && 1 = 1

    2. 数字电路的实现

    2.1. 逻辑门
    我们有了数字理论,那怎么才能做出逻辑电路呢?怎么才能用来运算呢?我们引入这些理想的逻辑门,靠他们来作运算。
    <img src="https://pic2.zhimg.com/97fa8547f049daa6342ffd2028928ca1_b.jpg" data-rawwidth="341" data-rawheight="221" class="content_image" width="341">
    这个就是与门,除非两个输入都是1,则输出1, 否则输出0.


    <img src="https://pic2.zhimg.com/e6573402f2cb3176e9ef159e044c9b79_b.jpg" data-rawwidth="285" data-rawheight="157" class="content_image" width="285">
    这个就是或门,除非两个输入都是0,则输出0,否则输出1.



    <img src="https://pic1.zhimg.com/53d94fa755fbed4f80f8d4aad4819f30_b.jpg" data-rawwidth="333" data-rawheight="238" class="content_image" width="333">

    这个就是非门,它会对输入取反(1变0,0变1 )


    <img src="https://pic2.zhimg.com/bbf9b74960381ab7d175c96333ab9c55_b.jpg" data-rawwidth="374" data-rawheight="135" class="content_image" width="374">这个叫或非电路,除非两输入相同则输出0,否则输出1 这个叫或非电路,除非两输入相同则输出0,否则输出1

    现在,仅用一个理想原件,就可以做一次逻辑运算了!

    那如何做代数运算?比如加法?
    <img src="https://pic4.zhimg.com/b77ceb22b8f57d384112809914dd29ab_b.jpg" data-rawwidth="484" data-rawheight="278" class="origin_image zh-lightbox-thumb" width="484" data-original="https://pic4.zhimg.com/b77ceb22b8f57d384112809914dd29ab_r.jpg">以上的电路就能完成2以内的加法了。 以上的电路就能完成2以内的加法了。
    当两个输入都是0, 高位输出0, 低位也是0 =》 0
    当两个输入都是1, 高位输出1, 低位也是0 =》 2
    当输入一个0一个1,高位输出0, 低位也是1 =》 1

    所以,大家也看到了,这个逻辑电路其实并不明白加法,它只是照部就搬的给我们了碰巧正确的结果——这就是我们常说的‘中文房间’的思想实验。

    我们有了2以内的加法,那么4以内也好解决了,8,16。。。以此类推,我们只要把数字电路互相叠加,就能得到很多功能,比如说加减乘除,求余等等数学运算,相应地,逻辑电路也会越来越复杂:
    <img src="https://pic4.zhimg.com/4009eac737796376f4d93af69ec4eaff_b.jpg" data-rawwidth="1440" data-rawheight="544" class="origin_image zh-lightbox-thumb" width="1440" data-original="https://pic4.zhimg.com/4009eac737796376f4d93af69ec4eaff_r.jpg">
    我们现在有了CPU,他可以完成简单的运算,但是这还不够。

    我们要编程。

    2.2. 编程
    程序本身就是指令的集合。

    所谓的编程就是将程序员所要实现的效果,用系统支持的指令写下来。就好比给你一本唐诗三百首,让你用里面的诗句组合(杂烩)成你想要表达的意思。

    当我们安装一个程序的时候,它本身实在硬盘里面的。 只有当我们启动它的时候,系统才会到硬盘里,找到该程序,然后将其读取到内存中。

    将设我们还在使用一个几十年前的电脑,这个电脑每次操作只操作的数字只有八个0或者1,也就是我们常说的8位系统。这些指令被存放到内存里面之后,CPU又会把它当下要执行的那一句放到寄存器里面,然后执行这条指令。一条接一条,循环往复。

    假设我们有一个8位指令。CPU得到它之后,就会分析,这一个指令里面,哪一段是操作符,哪一段是数字。比如:0101 00 11,它会读前四位,发现是加法(我瞎编的),然后读5-6位发现是0,7-8位是3,所以输出3。

    CPU得到3之后,会把它放到寄存器里面,然后进行后续操作。

    当然看似简单,8位操作里面的数字电路也会是无比复杂了(这还只是几十年前的科技,如今intel 64位处理器的复杂程度可见一斑)。

    至此,我们已经可以编程了。我们的程序会是这样子。

    00101010
    10101010
    01001101
    01010010

    计算机诞生之初,程序的确是这样的。但假如让如今的程序员来干这种事情,肯定又得哭爹喊娘一顿了(误)。所以,后来,出现了汇编语言。比如:
    MOV R1, #0x1
    MOV R2, #0x1
    ADD R1, R2, R1
    这是ARM的汇编指令,读出来如下
    在寄存器R1里面装1,
    在寄存器R2里面装1,
    计算R1 + R2 并将值放到R1里面。

    这就是一个简单的加法程序了。

    但是呢,这种程序写起来还是很不舒服,效率极低。
    于是高级语言语言。
    int a1 = 1;
    int a2 = 2;
    a1 = a1 + a2;

    这是c语言里面的一个简单加法。这个程序被我写完之后,会被编译出来——也就是有一个c的编译器,将这个程序转换成01010101 这样的指令(往土了说,就是个翻译机,把人类语言翻译成1&0)。当我们运行这个程序的时候,电脑会把这些东西放到内存里面,然后逐行的读取,然后一行行的运算。

    好了,我们可以回归问题了。

    3. CPU 对硬件的控制

    3.1. 对CPU的误解

    在我学习这些东西之前,我对CPU有一种误解。我以为在电脑里面,只有CPU是活的。换句话说,整个电脑里面,事无巨细,都是CPU一手操办的,就像一个勤奋的全栈工程师一样。

    其实,CPU更像是个产品经理。

    举个例子,我们的电脑里面有蓝牙。蓝牙里面其实也有一个CPU,更确切的说,是个MCU(Micro Control Unit),它负责将无线蓝牙信号解码成数字信号等一系列的操作,而CPU得工作只是协调MCU做相应的工作而已。

    给个场景:你打开了听歌软件,输出设备是蓝牙耳机。
    软件:哥,给我个耳机呗。
    CPU:大妹子,耳机没插,倒是有个蓝牙耳机。
    软件:那哥,你告诉蓝牙,俺要在他那里唱歌呗。
    CPU:欧了。
    CPU转向蓝牙。
    CPU:嘿,那个傻大个,说你呢,瞅啥,俺大妹子要你给她干个活。
    蓝牙:哥,你等会儿。
    蓝牙:scanning devices.....
    蓝牙:searching for possible peripherals providing required service.....
    蓝牙:device BLEX00010EFD010 discovered.....
    CPU: 啥玩样儿啊,让你干点事儿,咋这么墨迹呢?
    蓝牙:哥,这事儿费神,您和大妹子多担待啊。
    蓝牙:bonding with BLEX00010EFD010.
    蓝牙:bonding succeeded.
    蓝牙:Bluetooth Service Linkage Established.
    蓝牙:哥,成了,叫大妹子开始吧。
    CPU:真墨迹。
    CPU转向音乐软件。
    CPU:大妹子,开始吧。
    软件:哥,叫他唱“我是女生,可爱的女生”。
    CPU:转向蓝牙。
    CPU:傻大个,唱,“我是女生,可爱的女生”。
    蓝牙:check linkage lost?
    蓝牙:linkage quality good.
    蓝牙:signal to noise ratio: -20dB.
    蓝牙:transmission rate:1 Mb/s.
    蓝牙:我是女生,可爱的女生。。。。。

    所以,在这个实例里面,CPU只是充当了协调&领导的角色。所以一个程序得以实现,其实仰仗于CPU能顺畅,有效的发布指令,和得到结果。

    而这些信息的通道就叫 BUS,或者叫总线。

    3.2. 总线(BUS)
    就像上网用网线一样,电脑内部的通信也依赖于总线。这些总线传输数据,指令,地址等一系列的信息,是电脑完成各项计算和操作人物的物理基础。在计算机内部,每一个硬件设备都以特定的方式与CPU想连。哪怕是外接设备,也可以通过USB,SD卡槽得以连接。

    但单单有物理基础还是不够的,就像你只有电话线,只有网线,只有天线。

    你还需要一些通讯协议。

    4.3 通讯协议
    谁都有嘴,但并不是谁和谁都可以用嘴高效正确地传递信息。(我就发现,一和女孩子讲话,我就懵逼。) 而一门共同的语言就像是一个协议,确保双方所言所闻都能被正确的处理。总线也一样,也需要有一套既定的协议,得以让信息能在CPU和MCU之间正常往来。比较常用的协议有SPI, I2C, UART, 等等。这些协议规定了,什么指令表明什么含义,什么时候可以发信息,有几条数据线,电压多少,频率多少,等等。事无巨细,一律都有非常严谨统一的规定。

    为了不让看官厌烦,我也不会跟老学究老教授一样说一堆,如果后面有空间,我可以举几个例子,这边我暂且按下不表。

    4. 最终章:总结暨对这个问题的直接回复
    当程序员在电脑的终端写下一行命令,比如说"turn off the bulb"(我们假设有个程序员在CPU上接出一根电线到一个小灯泡上面) 。从打下到执行有如下步骤。

    我们的这句话会被编译成若干个指令,就像(瞎编):
    0101 0000(翻译:CPU把0写到内存里特定的位置),
    00010101(翻译:通过总线,用I2C,叫一下小灯泡的MCU),

    然后小灯泡被叫了一下之后,自己到约定的这个内存为止去读数字,发现是0,所以输出0,这个0 就是个低电压,可以理解成0V,然后0V和5V与逻辑之后,就是0V,所以小灯泡就关了。

    当然,我上面也纯属扯淡,这个指令不可能用短短几行代码来完成。使用I2C协议本身可能就需要超过一百条代码:通过吧某些地方的电压拉低,某些地方的电压拉高,来完成通信,有点类似黑帮片里面交易双方互相闪车灯。

    今天先写这些,后面有时间会再补充一些内容。

    看官们鼓励一下把。

    -------补充-------

    5. 逻辑门的物理实现:MOSFET

    有了理论上的逻辑门,现在需要做的,就是着手设计切实可用的逻辑元件。从最开始的阴极管到现在的晶体管(Transistors),在过去的大半个世纪,这些逻辑元件的实现经历了数次更新迭代。无论在速度,稳定性上,都出现了质的飞跃。

    今天,我们就来讲一下MOSFET(metal–oxide–semiconductor field-effect transistor,金属氧化物场效应晶体管),它是现如今电子行业用的最多的逻辑元件,比如说我们常听到CMOS技术等等,就是基于MOSFET。

    但是,在开始之前,我们必须先涉猎枯燥的,玄幻的,又非常重要的半导体理论。

    5.1. 硅

    一切都要从硅开始说起。

    硅,其实并不稀奇。

    地球上最多的元素:氧硅铝铁。这个我们都会背。

    如果说没有贝尔实验室和那一群伯乐(我忘记那些科学家的名字了),可能硅还是会很平凡的,作为砂石,存在这个星球上。

    硅,基于我非常有限的高中化学知识:四价,共价键,非常稳定,不易得电子,不易失电子。

    除了稳定,看似没什么鸟用。但是,当少量的+3/+5价单质(如:Ga/As)被混入硅之后,我们就真的化腐朽为神奇了。

    比如说,假如我们把0.1 Mol的As混入了1 Mol的Si之后,因为As为+5价,所以相比于Si,那个多出来的电子非常活跃,容易脱离原子核。这就导致一块不带电的混合物里面,有大量的(这里,大量只是相对于一块Si单质)带正电的原子核(+5As丢了一个电子)和同等量的游离电子(e)。我们称这块混合半导体为n-type(negative)。

    到这里其实非常好理解。easy peasy。

    同理,我们可以想象把0.1 Mol的Ga混入另外一个1 Mol的Si里面。这时候,那些牛逼的理论物理学家在这时候引入了穴的概念(Holes)。因为Ga特别容易得电子,导致有些Si的电子会被Ga偷取,留下了一些穴,而这些穴,就像+1的电子,也会不停的运动。我们称这个半导体为p-type(positive)。

    然后,当我们把一个p-type 和一块n-type放在一起的时候,神奇到让人无法相信的事情发生了。

    (我觉得我可能都讲不清楚~~~~~~~)

    5.2. PN Junction(PN 结)

    我们可以自己做一下思想实验,接触面两边邻域的电子和穴会互相中和,导致这一块区域(depletion region)的电子和穴非常稀少,而那些固定的原子核(包括带+1的As和带-1的Ga)并不会变化。他们会造成一个稳定的电场,阻止了其他地方的电子和穴涌入。于是一个动态稳定(dynamic equilibrium)形成了,如图。
    <img src="https://pic4.zhimg.com/d31a4e375bf257d8b4dd1ac86ccc7f9b_b.png" data-rawwidth="661" data-rawheight="248" class="origin_image zh-lightbox-thumb" width="661" data-original="https://pic4.zhimg.com/d31a4e375bf257d8b4dd1ac86ccc7f9b_r.png">为了看官不头疼,这里我省去若干章节。总而言之,言而总之。到这里,我们就得到了一个二极管。 为了看官不头疼,这里我省去若干章节。总而言之,言而总之。到这里,我们就得到了一个二极管。

    当我们施加一个正向电压的时候,depletion region会因为电压的缘故变薄,大量的电子和穴得以穿过,造成很强的电流。而当我们施加一个反向电压的时候,depletion region会变厚,电流无法通过。

    wah lah ~

    5.3. 场效应晶体管

    有了这个理论,后面要做的就不难了。(Bazinga!写到这里我已经彻底懵了,我是照着参考书写的。)

    一个MOSFET就长这样。
    <img src="https://pic3.zhimg.com/02821f8e167993b00416c3e8d85c925a_b.png" data-rawwidth="357" data-rawheight="342" class="content_image" width="357">为了便于理解它的工作原理,我们可以把它简化成这样: 为了便于理解它的工作原理,我们可以把它简化成这样:
    <img src="https://pic2.zhimg.com/af795018c6c0530b8f771b34fb27584d_b.png" data-rawwidth="641" data-rawheight="473" class="origin_image zh-lightbox-thumb" width="641" data-original="https://pic2.zhimg.com/af795018c6c0530b8f771b34fb27584d_r.png">
    当我们不给Gate这个电压的时候,我们得到了两个典型的PN Junction(Drain & Subtract, Subtract & Source),电流是无法流过的。

    当我们给Gate施加一个正电压的时候,Gate的上层带正电,下层则带了负电。但因为Gate是个不导电的金属氧化物,所以它的下部会形成一个n type 通道(induced electron inversion layer)--电子可以直接从Source流到Drain。于是,我们得到了一个电流通路。

    这就是我们的逻辑开关了。

    最后,我们需要了解,MOSFET可以分为两种,一种叫P-MOS, 一种叫N-MOS。我们上面的图例其实是NMOS因为整个的载体为电子。很显然,PMOS的载体就是穴,它的source和drain都是P-type。

    在现实的使用中,两者的区别就是:
    High Gate Voltage Low Gate Voltage
    PMOS 断路 通路

    NMOS 通路 断路


    <img src="https://pic2.zhimg.com/712e825912f58a17cb441e2ea841714d_b.png" data-rawwidth="315" data-rawheight="167" class="content_image" width="315">
    5.4. CMOS (Complementary MOSFET BALABALA)逻辑电路

    单个的MOSFET似乎并没有神力,但当若干个mosfet组合到一起,我们就可以很轻松的得到各种我们想要的逻辑门。



    <img src="https://pic1.zhimg.com/e388f0e4f51b59e9698a1b42a68c0100_b.png" data-rawwidth="493" data-rawheight="420" class="origin_image zh-lightbox-thumb" width="493" data-original="https://pic1.zhimg.com/e388f0e4f51b59e9698a1b42a68c0100_r.png">

    这个图例看起来很复杂,但其实是个纸老虎。首先,我们给Vdd通5V电源。

    假设两个输入都是1, 即5V。对照5.3.的最后的表格
    Q1: 通
    Q2: 通
    Q3: 断
    Q4: 断 (Q1 和Q2 通导致Q5和Q6的Gate连到了5V,也即高电压上)
    Q5: 通
    Q6: 断
    所以,输出连接到了Vdd,也即5V,也即1.
    同理,其他易证。

    展开全文
  • 软件如何控制硬件、编译器和操作系统是否需要编译

    软件如何控制硬件、编译器和操作系统是否需要编译

      (2014-10-07 11:25:44)
    标签: 

    it

     

    ----作者:山野子   QQ814577355 

    注:相信很多人都会有跟我一样的疑问,那就是软件如何控制硬件、编译器和操作系统是 否需要编译?为了解决这个问题,想了几天几夜,搞得头晕脑胀,翻了很多书,什么模拟电路,数字电路,操作系统原理,计算机组成原理,编译原理,微控制器与接口技术,也上网查看了资料,总算是稍微有点收获,以下内容有些是网上信息的整理,有些是书籍上整理出的,还有一些是我自己的理解,不保证完全正确,仅供交流学习,望有高手批评指正。  

    现在就让我们来讨论上述疑问 首先必须明确一下几点: 

    1 计算机中的任何数据(程序、数据等)都是以二进制的形式存在的于存储单元中,存储单元中实际上保存的就是高低电平(数字逻辑电路中的说法,在逻辑电路中,低电平表示0,高电平表示1。一般规定低电平为0~0.25V,高电平为3.5~5V。)。 

    2 在设计硬件时,就规定了一套计算机能实现的各种基本操作,我们把每一种基本操作用

    命令的形式来表示,就是所谓的指令,也就是每一套计算机都有自己的一套指令系统。

    指令通常分成操作码和操作数两大部分。而操作码就是一系列二进制编码,这些二进制编码就是控制计算机工作的电平信号。程序的执行过程就是取出指令和执行指令这两个过程的循环。机器从停机状态进入运行状态,要把第一条指令所在的地址赋给程序计数器PC,然后就进入取指阶段(这一点是至关重要的一步,后续的所有操作都是从这一步有序的开始的,计算机开机运行时最先运行的就是BIOS程序,由此可知程序计数器的初始值就是BIOS程序所在的存储单元的首地址,BIOS程序使用特殊工艺烧录到ROM中去的,在主板上有专门的BIOS芯片),在取指阶段从内存中读出的内容必为操作码,所以通过数据总线将其送至数据寄存器DR然后再送至指令寄存器IR,然后再送给指令译码器ID,译码以后就产生相应的控制信号,控制计算机各部件完成相应的任务。 

    3 必须明确任何可执行的代码都是机器码组成的。用任何编程语言编写的程序最终都需要编译链接成机器码程序,加载到内存中去执行代码只能是机器码。二进制代码在机器里面其实使用电压的高低来表示的电压高代表1电压低代表0 

    总之一句话,计算机里面运行的是高低电压,你所有的操作,还有计算机操作系统及应用软件的操作都是通过电压的高低来对硬件进行控制的。软件的实质就是电压信号。

    然后再探讨下面的问题: 

    1、编译程序本身也是程序,那它又是由谁来编译呢? 

    其实最原始的编译器是用机器码编写的,然后通过人工的方式输入到计算机中去执行的(这个用机器码编写的程序当然是不需要编译的)。有了这第一个编译器后,使用高级语言编写的程序就成为可能,都是按一定的规则编写的,编译的作用就是将这个按一定规则编写的程序翻译成机器码程序。这个翻译过程从电路原理上讲就是编译器程序相当于操作码,而源程序就相当于操作数,编译器代码控制硬件按照一定的算法去完成对源程序代码进行处理,操作结果就是目标代码。 

    有了第一个编译器后那么以后就可以用高级语言去编写新的编译器或操作系统或是任何其他的程序。这其中就用到交叉编译的概念。 2、什么是交叉编译? 

    一个经常会被问到的问题就是,“既然我们已经有了主机编译器,那为什么还要交叉编译呢?”其实答案很简单,没办法啊!有时是因为目的平台上不允许或不能够安装我们所需要的编译器,而我们又需要这个编译器的某些特征;有时是因为目的平台上的资源贫乏,无法运行我们所需要编译器;有时又是因为目的平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器。  

      另一个经常会被问到的问题就是:“既然可以交叉编译,那还要主机编译干吗?”其实答案也很简单,交叉编译是不得已而为之!与主机编译相比,交叉编译受的限制更多,虽然在理论上我们可以做任何形式的交叉编译,但事实上,由于受到专利、版权、技术的限制,并不总是能够进行交叉编译,尤其是在业余条件下!举例来说,我们至今无法生成惠普公司专有的som格式的可执行文件,因此我们根本无法做目的平台为HPPA-HPUX的交叉编译。  

    需要交叉编译的原因有两个:首先,在项目的起始阶段,目的平台尚未建立,因此需要做交叉编译,以生成我们所需要的bootloader(启动引导代码)以及操作系统核心;其次,当目的平台能启动之后,由于目的平台上资源的限制,当我们编译大型程序时,依然可能需要用到交叉编译。 3、操作系统是如何完成对硬件的管理? 

    其实操作系统是通过管理各个设备的驱动程序来完成对硬件的管理,( 什么是“驱动程序”呢?驱动程序即添加到操作系统中的一小块代码,其中包含有关硬件设备的信息。有了此信息,计算机就可以与设备进行通信。驱动程序是硬件厂商根据操作系统编写的配置文件,可以说没有驱动程序,计算机中的硬件就无法工作。操作系统不同,硬件的驱动程序也不同,各个硬件厂商为了保证硬件的兼容性及增强硬件的功能会不断地升级驱动程序。如:Nvidia 显卡芯片公司平均每个月会升级显卡驱动程序23次。驱动程序是硬件的一部分,当你安装新硬件时,驱动程序是一项不可或缺的重要元件。凡是安装一个原本不属于你电脑中的硬件设备时,系统就会要求你安装驱动程序,将新的硬件与电脑系统连接起来。驱动程序扮演沟通的角色,把硬件的功能告诉电脑系统,并且也将系统的指令传达给硬件,让它开始工作。)硬件能工作,但我们无法直接使用,所以有相关的设备驱动程序(他会告诉上层我这些硬件具备什么功能)提供了一个借口供上层调用。而操作系统的内核就会把这些借口进一步的封装成库函数之类的,我们上层的应用程序就可以通过调用这些库函数来间接的操作硬件了。 

    操作系统就是起到一个传递者和管家的角色,操作系统维护了一个叫注册表的东西,所有的硬件都得到操作系统那注册报到,那么其他的应用程序要用到硬件资源就都必须经过操作系统,由操作系统将运用程序的请求转给硬件,因为只有操作系统保存着硬件的相关信息。同样,硬件反馈回来的信息也是传给系统的,系统再转给应用程序。 

    4、操作系统也是软件,那它需不需要编译?  操作系统也是需要经过编译成机器码才能工作的,我们安装在硬盘上的操作系统其实就已经是机器码程序了,那它又是在哪编译的呢,其实操作系统的编译过程就是用到了上面说到的交叉编译来完成的,即在系统安装盘里的操作系统就是在别的平台上编译后的机器码。 

    5、操作系统是如何开始工作的? 

    要说明操作系统是如何工作的就必须先说说什么是BIOS BIOS是英文"Basic Input Output System"的缩略语,直译过来后中文名称就是"基本输入输出系统"。它的全称应该是ROMBIOS,意思是只读存储器基本输入输出系统。其实,它是一组固化到计算机内主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、系统设置信息、开机上电自检程序和系统启动自举程序。从功能上看,BIOS主要作用如下: ⑴自检及初始化  

      这部分负责启动电脑,具体有三个部分:  

      第一个部分:是用于电脑刚接通电源时对硬件部分的检测,也叫做加电自检(Power On Self Test,简称POST),功能是检查电脑是否良好,通常完整的POST自检将包括对CPU640K基本内存,1M以上的扩展内存,ROM,主板,CMOS存储器,串并口,显示卡,软硬盘子系统及键盘进行测试,一旦在自检中发现问题,系统将给出提示信息或鸣笛警告。自检中如发现有错误,将按两种情况处理:对于严重故障(致命性故障)则停机,此时由于各种初始化操作还没完成,不能给出任何提示或信号;对于非严重故障则给出提示或声音报警信号,等待用户处理。  

      第二个部分是初始化:包括创建中断向量、设置寄存器、对一些外部设备进行初始化和检测等,其中很重要的一部分是BIOS设置,在BIOS ROM芯片中装有一个程序称为“系统设置程序”,就是用来 设置CMOS RAM中的参数的,微机部件配置情况是放在一块可读写的CMOSRAM芯片中的,它保存着系统CPU、软硬盘驱动器、显示器、键盘等部件的信息,当电脑启动时会读取这些参数,并和实际硬件设置进行比较,如果不符合,会影响系统的启动。  

      第三个部分是引导程序:功能是引导DOS或其他操作系统。在完成POST自检后,ROM BIOS将按照系统CMOS设置中的启动顺序搜寻软硬盘 驱动器及CDROM、网络服务器等有效的启动驱动器 ,读入操作系统引导记录,然后将系统控制权交给引导记录,由引导记录完成系统的启动。BIOS先从软盘或硬盘的开始扇区读取引导记录,如果没有找到,则会在显示器上显示没有引导设备,如果找到引导记录会把电脑的控制权转给引导记录,由引导记录把操作系统装入电脑,在电脑启动成功后,BIOS的这部分任务就完成了。 

    ⑵程序服务处理  

      程序服务处理程序主要是为应用程序和操作系统服务,这些服务主要与输入输出设备有关,例如读磁盘、文件输出到打印机等。为了完成这些操作,BIOS必须直接与计算机的I/O设备打交道,它通过端口发出命令,向各种外部设备传送数据以及从它们那儿接收数据,使程序能够脱离具体的硬件操作。  

    ⑶硬件中断处理  

    硬件中断处理则分别处理PC机硬件的需求,BIOS的服务功能是通过调用中断服务程序来实现的,BIOS中断服务程序,它是微机系统软、硬件之间的一个可编程接口,用于程序软件功能与微机硬件实现的衍接。 DOS/Windows操作系统对软、硬盘、光驱与键盘、显示器等外围设备的管理即建立在系统BIOS的基础上。程序员也可以通过 INT 5INT 13等中断的访问直接调用BIOS中断例程。这些服务分为很多组,每组有一个专门的中断。例如视频服务,中断号为10H;屏幕打印,中断号为05H;磁盘及串行口服务,中断14H等。每一组又根据具体功能细分为不同的服务号。应用程序需要使用哪些外设、进行什么操作只需要在程序中用相应的指令说明即可,无需直接控制。

    展开全文
  • 好了,从去年自学前端知识H5+css+js,从上个星期给大家带来的服务器搭建,今天有幸给大家带来我的小项目,对于学习微信小程序控制智能硬件(包括`esp8266`)的原理与过程,我觉得对你有一定的启发!
  • 命令解析--实现硬件控制

    千次阅读 2018-12-09 11:31:03
    底层实现对数据的采集、分类、打包、发送,同时还要可以接收并解析上位机传递下来的命令。下位机通过串口来接收上位机下发的命令字,然后进行解析命令,然后去控制对应的硬件
  • 【微信小程序控制硬件第3篇 】 从软件到硬件搭建一个微信小程序控制esp8266的项目,自定义通讯协议,为面试职位和比赛项目加分! 【微信小程序控制硬件第4篇 】 深度剖析微信公众号配网 Airkiss 原理与过程,esp8266...
  • 项目主要实现了电灯、风扇、窗户的远程控制,以及获取室内的温度、湿度、室外雨水量。可通过雨水量来控制窗户的开关,以便于人们在其他地方时,窗户能够在下雨时进行关闭,防止雨水进入室内,提高人们的生活质量。...
  • 【微信小程序控制硬件第2篇 】 开始微信小程序之旅,导入小程序Mqtt客户端源码,实现简单的验证和通讯于服务器! 【微信小程序控制硬件第3篇 】 从软件到硬件搭建一个微信小程序控制esp8266的项目,自定义通讯协议,...
  • 可控硅控制之嵌入式软件实现思路

    千次阅读 2018-07-31 16:30:43
    嵌入式中可控硅的控制软件实现思路 前言 在嵌入式中可控硅控制在很多地方是不可替代的,本人在使用可控硅对灯带的控制中遇了到很多问题,但最终还是解决了这个控制问题,并且在这儿分享给大家,希望对...
  • 程序员需要了解的硬核知识之控制硬件

    千次阅读 多人点赞 2019-12-10 21:15:34
    应用和硬件的关系 我们作为程序员一般很少直接操控硬件,我们一般通过 C、Java 等高级语言编写的程序起到间接控制硬件的作用。...虽然程序员没法直接控制硬件,并且 Windows 屏蔽了控制硬件的细节,但是 Windows ...
  • 软件复位实现方法首先声明一个函数指针,指向复位后要开始执行指令的位置:void (*app_start)(void) = 0x0000;可以根据具体微处理器复位后的位置,修改后边的地址。之后,在自己的程序中想复位的地方调用app_start()...
  • 串口一拖二——硬件实现软件使用 竟然用到了串口的一拖二。 公司采购了一个KR3001的恒流直流电源给阀直接供电,使用了控制器从与阀接的压力传感器处读取数据。 原来是分成了两个软件在两台电脑上调试、发布。...
  • CPU,主板,硬盘,显卡,南北桥芯片,这些硬件在整个计算机系统中占据很重要的地位 ...首先open hardware monitor这个开源的软件实现了大部分功能,但遗憾的是只有C#版本的 简单描述下过程:CPU温
  • Android硬件加速介绍与实现

    千次阅读 2017-02-12 23:30:38
    由于操作系统对底层软硬件封装非常完善,上层软件开发者往往对硬件加速的底层原理了解很少,也不清楚了解底层原理的意义,因此常会有一些误解,如硬件加速是不是通过特殊算法实现页面渲染加速,或是通过硬件提高CPU/...
  • 你知道嵌入式软件硬件的区别吗?实际上嵌入式系统是一种专用的计算机系统,...有些嵌入式系统还包含操作系统,但大多数嵌入式系统都是由单个程序实现整个控制逻辑。嵌入式是软件还是硬件?在这里为大家解析。 ...
  • 在IM.X6q硬件平台,Linux4.1.15内核版本中实现在广域网下进行远程登录控制。 主控机为Windows机器,被控机是IMX6平台的Linux系统 被空机与主控机都必须能够连接互联网 2 解决方案 使用开源软件VNC+花生壳进行内网...
  • 硬件软件的关系 硬件软件是一个完整的计算机系统互相依存的两大部分,它们的关系主要体现在...⑵ 硬件软件无严格界线 随着计算机技术的发展,在许多情况下,计算机的某些功能既可以由硬件实现,也可以由软...
  • 置顶公众号,不错过每一条消息!我们都知道硬件看门狗的目的:是用来监测系统,防止系统死机,并在死机的情况下使系统复位重启。在RTOS操作系统中,如果任务(线程)较多,出现高...
  • 计算机中软件硬件的简单介绍

    千次阅读 2018-02-21 22:30:25
    CPU由运算器、控制器、寄存器、高速缓存及实现它们之间联系的数据、控制及状态的总线构成。作为整个系统的核心,CPU也是整个系统最高的执行单元,因此CPU已成为决定电脑性能的核心部件,很多用户都以它为标准来判断...
  • 下面以STM32FI的SPI2为例,分别进行初始化(参数配置)、SPI速度设置(接收中断)、读写一个字节功能的实现,其代码实现参考如下三张图: 1、SPI2的初始化 2、SPI速度设置函数 3、读写一个字节功能函数 另: 软件SPI...
  • HLS(high-level-synthesis),高级综合,将C/C++/SystemC编写的软体算法综合成RTL编码(VHDL/HDL),以实现软件算法设计的硬件加速和硬件电路设计的抽象级设计&验证。 HLS简述 HLS(High-le
  • 操作系统怎样控制硬件

    千次阅读 2019-05-04 15:29:01
    比如说,让你的文字处理软件保存一个文档时,应用程序不需要知道如何控制硬盘驱动器.取而代之的是,文档处理软件将命令和需要保存的数据传送给WINDOWS. 2:操作系统要通过检查确认保存数据的命令没有问题...
  • 本博文由热爱分享热爱技术的半颗心脏原创,非官方人员、非组织名义编写,博文如有不对或侵犯您的权益,请及时留言,第一时间纠正! 【微信小程序控制硬件①】 全网首发...【微信小程序控制硬件③】 从软件到硬件搭...
  • Redis实现访问流量控制

    千次阅读 2017-09-03 18:10:08
    redis实现访问流量控制的方法。
  • 最近在自学计算机相关的基础课程,感觉自己终于理解了计算机的硬件软件,以及软硬件接口三大层面的内在关系。 记录一下自己的理解。 我想通过不同层次程序员的视角来看计算机的 计算机的硬件包含了CPU, 内存以及...
  • 软件定义和硬件重构知多少(一)

    千次阅读 2015-12-27 11:59:13
    在这一过程当中出现了两个泾渭分明的阵营:软件定义和硬件重构。以Google、Facebook和国内BAT为代表的互联网公司发起了“硬件重构”运动,例如OCP(由Facebook发起的开放运算计划)和天蝎项目(由BAT发起);另一...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 351,203
精华内容 140,481
关键字:

如何实现软件控制硬件