简介
Raspberry Pi系列不久前经过全新的Raspberry Pi Zero W1(2017年2月)扩大了产品线,这是一台支撑无线衔接的个人核算机,价格仅10美元。关于业余爱好者、制作商、工匠和黑客而言,它的含义非同小可。是的,咱们之中很少有人真实测验做好咱们的作业,即规划真实的(电子)产品!当我最近观看Eben Upton的视频布告时,我不由得想起早年的阅历。那是80年代中期,我买不起BBC电脑,也担负不起奢华的Amiga。但我花光一切的钱购买了Sinclair ZX Spectrum。因而,Eben努力完成“让一切人都买得起”的方针的确让我产生了共识。
一台功用强大的个人核算机塞进一块细巧的印刷电路板(PCB)上,切当地说是6 x 3 cm的印刷电路板,到达这种小尺度的新记载着实让我惊叹。经过进一步考虑,我常常想弄清楚是否正是Spectrum的精约及其许多约束促进我深化研讨核算机并毕竟沉醉于这一美妙范畴——软件和硬件之间的鸿沟,咱们今日称之为嵌入式。
小型片上体系
Raspberry Pi Zero规划根据片上体系(SoC)(BCM2835),其间包括一个1 GHz ARM®内核和一个图形处理单元(GPU)、一个视频接口、多个串行接口(USB、UART、SPI和I2C)以及一个外部存储器接口,用于办理运转Linux®操作体系(OS)所需的大容量RAM(512 MB DDR2)和大容量存储卡(SD卡)。关于单芯片器材来说,这些都是令人形象深化的功用,特别是与我年轻时看到的前期个人核算机比较。咱们或许会争论,与现在在各种嵌入式操控运用中常用的最新简略型单片机比较,这并非不成份额。虽然时钟速度和处理才干都要低得多(从10 MHz到100 MHz不等),但今日一切小型单片机自身都是真实的小型片上体系奇观。正如您对单片机期望的那样,一切RAM和闪存都坐落芯片上。存在串行接口(USB、UART、SPI和I2C),但也集成了一切电源调理和电压监控电路。片上一般有五个或更多不同的(精细)振荡器,以便取得更大的灵敏性并操控功耗。此外,还有几个具有大输入/输出多路开关的模仿外设(ADC、DAC、运算扩大器和模仿比较器。。.。。.),替代了Raspberry Pi梦想视频中的功用,一向以来反映出偏心嵌入式超越核算的规划挑选中的显着不同。
事实上,当Raspberry Pi用户需求与实践国际衔接时,关于使常用LED闪耀等最平缓I/O运用以外的运用而言,由更小的单片机(实践上一般为8位单片机)经过“帽子”(小型子板)供给必要的I/O接口和所需电压转化并不意外。
我不想在两个天壤之别的国际之间将这种不公平的比照一向拖下去,但我有必要指出,在支撑开发人员方面,两者有一个一起重视的问题:“操控杂乱性”,毕竟“招引新用户”。毋庸置疑,它们的解决方案相似,但毕竟有所不同。
这两个渠道都是由供给免费软件东西开端,包括集成开发环境(IDE)、编译器、链接器、模仿器、调试器(在专业版中供给,只需少数费用)、或多或少的开放式中间件和(RT-)OS以及一小部分硬件(板)选项。
两个阵营(嵌入式核算和通用核算)之间的差异比您幻想的要小。两者毕竟都依赖于相似的(假如不相同)东西链,这些东西链大部分都根据GNU。在中间件等级,一旦您正确抽取下级(下至金属)驱动程序层,开源选项会再次变得极端相似。操作体系等级的差异最大,由于许多单片机将很乐意运转RTOS,但无法接受完好Linux内核的担负。这反映了真实的职业差异。实时是操作体系“作业阐明”的一部分。
胀大
查看文档时会发现,两者的杂乱度在胀大。我最喜欢的一个比如是根据盛行8位PIC®架构的细巧而简略的单片机。PIC16F1619常常用于操控小家电,为此,它将小容量闪存(16 KB)封装在20引脚微型封装中,具有十几个数字外设接口和简直相同多的模仿支撑模块。其数据手册长达650页,之后还增加了特性数据、表和图2。
此小型SoC上供给的一些外设(例如信号丈量定时器)需求长达50页的篇幅才干恰当记载。这简直是描绘实践PIC内核及其整个指令集所需页数的两倍。
在Raspberry Pi方面,假如仅仅按份额扩大(10倍),则问题相似,由于有多个数据手册需求考虑,每个数据手册只记载片上体系硬件组件的一部分(SoC外设、GPU和内核),内核独自占用超越750页的篇幅。
嵌入式软件架构
很显着,没有人能够阅览或跟上如此巨大的信息量。特别是嵌入式开发人员,他们总是承担着极大的压力,需求在更短的时刻内完结运用,以完成最快的产品上市速度。常见的解决方案是运用分层架构对运用进行分区,并运用规范化外设库来抽取硬件具体信息。这些层能够规整地构成协议栈,其间“运用”坐落硬件笼统层(HAL)的顶部。实践上,能够进一步细化此图片来彻底辨认HAL,HAL上方的中间件层将担任完成比如网络、文件体系和图形UI(假如存在/需求)一类的通用服务/功用。
图1:嵌入式运用的软件协议栈
注:一般经过从HAL别离驱动程序层和电路板支撑层来进一步细化协议栈,但是在以下考虑中,咱们不需求具体到这种程度。
此软件架构直接来源于“核算”范畴,能够很好地对大多数通用事例进行建模。惋惜的是,由于它适用于嵌入式运用,因而有两个根本缺陷:
·只需求点放在顶层中间件层供给的规范功用上,分层架构就能够简化文档篇幅过长的问题。在运用规模的底端,当中间件层(假如存在)十分薄时,成果大多比较含糊。开发人员有必要依赖以大型运用编程接口(API)方法存在的HAL文档,这份资料的篇幅相同较长(可达数千页),但一直未真实研讨器材的任何细节。出现问题时,他/她将身陷困境或被逼深化研讨生疏范畴和很多代码。
·HAL层为支撑规范中间件服务供给了巨大协助,但由于其性质极端严厉,因而毕竟会铲除特定器材的任何共同差异化功用。不然,这些共同功用能够为特定运用供给技术优势,并且或许成为挑选特定器材类型的原因。
·在运用规模的顶端,中间件层十分厚,例如Raspberry Pi,仅Linux OS内核就添加了数百万行代码来应对问题3。虽然能够说这是开源代码,但关于期望自己永久不用深化了解到如此程度的一般开发人员而言,它简直无法带来安慰。
让核算机尽其所能!
毕竟,Raspberry Pi开发人员将能够依托“核算”功用带来的巨大收益和小电路板供给的很多资源。规范Linux操作体系的便利性远不止补偿API的杂乱性和广泛性。
我最关怀的是全新小型SoC的开发人员:现代单片机用户。关于他们而言,运用规范化HAL的优点削减了,由于功用存在丢失,并且堆叠软件架构使共同的功用变得单一。
用于快速开发的新一代软件东西代表了脱节这一难题的奇妙方法。这是最近出现在嵌入式操控商场中的一种新式代码生成器或装备器。虽然最初时持有显着(但一般合理)的置疑情绪,但事实证明,这些东西不只有用,关于任何严厉的嵌入式开发人员也必不可少。
咱们发现的显着特征包括:
-彻底集成在常见的IDE中,这有助于其了解项目上下文:类型(器材编号)挑选和中间件库感知。
-支撑共同和杂乱的外设。例如,从前示例中说到的信号丈量定时器(SMT)能够在单个页面/对话框中直观地出现给用户,其间仅包括少数翻滚列表、复选框和一些直观选项。有关来自Microchip的PIC单片机的旗舰快速开发东西MPLAB®代码装备器(MCC)4的屏幕截图,请拜见图2。
图2——MPLAB代码装备器:信号丈量定时器选项
-使用模板引擎,将装备选项转化为一小部分彻底自定义的函数。这意味着只需经过少数待学习的函数以及共同且直观的命名约好便可生成最小API。函数定制确保大多数硬件笼统是在编译时(实践上在编译前)静态履行的。这有助于削减传递到每个函数所需的参数列表,然后进步功用和代码密度。有关MPLAB代码装备器的典型精约用例,请拜见列表1。
-输出由十分短的(C言语)源文件组成,这些源文件可由用户全面查看(可将其作为一次学习时机),但也会经过专家进一步手动优化。现代化的代码生成器将其代码与用户代码灵敏地混合,既可坚持完好性,也答应充分使用名贵的高档硬件功用。
列表1——由MCC生成、用于装备SMT外设的源文件(smt1.c)部分
从根本上说,代码装备器/生成器可将“核算机”履行的操作做到最好。构建HAL是硬件外设装备重复且简单犯错的阶段,一般会导致在数据手册中花费很多时刻进行庸俗的查找,现在,这一阶段现已然消失或显着缩短,只留下一些愈加兴趣横生、启示思想的探究与发明时刻。
事实上,用户能够从同一个用户界面了解特定的硬件外设功用,从根本上消除(或至少极大削减)对数据手册的需求。
硬件笼统层成为项目的灵敏部分,实践上能够根据需求频频、快速地从头生成,然后优化运用功用。
十(二进制)行代码
处理完(外设)装备后,可将注意力当即会集到运用上,这是规划中更智能的部分(在运用层上),这一部分坐落“主循环”之内,而不是之前。
终究要说的是,凭仗代码生成器,即便在嵌入式范畴中,经典的“Hello World”示例(总是转化为使LED闪耀)也会成为令人耳目一新的两行代码操练!
LED_Toggle();
__delay_ms(500);
列表2——为创立第一个嵌入式“Hello World”而需求输入的短短两行代码 您将能够在我最近出书的书中找到(20个)更多关于相同有用使用快速开发东西的实例:“In 10 Lines of Code”5。
对立杂乱性
在小型单片机开展成为小型SoC或许个人核算机缩小为Raspberry Pi的过程中,不只会浪费时刻和形成认知担负,还会在咱们操作无法彻底了解/把握的体系时引进缝隙。
杂乱性不是技术进步的必然成果。现代化的代码装备器/生成器能够经过扩展咱们的软件开发流程、完成自动化并毕竟康复咱们对快速增长的可用功用/选项数量的把握来协助咱们。