作者:Jacob Beningo /Digi-Key
嵌入式和物联网 (IoT) 开发团队承受着压力,需要尽快完成并交付设计。为了能够快速行动,他们需要使用经过验证且具有强大生态系统的元器件和软件框架。他们还需要研究如何维护系统,以及将来如何扩展,这意味着解决方案还需要具备可移植性,并且在需要时能够跨多种硬件平台工作。
但是,微控制器供应商经常将开发人员束缚在自己的生态系统中,这使得在微控制器之间进行切换不是那么容易。此外,微控制器生态系统的软件工具常常不足,大部分是基于 C 语言,这对开发团队而言也是绊脚石。
考虑到这些需求,本文将介绍 Arm Mbed 平台和操作系统。文中将展示开发人员如何利用 Mbed 生态系统来加速嵌入式产品开发,并使用它来扩展到微控制器供应商生态系统之外的世界。
什么是 Arm Mbed?
Mbed 是由 Arm 主导的面向物联网设备开发人员的在线协作体系1。Mbed 为开发人员提供极为丰富的资源来加速开发,从 Mbed OS、Mbed TLS 一直到 Mbed 库支持的开发板和各种元器件。
Mbed 的初衷是让开发人员能够利用在线社区中 200,000 开发人员以及主要微控制器供应商(例如 Cypress Semiconductor、NXP Semiconductors 和 STMicroelectronics)所支持的大型生态系统,借助现有元器件、开发工具和库来加快开发速度。使用 Mbed 生态系统有许多优势:
- 库和示例均用 C++ 编写,C++ 是一种现代的面向对象语言,其设计使得代码可扩展且可重用。
- 支持利用现有硬件平台快速开发嵌入式产品原型以证明其可行性。
- 使用 Mbed 在线和离线编译器以及 Mbed 命令行界面 (CLI),简化软件测试的开发(测试甚至包括在许多示例和库中)。
- 内置用于开发物联网设备的工具,例如云连接器服务,不仅简化了设备到云的连接,而且简化了通过其他基于云的服务管理设备的工作。
- 低级硬件抽象层 (HAL)
- Mbed OS API,用作中间件,提供存储、RTOS、安全连接、通信堆栈等能力
- 高级物联网层,包括开发人员的应用程序代码、Mbed OS 库和连接客户端

Mbed 从硬件开始
尽管 Mbed 提供了良好的软件基础,但除了软件和开发软件所需的工具之外,还会提供其他功能。团队开发产品的最快方法是在使用软件的同时利用 Mbed 硬件生态系统。硬件生态系统包括三个不同方面:
- 模块
- 开发板
- 元器件


Mbed 元器件是一个硬件元器件,具有 Mbed 支持的库及其相关的中间件,这些库和中间件充当产品开发的构件。例如,从事物联网项目的开发人员可能会决定要使用温度传感器。开发人员可以在 Mbed 元器件中搜索其支持的温度传感器,例如,他们可能会在外设模块中发现 Maxim Integrated 的 MAX31723PMB1,该模块可用于快速开发原型(图 4)。
此类 Mbed 元器件的优点在于,它们几乎总是作为开发板提供并带有原理图。这样,开发人员不仅可以查看使传感器工作所需的硬件配置,还可以使用软件库来启动和运行传感器。



用 Mbed 编写“Hello World” LEDBlinky 应用程序
开发 Mbed 应用程序有多种方法:通过在线编译器;通过离线编译器;或使用命令行界面 (CLI) 工具。根据个人经验,建议使用 CLI,因为它能更好地控制开发过程,并且更易于集成到开发流程中,例如测试工具和连续集成服务器。
CLI 提供了命令行界面功能,因此使用 Windows 的开发人员可以使用命令提示符来编译代码。创建 LEDBlinky 应用程序的第一步是使用 Mbed 随附的预写示例。这可以通过在命令提示符中输入以下命令来完成:
mbed import mbed-os-example-blinky
下载示例需要几分钟时间,因为还会下载 Mbed OS 和应用中可能会使用的其他支持组件。下载完成后,开发人员便可导航到 mbed-os-example-blinky 文件夹,其中有一个 main.cpp 文件。开发人员可以在自己喜欢的编辑器中打开此模块,其中代码大致如下所示:
#include "mbed.h"
#include "platform/mbed_thread.h"
#include "stats_report.h"
DigitalOut led1(LED1);
#define SLEEP_TIME
500 // (msec) #define PRINT_AFTER_N_LOOPS
20 // main() runs in its own thread in the OS int main()
{
SystemReport sys_state( SLEEP_TIME * PRINT_AFTER_N_LOOPS /* Loop delay time in ms */);
int count = 0;
while (true)
{
// Blink LED and wait 0.5 seconds
led1 = !led1;
thread_sleep_for(SLEEP_TIME);
if ((0 == count) || (PRINT_AFTER_N_LOOPS == count))
{
// Following the main thread wait, report on the current system status
sys_state.report_state();
count = 0;
}
++count;
}
}
开发人员可以在此进行修改,但是对于本文而言,使用默认值即可。更值得注意的是编译和部署代码。具体用来编译和部署代码的命令将因硬件而异。下面的例子显示了如何使用一条命令对 Cypress CY8CKIT-062-BLE 开发板进行编译和编程:
mbed compile -m CY8CKIT_062_BLE -t GCC_ARM -f
第一次编译项目可能需要几分钟,因为工具链需要构建所有自动进入 Mbed 应用程序的关联文件。编译周期完成后,结果应类似于下面的图 7 所示。

Mbed 的使用技巧与诀窍
Mbed 入门非常简单,但对于开发人员来说可能存在挑战。以下是关于开始使用 Mbed 开发产品的一些“技巧与诀窍”:
- 避免使用在线编译器。虽然这对于业余爱好者来说很好,但对于专业人士而言,让其他人的服务器拥有源代码可能是个问题。此外,来回云端可能会减慢调试速度。诸如 Mbed IDE 或 Mbed CLI 之类的本地编译器是更好的选择。
- Mbed 支持多线程,但默认情况下,主函数在自己的线程中运行。
- 从 Mbed 示例项目开始,对其进行考察,了解如何更有效地使用 Mbed 应用程序。
- 利用 Mbed 测试工具确保应用开发没有无意间破坏 Mbed 框架中的任何内容。
- 使用 Mbed 硬件站点搜索可以快速集成在一起来开发产品的开发板、元器件和模块。
总结
嵌入式和物联网开发人员需要一个受到良好支持的生态系统来为他们提供现代化的工具、流程和软件,帮助他们加快开发工作并使开发成本最小。如本文所示,Mbed 平台和 OS 是开发人员可以利用的一种潜在选择。
Mbed 提供可扩展且灵活的软件架构,其中包含许多已经集成在一起并经过测试的组件。由于对各种硬件模块、开发板和元器件的强大支持,开发人员可以轻松创建产品原型,然后将其扩展成生产解决方案。
参考资料
- https://www.mbed.com/en/about-mbed/what-mbed/