Q. 真想把C语言拉下神坛? A. 不管黑猫白猫....
写在前面:本文提出的观点,同样适合所有其它语言,例如Java, JavaScript等。
前文回顾 两周前,我写了一篇文章“还在用C语言玩MCU吗,要不要换个姿势?”,在文章里分析了IoT应用开发重心的变化所带来的各种挑战,尤其需要更高效的开发环境,来解决开放应用方案、复杂软件逻辑、应用场景多变及业务模式快速迭代等问题。在文章的后半段提出了一种思路,利用现在MCU强大的计算性能,引入更适合高级算法描述的Micropython(MCU版本的Python),高效率地实现系统设计和概念验证。
文章发出后,受到了大量的关注,也有不少人提出了一些疑问。一种疑问是,本来挺强大的一个MCU,这么一搞计算性能大打折扣,我想搞个例如电机驱动的算法岂不是很困难了吗。另一种疑问是,这么强大一个MCU,你只不过让它做一些简单的工作,不是很大的浪费吗。 这两种疑问其实就是一个,是大马拉小车,还是小马拉大车的问题。
继续讨论之前,先发布一个好消息:前篇文章介绍的在LPC55S69上的Micropython环境试用版代码和文档,已经上载到恩智浦MCU的中文社区,大家可以点此下载把玩,并给予反馈。
小马拉大车 先来说说小马拉大车,例如上述电机驱动的问题。这里说的电机驱动,主要是无刷无传感器直流电机,带FOC矢量控制的电机驱动,而不是简单的有刷电机。 不错,Python本身就不适合这种需要高速响应,高性能计算的场景。对于这种需要高实时快速响应,且需要脉冲式的快速计算场合,还是需要C甚至是汇编这种非常接近CPU的编程语言做支撑,尽可能减少与真正计算无关的操作。 而Python,大家都知道这是一种解释执行、面向对象(Object Oriented)的脚本语言,脚本的语法语义解析翻译、对象实体的映射和解构都需要耗费不少CPU计算时间,显然用这样的方式去实现高性能的算术计算任务,去直接驱动高实时要求的电路,需要更高性能的系统才能满足要求,所以从这个意义上讲,简直就是小马拉大车。
解决这个问题的正确思路应该是,用适合高效算术运算的语言,例如C甚至汇编语言,来实现高性能的计算任务,用最接近CPU的代码,实现引脚信号的直接操作和高速中断响应,然后把这些任务和操作用Python的类和方法(Method)封装起来,把电机控制作为整个系统的一个子任务,再按照整个应用方案的逻辑,适时地调用那些封装好的操作对象。 直流无刷电机的驱动、GUI显示类的整合、图形图像的处理、神经网络的计算、数据库的存取检索、网络协议栈等,都可以通过这种封装的形式,以Python作为调用手段,让更多的MCU用户受益。真正实现大马拉大车。
大马拉小车 再来谈谈大马拉小车的问题,这个问题的一个典型观点就是,现在Micropython所展现出来的这些类和方法(Method),参见docs.micropython.org,都是一些MCU常用的驱动和外设,例如SPI、I2C、UART,甚至非常简单的LED、按键、GPIO等。这些设备和所能做的事情,往往更简单的MCU就可以完成,现在却用这个高档的MCU去做这些事情,不是大材小用吗。
如果站在一个专业的MCU开发者,或者专业的终端电子产品生产商来说,Micropython所生成的目标代码,与用C语言开发的代码相比,确实臃肿了一些,而且还因此提高了对内存和CPU性能的要求,不利于成本的控制。从这个角度看,这种方法确实还不实用。 但是还要看到另外两个大的方向,其中之一大方向我已经在上一篇文章里讨论了,即以高效率应用逻辑开发的环境,高效率地实现终端产品的系统设计和概念验证,在此基础上再以高能效比的开发手段,完成相应产品设计的优化和固化。
另一大方向则是在现实世界中存在大量的中小众,或大批需要精细定制化的应用场景;例如各种各样的3D打印机、形形色色的服务机器人、外勤人员使用的各种维修诊断设备、农业自动化等不胜枚举。 这些需求,每种应用的总量可能只有年均几百套、上千套而已。这样的用量,一般专业的MCU开发企业不太容易做,主要的问题有但不限于以下这些: - 出货量不足以支撑投入大量的人手
- 传统的MCU开发者不熟悉或不擅长与机械、工艺相关的开发
- 方案需要对目标应用场景和应用逻辑非常的了解
由于这些特点,需要一些非专业的MCU开发人员来进行开发,或亲自参与进来进行调试和优化,这时Python这种更接近人类语言的编程方式,可以让更多人参与进来。 更重要的是,这种需求的另一大特点是,首要必须考虑的应该是,如何实现既定的目标逻辑,尽快地应用到现实工作中发挥效益;而且由于用量少,它对成本控制要求并不是很高。 综合起来看,用大马拉小车的方式,恰好可以满足这种少量的、精细定制化的需求。 现实中,树莓派开发板被直接嵌入到销售的终端产品,正是这种模式典型的成功案例。
同事的精彩评语 在我们内部交流本文思路时,我们的宋大师结合他们的现实项目,给出了如下的观点: 最近我们移植的OpenMV项目就是一个模范。它自带了Micropython的绑定,而它里面的算法却是高度优化的,可以使用脚本来轻松地各种把玩各种试错。 而在OpenMV移除了Micropython绑定后,也是一个可以在C语言环境下使用的高性能库。 用C语言做实验有点像皇帝出行兴师动众。又是编译、又是链接、又是烧写。 而使用Micropython做实验就像说走就走的旅行,连存盘都不需要,效果立竿见影。
正所谓: 真正实现大马拉大车,作为OpenMV的后续项目,我们的OpenART AI教育套件,正在践行这样的理念。
实用为王 综上所述,随着半导体技术的进步,MCU的性能不断提高,功能越来越多越强,应用的范围也在不断地扩大。 需求的扩大,需要多种多样的开发环境和开发手段,甚至是综合的开发模式,在这样一种趋势下,Micropython应运而生,为我们提供了一种全新的开发平台,并大大拓展了MCU应用的开发人员组成,让更多其它专业的人员,参与到MCU应用的开发中来。 最后,我以这句名言结束本文:不管黑猫白猫,抓住老鼠就是好猫。
文章出处: 恩智浦MCU加油站
|