《 嵌入式系统设计与实践》一一3.1 硬件/软件集成

3.1 硬件/软件集成
项目源于一个点子或者一个需要被实现的需求。在基于产品特征、成本和上市时间对产品进行了高层设计后,通常会制定一个日程计划,展示主要的里程碑和开发活动(如图3-1)所示。
《 嵌入式系统设计与实践》一一3.1 硬件/软件集成

图3-1:理想情况下的项目日程计划
3.1.1 理想的项目流程
硬件团队浏览数据表和参考设计并选择器件,在理想的情况下咨询嵌入式软件团队。通常,针对那些风险最大的零部件购买相应的开发套件,通常就是处理器和了解较少的外设(更多的是处理器,外设比较少)。
硬件团队设计原理图,软件团队在开发套件上开始工作。硬件团队可能会花费好几个星期(或几个月)去完成原理图,其中绝大部分时间花在充分发掘数据表,从中找到适合产品需要的元器件,并且这些器件还要价格合适,物理尺寸符合要求,有很好的温度范围等。与此同时,嵌入式软件团队构建包括编译器和调试器在内的工具链,建立调试子系统,在一些外设上做些测试,如果可能,还建立算法测试的沙盒(如图3-1所示)。
通常使用原理图设计程序(也称为CAD包)完成原理图的建立。这些程序的许可费一般都很昂贵,同时也难以使用,因此硬件工程师会在适当的检查点上生成PDF格式的原理图以做设计评审或者其他用途。虽然应该花时间去评审整个原理图(在3.4节介绍),但处理器以及其对整个系统的影响却是影响最大的一个部分。因为硬件工程师理解这点,所以绝大部分人都生成一个输入/输出映射表来描述处理器每个引脚的连接情况(第4章建议,建立输入/输出映射表并建立一个头文件)。
在原理图设计完成之后(开发套件证明处理器和风险性外设基本没有问题),就可以开始布板了。在布板时,原理图上的连接就变成电路板上的物理轨迹,这些物理轨迹将原理图中的各个元器件连接起来。
注意: 与一般的电气工程不一样,布板通常需要特殊的技能,因此如果这项工作不是由电气工程师来完成,那么一点儿也不要感到惊奇。
布板完成之后,电路板就开始进入装配阶段,在这个阶段制造出印刷电路板(PCB)。一个电路板和一组没有组装的松散零部件称为套件。由于元器件的交货期比较长,所以建立完整的套件就有些困难,这导致了组装会被延迟。一个组装完成的电路板称为印刷电路板装配(PCBA或PCA),通常会在桌上或者实验室里见到。
在原理图设计完成开始布板的时候,嵌入式软件团队的首要任务就是定义硬件测试,并在电路板制作的过程中写完测试代码。算法部分更有趣,给系统制作一个外壳看起来也更有创造性。但是,除非完成对所有硬件的调试,否则即使拿到装配完成的电路板,也不可能在软件上取得任何进展。硬件测试不仅能使调试过程更加顺利,而且也有利于建立一个更加可靠的开发(和生产)环境。在进行硬件测试时,问问电气工程师哪些部分是风险最大的。对这些子系统的测试开发按优先级排序(并在开发套件上做一些实验)。
当拿到电路板时,硬件工程师会给电路板上电以验证没有电源问题,可能也同时验证其他纯硬件子系统。之后(最终),你有了这个电路板就可以开始调试了。
3.1.2 电路板调试
这也许是一段有趣的时光,因为可以从拥有不同技能的工程师身上学习;这也可能是一段令人抓狂的时光,因为团队成员之间相互指责对方无能。怎么说都不为过。
拿到手的电路板可能到处是缺陷,也可能不是这样。电气工程师没有机会编译代码、试运行、修改、再编译。制作电路板的过程不会有太多机会去反复。记住,人都会犯错误,越是不经意的错误,越有可能需要花费相当长的时间去查找和修复。(你曾经用于调试一个由于拼写错误而导致的缺陷的最长时间是多少?)
不要害怕问问题,或者寻求帮助找到问题(这样说也许更好)。电气工程师坐在旁边一起参与调试并找出问题所在,这也许正是我们所期望的。
在设计的早期阶段找到一个硬件(或者软件)问题就像获得了一份礼物。知道这些设计缺陷的人越少越好。但是,产品团队的缺陷总数依赖于我们,因此要乐于付出时间和编程技能去解决某个问题。这不仅仅只是出于礼貌和专业要求,这也是成为一个团队成员的必要部分。如果有一些地理位置或者组织上的分割,使得为了获得硬件工程师的帮助需要跳过很多层次,那么不妨考虑后备沟通渠道(在午饭的时候搞定)。短期看,这样做可能不是很光彩,但我们会因为能解决问题而成为英雄;因此,从长期看,前景光明。
注意: 当有人指出问题时,不要感到尴尬,而要充满感激。如果这个人在团队或者公司中,那么这个缺陷就不会出现在客户现场而被客户发现。
为了让整个调试过程对自己和硬件工程师来说都容易点儿,首先,要确保每个器件都可测试。如果没有足够的代码空间,那么就要为硬件测试代码新建一个工程(尽可能重用底层的模块)。
其次,在拿到PCBA时,用最少的步骤从最底层的部件开始测试。例如,不要试着去运行很酷的电机控制软件,而应该试着将某个输入/输出设备运行一小段时间,挂上一个LED,并确保它能正常闪烁。然后(依然保持每次一小步)通过最少的必要步骤让电机运动起来(或者至少能动作)。
最后,让工具不需要依赖特定的人就能运行,这样别人就可以利用这些工具重现问题。一旦某个问题是可重现的,即使对原因不很确定,也可以试着修复它(有时候,修复过程可以找到原因)。花些时间去写良好的测试代码总会带来回报。这是一个很好的机会让硬件验证代码持续运行一段时间,在拿到下一批电路板的时候可能还需要这些测试代码。而且,这些测试往往是生产测试的一部分,在生产过程中用来检查电路板的功能。
怎么知道需要写哪些测试呢?这个需要从对处理器和外设的深入了解开始。这就是3.2节所要讨论的主题。