在微控制器上运行“桌面”软件


Embox参加了TechTrain IT节。 像第一次一样,我们带来了铁屑,并现场展示了我们的成就。 我们已经在哈布雷(Habré)上写过一些文章,但您永远不知道是谁:)。 显示了全部基于STM32F7-Discovery的VoIP电话QtOpenCV 。 除了展位,我们还做了三份报告。 我已经描述了关于哈伯开放项目的第一个想法 在本文中,我想告诉我们另一份报告的想法,该报告称为“启动”台式机“微控制器上的软件” 。 好吧,借此机会,我将向您简单介绍一下我对音乐节的感受。

技术培训


首先,让我告诉您有关节日本身的一些信息。 任何不感兴趣的人都可以立即退回到“启动”台式机“微控制器上的软件”部分

在节日上引起我注意的第一件事是很多人。 我们已经厌倦了站在展台上,说话,进行任务和交流。 另一方面,它非常有趣和有趣,最重要的是,我们得到了很多积极的情绪,例如,一些人告诉我们,我们在中心拥有一个不错的博客:)。 节日的参与者来自各个活动领域,甚至都不来自IT,因为节日的口号是“对开发人员,工程师和同情者来说是一个伟大的节日”。 有很多孩子,节日结束时有一个男孩从展台上拖了一个机器人机器玩。 男孩和机器人都没有受伤。

为了使听众的广度更容易理解,我将以不同的方式进行说明。 在节日上进行了很多活动,其中之一是一项探索。 任务的参与者必须走到看台,完成发明的任务并得到打印。 为此,有人甚至拥有了整个直升机。 但是,现在还不行。 我们也是您可以获得印章的地方之一。 我们已经准备了任务,包括问题。 有关开源软件和嵌入式系统的问题很简单。 但是这支队伍是如此的不同,以至于有些人对问题的简单性感到不满,而另一些人则陷入了麻木。 我们自然而然地帮助或告知了Google(或建议google)类似的事情:“谁是C语言的创造者”,“ Linus Torvalds的著名之处”,“微处理器和微控制器之间的区别是什么”或“什么是交叉编译器”。 结果,没有人不打印。 顺便说一句,这有点奇怪,但是可疑的是,许多人容易理解“ GNU-GNU不是Unix”。 可能是为斯托曼准备的。 :)

第二个从第一个开始。 那里有很多娱乐场所。 例如,哈伯带来了一个沙箱。 没错,这不是一个可以邀请您发表文章的本地沙盒,但是可以声名fa起。 关于沙盒中的邀请,我没有想到要问,也许他们像在真正的沙盒中那样给予。 有一个旧计算机俱乐部,您可以在它们上面玩,许多计算机都可以。 有苏联老虎机博物馆的老虎机 。 Sberbank提供了一个休闲区,已经可以在游戏台中进行游戏了。 有传统的yes IT踢腿者和许多其他娱乐方式。 不幸的是,我们不得不工作,所以我只是在谈论我们展位上可见的东西。

第三,也许是主要的事情是,组织者设法收集了从Web开发,分布式系统到嵌入式的几乎所有领域的代表。 从开发人员和其他技术人员,到对它感兴趣的人力资源,例如,游戏玩家(毕竟,有可能侵入Romero本人)或DIY爱好者。 来自COMAQA的 QA和来自Burning Lead的团队领导。 有不同城市的社区(罗斯托夫,特维尔,克拉斯诺达尔)。 结果,报告和展位的主题非常不同。 例如,我们的展位位于团队领导者Burning Lead社区与圣彼得堡IT总监俱乐部的展位之间。

结果,背景迥异的人们来到了我们的展位,有Web开发人员和dotnet脸颊,有JS和pluses。 有人回想起他还在大学时正在AVR上做某事,有人说他在玩RaPi或Arduino。 有很多DotNet小鸡,很多人想知道我们是否有.NET Micro Framework 。 我们甚至辛苦地考虑不要将他拖到我们身边。 预计会有很多关于Rust的问题。 简而言之,我认为,组织者设法很好地实现了“发现其他人的生活!”这一节日的想法。 毕竟,就像在任何节日中一样,这里的主要目的是与他人见面并展现自己:)。

是的,这里没有照片。 在我们小组中可以查看 一些照片 ,包括一个活着的男孩Volodya。 好吧,当然,在Techtrain小组中 ,他们承诺将发布更多高质量的照片。

在微控制器上启动桌面软件


我的报告是对我们启动桌面软件( QtOpenCVpjsip )的一些工作的总结。 该报告是针对普通大众的。 为了方便起见,我将尝试减少许多细节,对于必要的事情,我将提供链接或关键字进行搜索。

首先,我将给出一个议程。 实际上,将分为3部分。 首先,我将解释将桌面软件转移到微控制器的困难,并一路解释微控制器和微处理器之间的区别。 我还将回答一个关键问题, 例如,山羊巴彦 ,为什么要在微控制器上运行桌面软件,最后我将告诉您我们如何设法大大降低了将同一桌面软件转移到微控制器的成本。

微控制器和微处理器有什么区别


因此,关于这个任务的问题之一听起来很像,也许在此影响下,有一篇文章出现在“典型程序员”上,讲述了它们之间的区别。 我同意本文中的所有内容,但我们将尝试用自己的话解释它,并提出其他几种口音。

什么是微控制器单元(MCU)? 如果您查看Wikipedia ,您将了解微控制器是一个片上系统,即处理器和外围设备位于一个芯片上。

术语片上系统(SoC)比微控制器更广泛。 这样的电子电路集成到单个芯片中,该芯片包含微处理器(CPU)和外围设备。 在任何移动电话中,都有一个芯片,其中除了几个处理器内核之外,还存在许多外围设备。 现在,甚至x86处理器都包括网桥甚至gpu。 但我不想将重点放在清晰的分类上,而应放在功能上。 每个人都知道芯片上的系统:
  • 少消耗
  • 更便宜
  • 生产力较低

并非所有人都知道通过减少触点数量来提高可靠性,并且温度范围可能更大。

微控制器具有更高的集成度,还包括存储器(RAM和ROM),也称为外围设备。 因此,可以保持特性,消耗更少,成本更少,生产效率更低,甚至更可靠。

我想更详细地讨论“生产力甚至更低”。 事实是,一方面,这是事实,采用任何现代通用CPU或SoC,并在所谓的DMIPS中看到明显更高的性能。 但是,如果您考虑为什么会有这样的表现呢? 举例来说,我将介绍Quake和Doom游戏(该游戏的创建者是音乐节上的John Romero),它们在Pentium MMX上表现出色。 但是基于该CPU的系统的性能已经被高端微控制器所阻碍。 我的意思是STM32F7甚至STM32H7 。 也就是说,基于这些MCU,很有可能运行Doom和Quake级别的应用程序,您认为这完全不错。

让我们谈谈MCU的另一个功能-内部存储器。 正如我所说,她直接位于芯片上,因此速度非常快。 但是她当然是不够的。 但是多少呢? STM32F769微控制器包含2 mb闪存(ROM)和512 + 16 + 4 kB SRAM(RAM)。 另外,例如, STM32F769i-disco板还具有外部存储器(128 Mbit SDRAM和512 Mbit Quad-SPI Flash存储器),可直接对其寻址。 我什至没有在谈论连接SD卡或USB的能力。 好吧,如果您回想起著名的短语“每个人都应该有640 kb的容量”,那么就会出现一个合理的问题-为什么现代台式机软件如此繁琐? 例如,处于闲置模式的Windows 10中的计算器消耗多达16 MB的内存。

让我们继续进行MCU的下一个功能,即ROM。 实际上,具有CPU的系统也包含ROM;从它开始执行,然后启动BIOS,但是其余软件被加载到RAM中并从中执行。 在嵌入式系统中,习惯上直接执行代码(即所谓的eXecute-In-Place(XIP)),顺便说一句,Linux也支持此模式,但主要的事情是将所有内容加载到主内存中,然后再执行它。 直接从ROM执行的能力很重要,原因有两个:第一个是哈佛体系结构,命令总线和数据总线的分离使您可以提高程序执行的速度; 第二个-自然,浪费的内存更少,因为至少不需要将代码段复制到其他任何地方。

MCU的另一个关键功能是缺少诸如MMU之类的模块,也就是说,微控制器不支持虚拟内存管理的硬件。 在MCU中,即使不是所有人都具有MPU ,并且代码在相同的地址空间中运行,因此很难组织完整的fork() 。 但是fork()本身,正如我们在文章“ fork()vs. “ vfork()”是一个相当繁重的系统调用,根据其功能,在许多情况下,可以将其替换为vfork()或posix_spawn()。

