全文原创,转载请标明出处算法
若是您发现我写错了、不明白我写的内容或者能提出建设性意见,那么恳请您在评论区发表高见编程
本文的定位只是让具有基本电学、数制知识的读者明白裸机工做的大体流程,并不针对某款特定的芯片,不讲编程,全程幼儿园化sass
先讲解一些基本的数字电子技术知识,再让读者尝试打草稿"设计"一款单片机,而后延伸到何为软件何为硬件,最终完结撒花服务器
1.芯片架构
电信号是目前最容易处理的信号,咱们能用模拟电路、数字电路来处理电信号并发
电路能被集成在一块芯片里成为集成电路(IC,integrated circuit),模拟电路、数字电路都能被集成dom
单片机内核、电脑处理器内核都是数字电路,因此若是你认为芯片就是电脑CPU、显卡、内存条等等,那就错了,你忽略了广大的模拟集成电路,还有架起模拟电路和数字电路的桥梁的模数转换器(ADC)、数模转换器(DAC)异步
2.晶体管编程语言
模拟电路、数字电路里都有大量的晶体管(transistor)。晶体管是大名鼎鼎的贝尔实验室的几位工程师发明的,晶体管是20世纪最伟大的发明之一,它奠基了信息时代的硬件基础,奠基信息时代的软件基础的是香农(Claude Elwood Shannon)的信息论。发明晶体管的几位工程师都得到了诺贝尔物理学奖,发明集成电路的基尔比(Jack Kilby)也得到了诺贝尔物理学奖编辑器
晶体管在模拟电路里放大信号,在数字电路里当开关
晶体管学起来仍是很是复杂的,学过模拟电子技术的同窗确定会赞同我,这里就简短地介绍一下晶体管,不讲深奥了:
上面是常见的晶体管的电路符号
晶体管能够被看做受控电源,从上面的几种晶体管里抽出一个,它的各个引脚的名称以下图所示
对于上图这种晶体管,它的Gate的电压高于Source的电压VGS能控制Drain到Source的电流IDS,人话版:下图电路中只有2条电流通路,分别被用橙色、蓝色箭头标出。对于上图中的这种晶体管,电流没法从Gate流到Drain、没法从Source流到Drain,VGS能控制Drain和Source之间的导电通道的"宽度",越"宽"的话则容许流过的最大电流越大
在模拟电路里,"宽度"可能的取值很是多,多得让你对学习丧失信心
在数字电路里,"宽度"的取值范围只限于2个值:0和最大
3.逻辑门、电平
下图电路中电池负极接着地(GND),固然这个"地"不必定是地球表面,GND是用来定义电路中电压为0V的点的
高中物理学过"定义无穷远处电势为0V"或"定义大地电势为0V",下图电路也相似地定义电池负极电压为0V
若是说某个点的电压是多少伏,那就是在说那个点的电压相对于0V点的电压;
若是说某个元件好比下图中电阻的电压,那就是在说这个电阻两端各自对0V点的电压的差值
让上图电路中的信号源输出电压够小好比0V,那么"宽度"就能取到0,蓝箭头指示的电流就不存在了,那么Drain的电压等于电池的正极电压3.3V;
让信号源输出电压够大好比3.3V,那么"宽度"就能取到最大,蓝箭头指示的电流也能达到最大,那么这时Drain的电压就接近电池负极的电压0V
这样就实现了经过信号源的电压来控制蓝色箭头指示的电流通路的通断,晶体管的做用是否是很像开关呢
这个电路实现了将输入取反的功能,这样的数字电路叫非门,上图的非门存在一些问题好比输出0V时有电流流过电阻,那么电阻会消耗电能
之后就用下面这个符号来表示非门,左边输入,右边输出
在上面的非门的例子中也能够把0V称做低电平或者用二进制数0表示,把3.3V称做高电平或者用二进制数1表示
实际上"不会致使数字电路错误工做"的低电平、高电平的电压值并不固定,而是在必定范围内,好比上面的非门的低电平范围多是-0.3V~+0.5V、高电平范围多是2.8V~3.5V
若是把晶体管换成耐压值更高的、电池换成5V的,那么低电平、高电平的范围也可能变化,可能高电平的范围变成4.5V~5.2V
低电平是0、高电平是1的数字逻辑称做正逻辑,不然称做反逻辑,大多数状况下选用正逻辑,若是用反逻辑,得特别说明
对于正逻辑,高电平的电压范围是这种电平规则的特征,好比高电平是3.3V的电平规则叫CMOS电平,高电平是5V的电平规则叫TTL电平
若是要实现不一样电平的互联,可能须要进行电平转换,不然可能烧毁晶体管或者晶体管不认前级发来的高电平
相似地,还能用晶体管搭建出与门、或门、异或门等等,这些电路叫逻辑门电路。这里不必画出其它逻辑门的电路图了吧,就算画了,你也不必定看,总之你知道确实有这些逻辑门就行,你设计不出来不表明那些天才工程师、科学家们设计不出来
与门:能够多输入,全部输入都为1才输出1
或门:能够多输入,只要有输入为1就输出1
异或门:只能2输入,2个输入不一样则输出1,不然输出0
这些简单的逻辑门电路能构成功能更复杂的电路,好比加法电路:可能有2组输入、1组输出,每组输入多是8bit,输出可能也是8bit,输入2个二进制数,自动输出相加结果
你可能会问若是8bit不够表示相加结果怎么办?怎么算减法?怎么计算负数的运算?这些问题并不影响你理解本文后面的部分,你要是有兴趣的话,那就稍后去自行搜索这些问题吧
既然是用逻辑门构成的,那么这个加法电路的输入、输出也是0、1,这种状况下用二进制表示数具有自然的优点
你知道能用逻辑门搭出加法器就行,你是否能搭建出加法器并不影响你认识单片机
相似地,用逻辑门还能设计出数据选择器、编码器、译码器等等逻辑电路
4.组合逻辑电路、时序逻辑电路
上面提到的数字电路的输出都只与输入有关,这样的数字电路叫组合逻辑电路
还有一类数字电路,它下一时刻的输出不只与当前时刻的输入有关,还与当前时刻的输出有关。举个例子好比秒表,它在计时的时候:
秒表电路须要知道到底有没有"过了1秒",能够每隔1秒发一个高脉冲或低脉冲或上升沿或降低沿让电路知道过了1秒,这个周期为1秒的信号就是这个时序逻辑电路的时钟信号
这种下一时刻的输出与这一时刻的输入输出都有关的逻辑电路叫时序逻辑电路
时钟信号由振荡电路产生,时序逻辑电路的内部构造比组合逻辑电路的更复杂,设计振荡电路也有必定难度。这里就不打击你们的阅读兴趣了
如今你具有了必定的知识储备,那么来尝试设计你的单片机。会设计单片机的话,也能大体知道设计电脑处理器的流程
5.最小系统
设计单片机
上面提到的时钟信号、复位信号、电源,再加上单片机,就能组成单片机的最小系统
能够这么直观地理解最小系统:用你设计的单片机制做产品,不管产品是什么,时钟信号、复位信号、电源、单片机是确定会被包含在产品里的,这4个都具有时产品才可能正常工做,只要缺乏一个,那么产品总有个时候会不能正常工做;任何产品都能被看做是在最小系统上继续搭建而成的
6.指令集
你得让单片机获取你下达的指令并执行:这个"指令"是什么?以什么形式存在?怎么向单片机下达"指令"?
你的单片机的输出是由单片机内部的数字电路处理获得的,单片机里能够有不少具有不一样功能的数字电路好比加法器、定时器等等,完成一件工做好比计算一个算式1+2×3+2×5确定会用到一些步骤,计算这个算式的步骤确定有前后顺序,单片机可能会这么作:
你得设计一个"听话"的电路来完成上面的指令,还得设计一些存储器来暂存中间结果
你向单片机传达指令确定是用二进制串,由于数字电路只认二进制串,假设你设定0000表示算加法,那么你但愿这个"听话"的电路:
是否是以为这个"听话"的电路难以设计?没事,你不会设计不表明天才的工程师们、科学家们不会设计,假设你请来一位大神同窗Q,向Ta讲述你的要求:
看你刚才提的要求:收到0000、0001等以后就作某某事,这就是你设计的一套指令集架构(Instruction Set Architecture,简称ISA)
7.内核、微架构
你若是请另外一个大神设同窗W也设计一个"听话"的电路来实现你的指令集,那么同窗W设计的电路不必定和同窗Q设计的彻底相同,甚至W设计的电路可能效率更高,有些指令执行所需的时钟周期比Q设计的电路须要的更少
Q和W萌生了独自创业的想法,他们都认为用这个电路继续搭建出完整的单片机还得烧更多钱,不如之后只设计这种电路算了,把设计好的方案卖给其它设计单片机的公司,这样双方都能专一于各自的领域,最终产品的性能能够更优越,双方也都能节省精力
为了方便单片机公司,Q和W把他们设计的电路继续完善,好比集成加法器等等
Q和W完善以后的东西叫内核(Core),就是单片机内核、电脑处理器的内核,他们实现内核的方式叫微架构(Microarchitecture),他们的内核都能实现你设计的指令集,他们给本身设计的内核设定独一无二的名字
现实世界中大名鼎鼎的ARM公司就像大神Q、W,ARM公司专一于设计内核,把内核设计方案卖给大名鼎鼎的ST、ADI、TI、NXP、华为海思、高通、苹果等等芯片设计公司
ARM公司如今设计的内核的名字都是Cortex ??,第1个问号是"A"、"R"或"M",第2个问号是十进制数,多是1位也多是2位十进制数,之后可能会是更长的十进制数。例如上图中的Cortex A5三、Cortex M3
高通买来Cortex A53的受权,开发出骁龙625;ST买来Cortex M3的受权,开发出STM32F1系列
骁龙625常被称为片上系统(System on Chip,简称SoC)或者微处理器(Micro Processor),常被用于手机等等;STM32F1系列常被成为单片机(Siingle Chip),被普遍应用于家电、玩具等等
因为A53和M3的性能、功耗、成本的差别,人们对它们构成的芯片的称呼不一样,芯片的用途也不一样
发现上图中的Cortex A5三、M3里有不少东西是你不认识的?不要紧,你总会认识的
也有公司从内核到芯片全都自行设计,好比大名鼎鼎的Intel、AMD、Nvidia
回来继续设计你的单片机:
8.存储器
你使用内核时,要是得全程手动地
这不得烦死你,这样算算式比你手算还慢
因而你想把指令存起来,让时钟信号能本身不断地跳变,你只需把指令编好存起来就行
你须要开发存储器,你再找来一位大神E,向Ta提要求:
有1个高电平使能引脚(使能(enable),能够理解为使……能……,好比高电平使能,那么使能脚为高电平时则存储器能工做,不然不工做,高电平就叫使能脚的有效电平)
使能脚电平无效时存储器的数据线呈高阻态(高阻态也称Hi-Z,若是你认识"高"的英文单词、知道电学用Z表示阻抗,就不难理解Hi-Z就是高阻态。稍后让你直观理解高阻态)
能够这么理解高阻态:
上图电路中若是电阻阻值越大,那么测试点的电压就越接近信号源的输出电压,当阻值无穷大好比开路时,测试点的电压就是信号源的输出电压
存储器不工做时数据线呈高阻态的好处:
假设一个电路中存储器A、B都有8根数据线D0~D7,把它们各自的Dx(x是0~7的整数)接在一块儿,当只有一块存储器假设是存储器A工做时,那么Dx相连的点的电压就是存储器A的数据线的输出电压
至于为何要这么链接存储器A、B,这是大神Q、W给你建议的,他们把内核和存储器联调成功后,你就知道为何要这么接存储器A、B了
大神E通过不断研究发现(现实世界中也是如此):
掉电后数据会丢失的存储器的读写速度很是快并且造价高昂,能够每次只读写1个存储单元,想读写哪一个单元就读写哪一个单元。这样的存储器被命名为随机访问存储器(Random Access Memory,简称RAM)。大神E的初代产品叫静态随机访问存储器(SRAM),是个组合逻辑电路;后来大神E又研发出容量更大、速度更快的SDRAM、DDR等,都是时序逻辑电路
掉电后数据不丢失的存储器有的只能写一次,有个能够用紫外线照好久后擦掉内容后再写,有的能够用电飞快地擦除后再写;
大神E对掉电后不丢失数据、能够用电擦除内容的存储器的研究成果以下:
命名 | 特性 |
EEPROM (Electrical Erasable Programable Read Only Memory) |
可读写任一存储单元 集成度很低 速度慢 |
NOR Flash | 可只读任一存储单元 存储区分块,好比每4096个存储单元为一个块,各块内部连续、外部相邻 若是要写入的存储单元的内容是0xFF就能直接写,不然要把存储单元所在的块的全部存储单元写为0xFF再继续操做 集成度高些 成本低些 |
NAND Flash | 不能读写任一存储单元,每次得至少读或写必定数量个存储单元 集成度很是高 成本很是低 |
你可能会问:EEPROM是可写的,为何叫ROM?等下你会分析该如何把掉电不丢失数据的存储器用在你的单片机里,分析的时候你就知道了
这么一看,NOR Flash、NAND Flash也属于EEPROM的行列,可是如今EEPROM通常指上表中能随意读写任一存储单元的低集成度的存储器
你确定须要用到掉电不丢失内容的存储器,但那些只能写1次、须要紫外线擦除很久的确定不用
若是采用EEPROM,单片机可能没法小巧玲珑
若是采用NAND Flash来存储你的指令、数据,那么会增长内核的复杂度、严重浪费这样的存储器的存储空间、严重拉低内核的执行效率
那就用NOR Flash吧,能作到读任一存储单元,虽然作不到写任一存储单元,但你可让单片机在运行时尽可能只读取NOR Flash的内容而不写入(如今知道为何叫ROM了吧),让须要被不断读写的数据躺在RAM里。SRAM控制简单,就用它了
把这些存储器塞到单片机里面,这样才"单片"嘛
9.总线
如今Q、W修改他们设计的内核,让内核能自动地取你存储的指令和数据、执行完后就继续取下一条指令及其数据
Q、W对内核作出以下修改:
假设你选用的NOR Flash、SRAM的数据线都有8根、地址线都有7根,还各有1个名为EN的使能引脚(假设高电平有效),像下图这样链接内核和存储器
若是用十六进制数表示内核的地址总线上的值,高位在前低位在后,那么显然内核访问地址0000 0000B~0111 1111B就能访问到SRAM里的内容、访问地址1000 0000B~1111 1111B就能访问到NOR Flash里的内容
这样作的好处显而易见:内核的8条数据线最多能访问28=256个不一样的地址,上图的链接方式把内核的地址总线的性能榨干了
如今你知道为何要让存储器在使能电平无效时让数据线呈高阻态了吧
Q、W修改复位功能,让内核在单片机掉电再上电后从地址0x80开始取指令、取数据、执行、取指令、取数据、执行……
能够这么实现:
你之后把编写好的程序从NOR Flash的首地址开始存储,内核就能按照你的意愿工做了
前面列举算加法的步骤时用了几个存储器来暂存加法的计算结果,这里又用几个存储器来指定内核执行的指令的地址,这些存储器起到了反映、控制电路的运行状态的做用。把这样的存储器称为寄存器
10.外设
若是想让单片机能具有更多功能呢?那就塞入更多电路到单片机里
这些被塞入的电路模块叫外设,因为它们都在单片机内部、在内核外部,因此也叫片内核外外设
有的外设好比LED,它并不在单片机内部,因此叫片外外设或者板载外设
有的外设在内核里,好比加速内核执行指令用的一些外设,这样的外设叫核内外设
11.寄存器
单片机内核怎么控制众多的外设呢?给它们每一个分配一个内核?这样太复杂了,外设须要实现的功能通常很单一,那就给外设们分配一些寄存器吧
至此你再次知道了那个很是重要的思想:寄存器能反映、控制单片机的运行状态
这里的片内外设寄存器挂在内核的地址总线上,可是寄存器并不老是须要挂在地址总线上,好比咱们用的电脑的处理器Intel、AMD公司的CPU,它的内核的不少寄存器就没挂在内核的地址总线上,它的一些指令能读写这样的寄存器
拿大名鼎鼎的STM32单片机来举例:
取自STM32F103x八、F103xB的数据手册Rev. 17第34页的内存映射图(memory map)
STM32的地址线有32根,这32根地址线能访问到232个不一样的地址,上图指出了每一个地址范围对应哪一个外设的寄存器、哪一个存储器的内容,好比0x20000000对应单片机内部的NOR Flash的首地址,0x40012400~0x40012800对应ADC1的寄存器
232个地址并不是每一个都会被用到,那些没被用到的地址被标记为Reserved(保留)
若是要了解某个外设的寄存器的每一bit的意义、名称,那就去查参考手册上描述那个外设的寄存器的每一bit的功能的部分
取自STM32F10一、二、三、五、7 参考手册Rev. 20第237页
能够这么理解Address offset:
编写程序读写外设的寄存器,就能控制外设
12.中断
假设ADC等一众外设工做得远比内核慢,那么内核想要实时了解各外设的工做进度和结果,该怎么操做呢?不断地读外设们的寄存器?这样确实能够,可是太浪费时间了,内核宝贵的性能都被浪费在不断查询外设们的寄存器
能不能让外设主动告诉内核并让内核迅速处理?固然能够,这种技术叫中断
能够这么实现:
Q和W也以为中断技术很是重要,因而把中断控制器集成到了他们设计的内核中
13.烧录/下载
你能够设计一个专门用来链接电脑和单片机的NOR Flash的外设放到单片机里,好比不少同窗学习单片机知识用的第1块单片机STC89C51就在单片机里集成了名为通用异步收发器(Universal Asynchronous Receiver Transmitter,简称UART)的外设,它负责单片机与单片机之间、单片机与电脑之间以符合UART的规则的方式通讯。STC公司开发了运行在Windows的专门用来向STC单片机写入程序的软件STC-ISP,STC单片机的UART外设收到某串二进制后就产生一个中断告诉内核把稍后UART接到的二进制串写入NOR Flash
这个过程叫烧录或者下载
在好久之前,给单片机的存储器写入程序须要高压,一不当心就烧毁了单片机,因此有了"烧录"这个名称
单片机从电脑获取指令,像不像你经过因特网从服务器下载游戏?因此给单片机的存储器写入程序也能够叫"下载"
14.汇编语言
有没有以为老是用二进制串给单片机下达指令很是麻烦?不如用助记符代替这些二进制指令吧,因而汇编语言产生了
内核确定不认识你创造的助记符,得用软件把助记符转成内核能直接执行的二进制,实现这个功能的软件叫汇编器(assembler)
汇编语言有个很大的缺陷:过于依赖内核的工做流程、存储器的布局
你用汇编语言写程序的话,得先打草稿来划分存储空间,好比地址0x12~0x21用来暂存计算的中间结果,地址0x80~0x8F用来存实现某个功能的指令,你但愿掉电后依然能存储用户设定的一些变量,那么得在Flash里找一块空间用来存这些变量……
把用汇编语言写的程序移植到其它内核、其它存储器布局上但是个天大的工程,不如创造一种接近人类的语言、不依赖于内核和存储器的编程语言吧,C语言就是这种语言的表明之一
15.C语言
内核更不可能认识C语言,因此须要用软件把C语言代码转成内核能直接执行的二进制,须要多个软件来实现:
编译器:把C语言代码转成单片机能理解的二进制,还没完:都说了C语言能够不依赖存储器布局、你能够在C语言代码里不写任何一个存储器地址,编译器获得的结果并不包含任何一个存储器地址,因此单片机确定不能执行编译器的产物
链接器:
若是你在Windows操做系统上用Visual Studio、Code::Blocks、Dev C++等IDE写C语言程序,那么链接器得链接处能让Windows操做系统调用的可执行(executable,Windows下这种文件的扩展名是.exe)文件,这个步骤与链接处单片机能直接运行的一份二进制有所不一样,你去了解一下Windows操做系统执行EXE文件的步骤就能大体猜出到底哪里"有所不一样"了
有了C语言,开发、调试单片机程序就轻松多了
16.调试
假设写了个很是长的程序,虽然单片机能正常执行,可是执行的最终结果倒是错的。编程人员特别想让单片机慢点执行,以便观察到单片机执行完关键步骤后的结果是否正确,这些"结果"可能在寄存器,可能在SRAM,也多是某个板载外设的工做状态
上述的过程叫调试(debug)
Q和W也认为调试功能很是重要,因而把调试系统集成到他们设计的内核里
再拿大名鼎鼎的STM32单片机来举例:
有一种叫硬件调试器的电子系统,支持STM32的硬件调试器有不少种,好比ST-Link、J-LInk、CMSIS DAP-Link等等
硬件调试器能对接单片机和电脑,经过硬件调试器,能下载程序到单片机,电脑也能控制单片机控制单片机
上图是用Keil μVision MDK-ARM(这是个集成开发环境Integrated Development Environment,简称IDE,包含代码编辑器、调试器、编译器、链接器等等)+ST-Link硬件调试STM32F407ZG的界面,上半部分是反汇编(Disassembly),下半部分是源代码
Keil μVision MDK-ARM的调试器还有不少很方便的工具,好比能实时查看某个变量的值得Watch、能查看正在执行的指令是怎么被一路调用来的调用栈Call Stack等等
如今你的单片机已经很完善了,成功面世
可是有客户在用你的单片机设计产品时遇到了一些问题:
17.软件实现、硬件实现、通用计算、ASIC、超频
那些让单片机工做得很慢的代码可能频繁用到一系列操做,可能会让单片机执行不少条指令才能完成这样的1个操做,好比没有内置乘法器电路的单片机算整数的乘法得用连加
连加就是对乘法的软件实现,用乘法器电路算乘法就是硬件实现
再好比某个板载外设须要以某种规定与单片机通讯,编程人员能够分析那个板载外设的通讯规则以后,编写程序让单片机的某些引脚在适当的时刻产生适当的电平来与板载外设进行通讯,编程人员得很是仔细地分析这种通讯规则,一个细节都不能出错
若是这种通讯规则很是经常使用,那么单片机厂商能够用电路来实现这种通讯规则。把这个电路作成一个片内外设,单片机内核给这个片内外设的控制寄存器写入控制字,以后内核只需把要发送的内容传给这个外设,这个外设就能在不须要内核干预的状况下正确地将信息发送出去
事实上有不少通讯规则已经被硬件化了,好比SPI、SAI、I2C、I2S、USART、USB、HDMI、PCIe、SATA等等
用硬件电路实现通讯协议的优点有:
用软件实现的优点固然是金钱成本更低
可是硬件实现并不是老是优于软件实现,例如机械按键的延时消抖,学过单片机编程的入门例程的同窗有感触,没学过的话之后就去学吧
调试也能不用到硬件调试器,而纯软件实现,这样的调试叫模拟器调试
若是你对电脑有点研究,并且还必需要玩高画质、高帧率的游戏,那么你买打游戏用的电脑时确定会选带独立显卡的
打游戏时,独立显卡专一于计算游戏里炫酷的画面,CPU专一于其它事情
举个例子:
在这个例子中,CPU拼死也干很差独立显卡轻轻松松能干好的事
独立显卡设计者画大力气用硬件电路实现计算显示画面的算法,可能独立显卡一条指令能作好的事CPU须要成千上万条指令才能作好
在上面的例子中,有4个核心的CPU就像是4个博士毕业生,有640个(真的能够有这么多)核心的独立显卡就像640个小学生
电脑CPU的定位是作通用计算,经过支持复杂的指令集,让编程人员编写复杂的程序能实现复杂的功能
独立显卡是计算显示画面(其实不限于计算显示画面)的专用集成电路(Application Specific Integrated Circuit,简称ASIC),经过硬件电路实现了能够很是高效地实现某些功能,而在其它功能的实现上并不必定强于CPU
刚才的例子也能说明有的工做经过并行执行能极大地提高效率,好比算10之内的加减法
但有的工做却不能,假设你和你的一个同窗都喜欢玩第一人称射击游戏,但大家的技术都不行,因而大家合做:一我的控制鼠标,一我的控制键盘,大家"合体"的效果可能并没多少提高甚至更差。在这个例子中提高玩第一人称射击游戏水平的方法就一我的控制一台电脑不断练习枪法、走位、意识、队友配合、技能Combo等等,类比到单片机和电脑处理器就是提高执行速度,最多见的方法之一就是超频
内核是被时钟信号指挥的,若是时钟信号跳变得更快,那么内核就会运行得更快。内核收到的时钟信号的频率叫内核的主频,把主频提高到高于厂家建议的最高主频即超频,可是不能无限制提超频,超频会让内核运行得更不稳定甚至烧毁内核
如今的电脑CPU已经很智能了,好比Intel的酷睿CPU能睿频,即任务繁重时提高主频,任务少时下降主频来下降功耗
18.库函数
经过写单片机众多的寄存器来设置片内外设确实容易出错还费时费力,能够把配置寄存器这种繁琐的工做用函数来实现
例如ST公司为STM32系列单片机编写了丰富的库函数,用户能够用C语言调用库函数来配置STM32的外设寄存器
库函数的优点就是优秀的C语言代码的优点:能够用英语把代码读出来
劣势就是执行效率更低,你试试把用库函数初始化单片机的C代码反汇编就知道了:若是写寄存器只须要几行汇编指令,那么用库函数,得先用好多好多个RAM存储单元来暂存外设的某个功能的标志位,最终再把这些标志位作运算后赋值给寄存器
STM32的性能足够,因此代码量不大时库函数并无显著下降单片机的运行效率
19.操做系统——存储管理、并发……
刚才说过,用汇编语言写代码须要打草稿划分存储空间,用C语言写直接运行在单片机内核上的代码虽不用打刚才的草稿,但链接器须要打这个草稿,这个草稿的存在使得最终获得的二进制代码不必定能正常运行在存储器地址分布与你的单片机的不一样的单片机上
刚才还说过,内核的工做就是不断地顺序地取指令、取数据、执行,还能响应中断,若是有多件事须要单片机同时作,那么单片机只得不断地交替作这些事情,致使有些很闲的事浪费单片机的大量资源,而有些很忙的事没法被单片机及时响应
操做系统就能解决上面的2个问题
操做系统能动态地管理存储器,能合理地分配内核资源到不一样任务,对操做系统的详细描述已超出本文讨论的范围,你知道操做系统的优点就行
完结撒花,作个重点总结: