在微控制器上(更具体地说,在使用 ATmega 328P 微控制器的 Arduino Uno 板上)我通常会使用无限循环来检查输入等(在 Arduino 领域,这通常是 loop() 函数)。但是,如果我将此功能留空,则不会引起任何问题。
经典的编程模式,有一个主循环......
在具有 Intel i7 CPU 等的台式机/笔记本电脑上,如果我运行类似的无限循环(无事可做或几乎无事可做),它会将 CPU 固定在 ~100% 并且通常会启动风扇等(延迟可能例如添加以防止这种情况)。
…我们可能正在编写不同的主循环。
同样的主循环在微控制器上也是不好的做法,因为这也会在满负载下运行 CPU ——这会消耗电力。不要那样做,尤其是在你使用电池的情况下。
现代 CPU 内核具有同步机制。这允许人们实现类似“让这个循环的执行休眠直到 1 毫秒过去,或者直到这个条件改变”之类的东西。
这基本上是任何多任务操作系统的核心——基本上所有配得上这个名字的操作系统现在都是。在微控制器上,您经常会发现所谓的 RTOS(实时操作系统),它可以保证您在多少纳秒后开始执行某项操作,因为这是典型的用例微控制器,而在台式机和服务器 CPU 上,您通常会发现成熟的同时多处理操作系统,它们对时间的保证较少,但提供了更大的功能集以及硬件和软件环境抽象。
我对 Arduino 执行环境的了解还不够好,无法对其做出合格的陈述,我正在研究这一点,因为我写道:Arduino 似乎不是为此而设计的——它真的希望你只是忙着旋转。由于它没有“yield”功能,因此当您使用内置函数loop
时,无法调用它在调用之间所做的“家务管理” 。delay
啊! 糟糕的设计。
你会在功耗和/或延迟感知设计中做什么,你会为你的微控制器使用 RTOS——FreeRTOS 非常流行,对于 ARM Cortex-M 系列,mbed 有很大的吸引力,我个人喜欢 ChibiOS (但我认为从 Arduino 草图切换时这不是一个好的选择),Linux 基金会正在推动 Zephyr(我对此很矛盾);确实,有很多选择,您的微控制器制造商通常通过他们的 IDE 支持一个或多个。
为什么这在微控制器上看起来不错,但在微处理器上通常不需要?
这不是真的,这是一种不寻常的设计模式,事实上,对于微控制器来说,它通常会定期做事或对外部刺激做出反应。您通常不希望在微控制器上连续“使用尽可能多的 CPU”。
这种模式也有例外,它们既存在于 MCU 中,也存在于服务器/桌面处理器世界中;当您知道您实际上总是有例如网络数据要在交换机设备中处理,或者当您知道您的游戏总是可以预先计算一些您可能需要或可能不需要的世界时,那么您会发现这些自旋循环。在某些硬件驱动程序中,您会发现“自旋锁”,这意味着 CPU 会不断查询一个值,直到它发生变化(例如,硬件已完成设置并且现在可以使用),但它通常只是一种紧急解决方案,并且例如,在尝试将此类代码导入 Linux 时,您必须解释为什么要这样做。
我认为 ATmega 实际上以 100% 的速度运行,并且因为它的功率如此之低,它不会引起任何明显的热问题,我是否正确?
是的。按照现代标准,ATMega 并不是低功耗的,但它的低功耗足以让热量不会成为问题。