使用嵌入式代码生成器检查复杂性

raspberry pi 产品线是一款具有无线连接功能的 10 美元个人计算机。对于业余爱好者、制造商、修补匠、黑客,以及,是的,我们中为数不多的真正努力设计“真正的”电子产品的人来说,这是多么美好的时光啊!
尽管 raspberry pi 的“通用计算”区别和微控制器 (mcu) 的“嵌入式”分类存在细微差别,但两者的共同目标是为开发人员“控制复杂性”同时“吸引新手用户”。每种类型的平台都提供免费软件工具,包括集成开发环境 (ide)、编译器、链接器、模拟器、调试器以及或多或少的开放中间件和操作系统 (os)。两者都严重依赖于相似的(如果不相同的话)基于 gnu 的工具链。在中间件级别,一旦较低(直至金属)驱动程序层被抽象,开源选项再次非常相似。
尽管他们的使命是通过降低复杂性来支持开发人员,但是文档膨胀的问题在双方都很明显。一个完美的例子是基于 pic 架构的小型 8 位 mcu,pic16f1619。pic16f1619 mcu 用于控制小型电器,为此,它在 20 引脚封装中仅包含 16 kb 闪存、12 个数字外设接口和大约同样多的模拟支持模块,但其数据表跨越 650 页(在添加之前表征数据、图表和图形)。pic16f1619 上提供的外设(例如信号测量定时器 (smt))需要多达 50 页,这几乎是描述实际 pic 内核及其整个指令集所需的页数的两倍。
raspberry pi 方面的问题类似,只是按比例放大(高达 10 倍)。这里有几个数据表需要考虑,每个数据表只记录片上系统 (soc) 的一个组件,例如外围设备、gpu 等。仅内核就占据了 750 多页。
不能指望没有人会阅读或简单地跟上如此大量的信息。特别是嵌入式开发人员总是承受着巨大的压力,要在更短的时间内交付应用程序以实现最快的上市时间。
迷失在嵌入式软件架构的层层中
解决信息泛滥的一种常见解决方案是使用分层架构和抽象硬件细节的标准化外围库对应用程序进行分区。这些层可以表示为一个整齐的堆栈,“应用程序”位于硬件抽象层 (hal) 的顶部。如果需要,可以进一步细化堆栈以识别 hal 和其上的中间件层,以实现常见的服务/功能,例如网络、文件系统和图形用户界面 (gui)。
该软件架构模型源自“计算”世界,适用于大多数通用情况。不幸的是,它在嵌入式应用程序中存在两个基本缺点:
1. 分层架构简化了文档膨胀问题,只要关注中间件层提供的标准功能即可。在应用范围的低端,中间件层非常薄,如果存在的话,结果主要是混淆。因此,开发人员必须依靠大型应用程序编程接口 (api) 形式的 hal 文档,这是一个同样庞大的材料体,可以跨越数千页,而不会真正揭示设备的细节。当出现问题时,开发人员会陷入困境或被迫深入研究大量外来代码。
2. hal 层为标准中间件服务提供了巨大的支持,但由于其刚性性质,通常最终会抹去特定设备的独特差异化功能。否则,这些功能可以为特定应用程序提供技术优势,并且可能是首先选择特定设备的原因。
代码生成器:让机器做它最擅长的事情!
由于堆叠的软件架构会导致性能损失和独特功能的扁平化,现代 mcu 开发人员在使用标准化 hal 时获得的收益会减少。然而,强调快速开发的嵌入式控制市场的新一代代码生成器为解决这个难题提供了一条出路。
代码配置器/生成器做机器最擅长的事情,显着缩短或消除重复和容易出错的搜索数据表以配置硬件外围设备和构建 hal 的过程。用户还可以从单个代码配置器界面了解特定的硬件外围功能,从而完全减少对数据表的需求。因此,hal 成为嵌入式开发项目的灵活组成部分,可以在工程师优化应用程序性能时快速且频繁地重新生成。
代码配置器工具的显着特点包括:
· 与流行的 ide 完全集成,允许工具(和用户)了解项目上下文(涉及的型号/部件号、使用中的中间件库等)
· 支持独特而复杂的外围设备,例如前面提到的 smt。例如,smt 可以在一个页面/对话框中直观地呈现给用户,其中包括一些直观的滚动列表和复选框(图 2)。
· 一个模板引擎,将用户配置转换为一小组完全定制的函数,减少必须传递给每个函数的参数数量,并保证大多数硬件抽象在编译时静态执行。生成的 api 是最小的,需要学习的功能很少,并利用一致和直观的命名约定。这提高了性能和代码密度(代码示例 1)。
· 由非常短的(c 语言)源文件组成的输出,用户可以完全检查,提供学习和手动优化的机会。现代代码配置器以灵活的方式将生成的代码与用户代码混合在一起,从而保持完整性并允许充分利用高级硬件功能。
【图2 | 此处显示的是 microchip technology, inc. 的 mplab 代码配置器 (mcc) 中的信号测量定时器 (smt) 选项的屏幕截图。
[代码示例 1 | smt 外围源文件 (smt1.c) 的此示例部分显示了 mcc 生成的代码的节俭性。]
一旦外围配置完成,开发人员可以立即专注于应用程序。使用代码生成器,嵌入经典的“hello, world!” 示例(总是转换为闪烁的 led)变成了两行代码练习。
[代码示例 2 | 创建“hello, world!”只需要两行代码。使用 mcc 的应用程序。]
在《in 10 lines of code》一书中可以找到其他 20 个有效使用快速开发工具的实际示例。


宁德时代同意向印尼镍矿和电动汽车电池制造业投资4.2亿美元
内折叠三星Galaxy Fold 曝光,展开后折痕明显
电子芯闻早报:三星14nm威武,机器人可定制
7805稳压器电路图
智能电子拉力试验机的应用领域有哪些?
使用嵌入式代码生成器检查复杂性
Nullmax打造一套强大的平台化BEV-AI整体技术架构
白光LED和其他光源的比较
Firefly-RK3288PWM输出介绍
Oppo和Vivo盈利困难 印度手机零售商合作数量减少
电子设备故障库的故障实现方案提高故障诊断能力和维修效率
热保护开关结构_热保护开关的工作原理
慧荣科技发布全球首款支持最新SD 8.0规范的SD Express 控制器解决方案
看3D鼠标如何实现3D
星恒电源深耕两轮电动车市场,“技术领先”助力锂电化普及
5G大数据时代,新的财富巨浪即将呼啸袭来
邬贺铨称物联网不是网络是应用
F-35C战斗攻击机已正式进入美国海军陆战队作战部队
三星Galaxy Buds+新增了Jennie Red和全新粉红配色售价为150美元
赑屃论币:3.28行情回顾