【问题标题】:Anyone using Python for embedded projects? [closed]有人使用 Python 进行嵌入式项目吗? [关闭]
【发布时间】:2010-09-19 10:51:27
【问题描述】:

我的公司正在将 Python 用于一个相对简单的嵌入式项目。还有其他人在嵌入式平台上使用 Python 吗?总的来说,它对我们来说效果很好,可以快速开发应用程序,快速调试。我喜欢这种语言的整体“简洁”。

我在日常工作中遇到的唯一真正问题是,与常规编译器相比,缺少静态检查可能会导致在运行时引发问题,例如一个简单的意外 cat 字符串和 print 语句中的 int 可能会导致整个应用程序崩溃。

【问题讨论】:

    标签: python embedded


    【解决方案1】:

    近期发展

    • MicroPython 是 Python 3 编程语言的精简快速实现,经过优化可在微控制器上运行。
    • 欧洲航天局 (ESA) 是 funding further development of MicroPython。这样做是为了评估该语言是否适合天基应用,尤其是有效载荷。
    • WiPy 1.0 和 2.0、LoPy 和 SiPy 是由 Pycom 销售的无线 MicroPython 平台。

    【讨论】:

      【解决方案2】:

      Telit 生成包含embedded Python interpreterGSM/GPRS modem modules

      我自己没有尝试过,所以我不知道 Python 解释器与 PC 实现的比较或不同之处,例如其中包括模块、RAM 和 ROM 内存限制、执行速度等。

      但是,正如用户 foresightyj 在评论中指出的那样,他们似乎使用的是 Python 1.5.x,这是一个真正古老的版本,所以我很难认真对待它们。如果没有这么多现代 Python 功能,Python 开发人员不会喜欢降级到如此古老的版本。我会担心这种旧版本的安全问题。

      【讨论】:

      • 这是一种很好的编码方式,但是当您尝试在该平台上执行更多操作时会出现一些性能问题。好的部分是平台并不昂贵,这非常重要。请参阅我的问题:stackoverflow.com/questions/7943919/…
      • 我使用了 Telit 的 GM862-GPS 模块。如果我没记错的话,Python 的版本是 1.5.2。但是,速度并不是那么好。不支持中断、信号或线程,因此您的程序必须具有超级循环。因此,它只适用于小型项目。正如 OP 指出的那样,由于 Python 没有静态类型检查,它可能会由于一些拼写错误或错误类型而崩溃。我所做的是将所有内容都放在一个大尝试中,除了块并打印出串行端口甚至 TCP 套接字的异常,这样我就知道会发生什么。
      【解决方案3】:

      我使用的是 Gatetel GT-HE910 系列模块,它嵌入了 Telit 调制解调器,包括 3G、GPS、AD、IO 和 Python 2.7。这用于远程数据采集应用程序。 Python 在这些模块上的速度非常慢,但我们只需要每 15 分钟更新一次或处于警报状态,这样它们才能正常工作。

      http://www.gatetel.com/#!gt-series/cscb

      【讨论】:

        【解决方案4】:

        根据我的经验,Python 传统上用于桌面环境而不是嵌入式领域。有两个原因,与 Python 被解释有关:

        • C/C++ 语言比 Python 具有更高的性能(这在微控制器速度较慢的嵌入式系统中很重要)
        • C/C++ 语言具有更确定的响应时间(这在实时嵌入式系统控制某些东西中很重要)。

        当然,随着嵌入式系统变得更快和上市时间更短,Python 将在嵌入式领域得到更多采用。

        【讨论】:

          【解决方案5】:

          块引用 我在日常工作中遇到的唯一真正问题是静态检查与常规编译器的最后一次检查可能会导致在运行时引发问题,例如在 print 语句中一个字符串和一个 int 的简单意外 cat 可能会导致整个应用程序崩溃

          对我来说,这是一笔大买卖。您可以在编译时发现并修复问题现在必须在运行时依赖。不知道数据类型并且必须编写额外的函数来检查数据类型是很麻烦的。在 C 中没有必要这样做。你将如何在 python 中声明 'volatile'?

          块引用 嵌入式工作的唯一缺点是有时 python 可能很慢,有时它使用大量内存(相对而言)。这还没有给我们带来节目停止问题,如果出现问题,python 很容易分析速度和内存。

          这也很大。对于嵌入式系统或 RTOS,时间限制非常重要。

          Python 不需要快速编码。这实际上取决于您对哪种语言感到满意。老实说,我需要 1 天的时间来编写函数和不必要的面向对象的东西,而我可以用 C 语言在 2 小时内完成。 测试太不方便了,我必须编写代码,py_compile,在目标中复制pyc然后运行程序,然后python退出抱怨变量未定义或类型转换错误或类似的小东西。

          我的建议是 C 工具链可用于任何目标。 C 语言快速、面向硬件、具有挑战性和乐趣。在嵌入式系统中坚持使用 C。无需安装 configure silly python 包来运行它。

          【讨论】:

            【解决方案6】:

            我一直在研究基于旧的慢速 powerpc 和 16Mb 内存的微波通信设备。

            我已经能够在 VxWorks 上移植 Python 2.6.1 解释器,以便直接从目标 shell 使用命令行解释器,或者执行上传到目标 flash 的 python 脚本。

            我们使用这些脚本对目标执行自动测试或执行诊断程序。 这里有一些关于整个过程的细节:HOW TO: Port Python to VxWorks

            【讨论】:

              【解决方案7】:

              我们在相当多的embedded boards with ARM processors 和 16 MB 的 RAM(运行 linux)中使用 python。

              它工作得非常好,而且很容易快速编写自定义代码——这是 python 的强项之一。

              至于代码的可靠性 - 我们尝试实现 100% 的测试覆盖率。用 python 编写测试非常快,它会给你一种美妙的自信感。我们使用twisted trial 运行测试并报告覆盖率,但还有许多其他工具可用。

              根据我的经验,python + 测试比任何其他替代方案更可靠且编写速度更快。

              嵌入式工作的唯一缺点是有时 python 可能很慢,有时它使用大量内存(相对而言)。这还没有给我们带来节目停止问题,如果出现问题,python 很容易分析速度和内存。

              pychecker 也是一个非常有用的工具,它可以捕获很多常见错误。

              【讨论】:

                【解决方案8】:

                我曾在一家公司工作,该公司在基于 Atmel AVR32 并运行嵌入式 Linux 的嵌入式产品上使用 Python。固件最初是在 PC 上开发的(由于缺少可工作的硬件原型),后来转移到在交叉编译的 Python 解释器上运行的嵌入式硬件。

                在设备上“实时”调试和修改源代码的能力是开发过程中的一大优势,并节省了大量时间。最大的缺点是 Python 解释器的速度和内存使用率。

                在生产固件的第一个版本发布后,我们将代码的关键部分移植到 C/C++。移植工作非常简单,并导致速度关键代码的改进了几个数量级(如您所料)。

                顺便说一句,大部分设计和生产测试代码都是用 Python 编写的,主要在 PC 上的测试工具中运行。

                【讨论】:

                • 请问您如何移植到 C 语言? Ctypes 还是 python 扩展包装器?
                【解决方案9】:

                我的团队编写了一个由 C++ 和 Python 组成的嵌入式软件。我们决定用 C++ 编写基本类和繁重的计算例程。我们用 Python 编写逻辑。将库提升为胶水。使用 boost 绝非易事,但结果非常好。快速且易于修改。使用python表示自定义需求,我们能够实时满足客户的需求,使用注入技术更改代码。真的很令人兴奋! (好吧,我是个极客;)

                我们开始使用 python 进行原型设计,但我们突然意识到它显然太慢了。所以我们决定在不同的计算层中构建程序,以达到速度要求。 C++ 是最好的解决方案。

                为了同时使用 python 和 c++,我们必须严格控制输入。

                【讨论】:

                  【解决方案10】:

                  我一天中唯一真正的问题是 一天的工作是最后的静态 检查与常规编译器可以 引发问题 运行时,例如一只简单的意外猫 打印中的字符串和 int 语句可以带来整体 应用程序关闭。

                  单元测试是您对抗这些事情的唯一安全措施。

                  【讨论】:

                    【解决方案11】:

                    我们在大学里使用 Python 开发基于 Gumstix 硬件平台的嵌入式应用程序。虽然比传统的嵌入式系统功能更强大,但我们发现小尺寸、低(ish)功耗以及在台式机开发和目标硬件之间轻松传输代码的组合非常宝贵。

                    Python 也是一种很好的教学语言,Gumstix 的优点在于他们可以让代码在低功耗系统上运行,而不是使用 NesC 等专用语言带来的头痛和心碎。

                    【讨论】:

                      【解决方案12】:

                      在我以前的雇主,我曾想花一些时间在tinypy 中构建嵌入式系统,这是“64k 代码中 Python 的极简实现”。 (但我从来没有做过,我也没有时间了。)

                      【讨论】:

                        【解决方案13】:

                        确实,当您需要编写某种测试时,Python 经常被用作“支持语言”——即我参与了一个项目,该项目(基于 Python 的)测试框架代码库(是?)几乎一样大作为主打产品。 Python“代理”适用于 QNX、VxWorks - 我们遇到的大多数问题是正确移植我们代码的线程和网络相关部分。

                        可能值得一看 OpenMoko project 很多嵌入式 Python 开发都是在那里完成的。

                        注意事项: - 根据平台/操作系统,对 Python/C 扩展模块的支持可能表现得非常奇怪 - 大多数嵌入式平台都提供了相当过时的 Python 版本 - 最后你会发现“正确的”嵌入式软件之间存在差异,其中每一位都很重要,“现代”嵌入式软件在 >412Mhz XScale CPU 上执行,超过 128MB,然后 Python 就是不匹配您想要定位的硬件:(

                        【讨论】:

                          【解决方案14】:

                          就我个人而言,我开发了一些在BusRadio 使用的设备上运行的软件。这是一个基于 Twisted 和 Python 构建的嵌入式项目的示例。该设备是一个嵌入式XScale 处理器,运行debian-derived 发行版,因此它可能不符合“嵌入式”的某些定义,但它非常小:它适合校车的仪表板。

                          将 Python 与大型库一起使用存在一些有趣的问题 - 解释器可能需要很长时间才能启动并在一个非常慢的芯片上加载 Twisted 的所有代码,而且有些事情需要特殊情况的优化。然而,Python 的动态特性在任何时候都不是问题。有问题的软件当然并不完美,但至少在使用 Twisted 时,一个简单的编程错误不会“导致整个应用程序崩溃”。将记录回溯,并继续处理。

                          因此,如果您处于一个足够不受限制的嵌入式环境中,可以一开始就使用 Python,这与开发“常规”程序(游戏、桌面应用程序、Web 应用程序)没有什么不同。那里不需要静态类型,这里也不需要。

                          【讨论】:

                          • 我会强调在这种情况下使用 Twisted 是多么的充分。
                          【解决方案15】:

                          EVE Online 客户端不是实时、高性能 Python 的展示品吗?

                          【讨论】:

                          • EVE Online使用stackless的另一种python语言实现,与cpython不同,它们没有任何嵌入式应用程序,EVE中的所有宇宙都在一个大集群上。
                          【解决方案16】:

                          我有一个 Python 服务器(使用 Twisted)和一些在 XP Embedded 下运行的帮助脚本,并且运行良好。

                          【讨论】:

                            【解决方案17】:

                            顺便说一句,有关类型推断和静态类型的有趣讨论,请参阅这篇博文:“Type inference for Python”,包括一些 Guido van Rossum 博客文章的链接,这些文章描述了向 Python 添加可选的静态类型。

                            我同意Bruce Eckel 的观点,即练习“强测试”比依赖强类型更好。我认为这同样适用于嵌入式开发。

                            【讨论】:

                              猜你喜欢
                              • 2011-04-11
                              • 2013-01-15
                              • 1970-01-01
                              • 2011-03-14
                              • 1970-01-01
                              • 1970-01-01
                              • 2016-02-14
                              • 2012-01-18
                              • 2010-12-12
                              相关资源
                              最近更新 更多