查看: 1087|回复: 0

Q. 真想把C语言拉下神坛? A. 不管黑猫白猫....

[复制链接]
  • TA的每日心情
    开心
    2024-3-26 15:16
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3300

    主题

    6547

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32034
    最后登录
    2024-4-26
    发表于 2021-4-1 13:14:32 | 显示全部楼层 |阅读模式
    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做实验就像说走就走的旅行,连存盘都不需要,效果立竿见影。

    正所谓:
    C语言是让CPU岁月静好,
    程序员负重前行。
    Python是让程序员岁月静好,
    CPU负重前行。

    真正实现大马拉大车,作为OpenMV的后续项目,我们的OpenART AI教育套件,正在践行这样的理念。

    实用为王
    综上所述,随着半导体技术的进步,MCU的性能不断提高,功能越来越多越强,应用的范围也在不断地扩大。
    需求的扩大,需要多种多样的开发环境和开发手段,甚至是综合的开发模式,在这样一种趋势下,Micropython应运而生,为我们提供了一种全新的开发平台,并大大拓展了MCU应用的开发人员组成,让更多其它专业的人员,参与到MCU应用的开发中来。
    最后,我以这句名言结束本文:不管黑猫白猫,抓住老鼠就是好猫。

    文章出处: 恩智浦MCU加油站

    签到签到
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-27 22:50 , Processed in 0.103736 second(s), 18 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表