总结一下,微控制器与微处理器有何不同,我们可以这样说:
在硬件方面:
  • 微控制器具有所有必需的外设,包括存储器
  • 微控制器的内存明显减少
  • 微控制器没有硬件MMU
  • 微控制器的时钟速度较低,并且可能具有不同的处理器架构(礼物架构)


就消费者财产而言:
  • 微控制器消耗更少的能量,可以依靠电池工作
  • 微控制器更便宜
  • 微控制器更可靠
  • 微控制器生产率较低


为什么要在微控制器上运行桌面软件


因此,MCU的生产率较低,并且最初用于控制任务。 那么,为什么要在其上运行为另一类系统设计的软件呢? 好吧,即使它们的功能已经足以执行此类任务,但是对于微控制器,这些任务也可以用传统方式解决。 也就是说,要使用各种小型RTOS或从头开始编写代码,即所谓的裸机。 有一个明显的答案,最初的管理任务非常简单,现在对功能的需求正在迅速增长。 即使他们希望通过互联网控制某些破旧的灯泡,但我并不是在谈论水壶,他们可能会很快根据主人的心情选择茶的成分,并将适量的水加热到最佳温度以改善环境状况。 :)

因此,不断尝试使用微控制器中已经开发的软件就不足为奇了。 例如,在小型平台上运行Linux的最早且广为人知的尝试之一是ucLinux,现在主要是Linux的NOMMU模式。 这个想法是在没有MMU的硬件平台上运行Linux,但是我们发现这是CPU和MCU之间的关键区别之一。

简要地说,使用现成的软件的优势:
  • 降低开发成本
  • 缩短上市时间
  • 减少代码中的错误。 现成的软件更加可靠。


我们如何在Embox上做到这一点


在这里,您可以进行很长一段时间的交谈,但是我将再次尝试以一种容易理解的方式在论文中概述要点。

第一个。 Embox使用Mybuild构建系统及其自身的语言来描述模块和系统,我们在“ Mybuild-模块化应用程序的构建系统”一文中对此进行了介绍。 该构建系统使您可以不包含任何多余的图像,或者仅包含所需的内容。 您可以真正微调系统特性,例如,要在STM32F7上运行PJSIP,只需在系统的配置文件中写一行,就可以将以太网数据包的数量限制为16个。
include embox.net.skbuff(amount_skb=16) 

Mybuild分析依赖关系并生成各种工件,包括头文件,链接程序脚本和Makefile。 所有这些都可以大大减少所需的内存量,并且不包括根本不使用的那些部分。

第二个。 显然,Embox必须支持POSIX并且受支持。 此外,我们已经实现了自己的标准库,因为还必须根据系统的配置对其进行重建。

第三。 静态链接。 为了避免单个地址空间出现问题,减小图像大小并仅包含必需的部分,我们使用静态链接。 在不同的阶段,将组装系统的不同部分,但最终所有内容(内核,所有子系统,库和应用程序)都链接到一个映像中。 它具有有关图像中所有字符的所有信息。 并且尽管乍一看我们有许多带有标准int main(..)入口点的应用程序,但是在生成的图像中,这些将是不同的字符,这些字符将从命令行在系统上可用。

第四。 由于许多流行的应用程序和库都具有优势,因此我们必须为C ++实现一个运行时。

第五。 我们增加了使用构建系统的功能
  ./configure; make; make install 

从某处下载源代码并应用必要的补丁程序之后。

结论


如今,对以前在微控制器上进行的系统的功能要求已大大提高。 控制系统有望与通用系统兼容。 微控制器的特性也显着提高,这使您可以在微控制器上运行具有相应功能的软件。 从历史上看,用于优化目的的微控制器软件是为特定任务编写的,但是随着功能需求的增加,有必要采用通用系统领域的方法来极大地提高软件的可靠性,即模块的复用,分布式开发。 通用软件虽然没有考虑嵌入式系统的功能,但具有明显更大的功能和良好的功能。 因此,在微控制器上使用桌面软件会有所帮助。 的确,一方面,您可以使用更便宜,更可靠,消耗更少的硬件平台,另一方面,可以大大降低开发此类系统的成本。

Source: https://habr.com/ru/post/zh-CN466379/


All Articles