现代电子电路最基础的单元就是电子,类似于物理学中的夸克,不管是简单的放大电路还是极其复杂的芯片IC,都是由这一最小单元组成。根据不同的离子掺杂工艺,发展出了PN结和MOS工艺,通过PN结或者MOS管的导电特性,工程师将原件进行逻辑布线,诞生0和1,而这,建立起了嵌入式与实体硬件的桥梁。
不同物理层对0与1的定义是不同的,常见有TTL电平和CMOS电平。
TTL电平标准:
输出 0: <0.8V ; 1:>2.4V。
输入 0: <1.2V ; 1:>2.0V
TTL器件输出低电平要小于0.8V,高电平要大于2.4V。输入,低于1.2V就认为是0,高于2.0就认为是1。于是TTL电平的输入低电平的噪声容限就只有(0.8-0)/2=0.4V,高电平的噪声容限为(5-2.4)/2=1.3V。
CMOS电平标准:
输出 0: <0.1Vcc ; 1:>0.9Vcc。
输入 0: <0.3Vcc ; 1:>0.7Vcc.
由于CMOS电源采用12V,则输入低于3.6V为低电平,噪声容限为1.8V,高于3.5V为高电平,噪声容限高为1.8V。比TTL有更高的噪声容限。
不同的电平标准,驱动能力(即挂载的外设数上限)、通信速度、对噪声的敏感度都有所不同,实际嵌入式开发过程中,需要根据外设的技术手册确定相关电平标准。当主控IC与外设的电平标准不同时,需要在通信线路中加上电平转换电路,防止电平不同造成的逻辑混乱、甚至电源灌流烧坏逻辑器件。
电平转换电路如下:
对于一个输出结果为0、1属性的电路(即数字电路),基本的运算电路为与、非、或,由几个基本逻辑单元,以有无同步时钟作为分水岭,诞生了组合逻辑电路与时序逻辑电路(在组合逻辑电路中,着重注意一下竞争和冒险)。
竞争:在组合电路中,信号经由不同的路劲达到某一会合点的时间有先有后的现象;
冒险:由于竞争而引起电路输出发生瞬间错误。表现为输出端出现了原设计中没有的窄脉冲(毛刺)。
以下电路来源于ycc_job
CMOS非门:
CMOS与非门:
CMOS或非门:
上述的电路通过不同的组合,可以实现不同逻辑的运算,MOS结构是IC内部的基本结构,无数个MOS组成的逻辑,上亿个晶体管,组成我们的运算器(即现在的CPU)。
当逻辑运算系统及其庞大时,就需要对信号流进行控制,否则极易产生竞争和冒险,所以,在庞大的数字电路系统中,我们需要很多MOS管组成的门进行信号流的分配、分流、控制,在参考时钟的有序控制下,进行精确的数字运算。众所周知,MOS管的开断通过栅极电压控制,这里,以此类推,对于一个门极,1是开启电压,0是关闭电压,所以我们可以用0和1控制一条线上的信号开断,无数个0和1组成了嵌入式最基础的机器码,所以机器码最根本的作用,就是对门极信号的控制。
如果说机器码是简单的01组合成的庞大的指令,那么汇编是机器码之上的低级语言,在汇编语言中,用助记符代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址。不同平台的汇编指令可能会有很大的区别,例如X86架构与ARM架构的汇编指令就有所区别。
例如:
X86和ARM的传递指令都是MOV
MOV X1 X2
而X86的出栈指令为POP,ARM的出栈指令为LDP
X86:POP
ARM:LDP x29, x30, [sp,#0x10]
所以,不同的架构,我们对照该架构的指令就能对目标地址、寄存器进行底层操作,从而达到简单的程序编写。
举例:
;hello-os
;TAB=4
;以下这段是标准FAT12格式软盘专用代码
DB 0xeb,0x4e,0x90
DB "HELLOIPL" ;启动区的名称可以是任意的字符串(8byte)
DW 512 ;每个扇区的大小为512byte
DB 1 ;簇的大小为1sector
DW 1 ;FAT起始位置
DB 2 ;FAT个数
DW 224 ;根目录的大小
DW 2880 ;该磁盘大小
DB 0xf0 ;磁盘种类
DW 9 ;FAT的长度
DW 18 ;1个磁道18个扇区
DW 2 ;磁头数
DD 0 ;不使用分区
DD 2880 ;重写一次磁盘的大小
DB 0,0,0X29 ;
DD 0xffffffff ;
DB "HELLO-OS " ;磁盘名称11byte
DB "FAT12 " ;磁盘格式名称8byte
RESB 18 ;空18byte
;程序主题
DB 0xb8,0x00,0x00,0x8e,0xd0,0xbc,0x00,0x7c
DB 0x8e,0xd8,0x8e,0xc0,0xbe,0x74,0x7c,0x8a
DB 0x04,0x83,0xc6,0x01,0x3c,0x00,0x74,0x09
DB 0xb4,0x0e,0xbb,0x0f,0x00,0xcd,0x10,0xeb
DB 0xee,0xf4,0xeb,0xfd
;信息显示部分
DB 0x0a,0x0a ;2个换行
DB "hello world qian"
DB 0x0a ;
DB 0
RESB 0x1fe-$ ;填写0x00,直到0x001fe
DB 0x55,0xaa
;以下是启动区以外部分的输出
DB 0xf0,0xff,0xff,0x00,0x00,0x00,0x00,0x00
RESB 4600
DB 0xf0,0xff,0xff,0x00,0x00,0x00,0x00,0x00
RESB 1469432
上述简单的汇编程序,实现了X86架构软盘自启动hello world的功能,利用PC独特BIOS指令实现对屏幕的输出。