Mbed——我心中完美物联网OS

本文最后更新于:2020年9月16日 上午

我是怎么知道Mbed的?

我希望用舵机做一个开灯神器(就是喊一声“天猫精灵,开灯!”,贴在传统墙壁开关上的舵机就转一下,开灯)很久了,大家感兴趣嘛?感兴趣我这里给自己挖一个坑,后续专门写一篇文章,讲具体的辛酸历程。

总之呢,折腾的过程中,我很好奇,我的Mac电脑,应该如何把arduino的固件烧录到我的STM32F103C8T6中?在查询资料的过程中,我看到了一个视频,视频中老外为了尽快生成一个固件,使用Mbed在线的编辑工具,在线编译了一个固件出来。这波操作给我惊呆了,印象中,想要用STM32点亮一盏LED灯,代码量还是比较多的,你要开各种总线时钟,你要对引脚做各种配置。但老外只用了几行代码,就类似于下面几行代码就完事儿,这?

DigitalOut led1(PB_5);led1=1;

何为Mbed OS

Mbed是ARM亲自操刀(傻了吧?芯片架构是人家设计的,人家再来亲自操刀OS,那肯定是专业团队~)的一款物联网OS,针对的芯片是Arm Cortex系列的,其设计的full profile(我也不知道该怎么翻译)是RTOS,提供了一个抽象层,以便开发人员可以编写在任何启用了Mbed的板上运行的C / C ++应用程序。

说人话,啥意思?按照传统,我们在STM32上写一个程序是什么过程?首先是在windows上,装keil或者iar,然后看着ST的数据手册,即使用库开发,依然需要配置大量的时钟、总线等等(有人说STM32Cube,你看下一句话)。这个时候,如果跟你说,换个公司的芯片,你给我换Ti的Cortex-M3,你是不是就要骂娘了?

类似于Arduino,Mbed是一个针对Arm Cortex系列芯片的框架,作为开发者的我们,使用Mbed,可以获得以下好处:

  • 优秀的多平台开发环境,Mac上终于可以写STM32的程序啦!Mbed有配套的本地开发IDE、CLI工具,支持Windows、Mac以及linux。同时也提供在线的编辑、编译环境。也支持将Mbed的工程导出,导成VS Code,Keil,IAR的工程都可以。
  • 极少的代码量,一行代码初始化IO口、串口等外设,再也无需关注复杂的数据手册、钻研库开发啦!硬件层均由OS完成,各种复杂的驱动?专业团队,高兴送走!
  • OS提供丰富的API,多线程、信号量等等,我们只需要关注最上层的业务逻辑。
  • 再也不用为换芯片型号、厂商担心啦(我曾经参加一个3天时间的比赛,后来两天时间都在学TI TIVA系列芯片,移植点亮一盏LED)!使用Mbed,一套逻辑代码,ST的芯片好使,NXP的芯片好使,TI的芯片也好使。

优秀的多平台开发环境

多平台开发环境,意味着我们可以在Windows,MacOS,Linux甚至树莓派上做嵌入式的开发。

我在工作之前,一直使用windows系统,windows是一个非常好的操作系统(主要是打游戏舒服)。但是不能否认的是,存在相当一部分人,使用苹果电脑。你当然可以说那我装个虚拟机或者MacBook装个双系统就好了呀?但就像我这样的人,就觉得我花了大价钱,买了苹果的设备了,我还返回去用Windows,我这不是吃饱了没事干吗?

其实,工作以后,我购入最满意的东西,就是我的MacBook,它足够的轻,续航足够长,屏幕素质优秀(屏幕好真的,用过才知道)。晚上回家或是上班,随手掏出来,记笔记,改代码,写博客,真的有欲望做这些事。再也不用望着几斤重的游戏本,呼哧呼哧,连打开的欲望都没有了。

但是,购入MacBook后,我就再没有碰过STM32了,因为没有Keil这样的IDE,传统观念里面,在Mac上玩单片机相当的麻烦(有人用VS Code搭建过开发环境嘛?)。Mbed就解决了这个问题,用它的在线编辑器和编译环境,你只需要一个浏览器,就能玩转单片机了。

Mbed在线开发环境

当然了,可支持导出到我们熟悉的IDE。

工程可导出

极少的代码量

Mbed的代码量能少到什么程度呢?我们以点亮一盏LED为例,STM32库开发,代码是这样的:

#include "led.h"  
#include "SysTick.h"

void LED_GPIO_Config(void)
{		
	/*定义一个GPIO_InitTypeDef类型的结构体*/
	GPIO_InitTypeDef GPIO_InitStructure;

	/*开启GPIOB和GPIOE的外设时钟*/
	RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOB, ENABLE); 

	/*选择要控制的GPIOB引脚*/															   
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;	

	/*设置引脚模式为通用推挽输出*/
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   

	/*设置引脚速率为50MHz */   
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 

	/*调用库函数,初始化GPIOB0*/
	GPIO_Init(GPIOC, &GPIO_InitStructure);	

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;

	GPIO_Init(GPIOB, &GPIO_InitStructure);		
	
	/* 关闭所有led灯	*/
	GPIO_ResetBits(GPIOC, GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2);
	GPIO_ResetBits(GPIOB, GPIO_Pin_0);

	Delay_ms(1000);
	
	GPIO_SetBits(GPIOC, GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2);
	GPIO_SetBits(GPIOB, GPIO_Pin_0);
	Delay_ms(1000);
		
}

Mbed的代码长这样:

#include "mbed.h"

void LED_GPIO_Config(void)
{
	DigitalOut  led1(PB_6);   // on-board LED
	
	led1 = 1;
	thread_sleep_for(200);   // wait 200 millisecond
	led1 = 0;
}

代码量少了多少,一眼可见吧?这个例子只是初始化一个IO口,其他的比如串口,PWM,SPI,CAN等等外设,Mbed都会像初始化一个IO一样,非常简单。

丰富的API

不同于Arduino,Arduino的代码结构是有两个主要的函数,一个是初始化的,一个是大循环。我们的很多项目中,大循环的形式,效率相当底下,这也是我不太喜欢使用Arduino的原因。

Mbed提供了丰富的API,如RTOS的API,外设的API,数据存储的API,甚至于网络相关的API(如DNS,NetworkSocket)等等。

优秀的跨平台能力

这里列出Mbed支持的厂商吧,单是这长长的一列,你用的cortex架构芯片,哪个不是这些厂商出的?

优秀的跨平台能力

比如当我们针对ST公司的芯片,开发出一个产品。这时候需要更换另一个公司的芯片时,只需要改一下引脚即可,底层的驱动完全不用我关心,是不是从未有过如此爽快的体验?

尾巴

Mbed真的极大的拉低了硬件开发的门槛。以前我有一个创意,我可能会因为要再看一遍野火的《STM32库开发实战指南》,再熟悉一下各种结构体,各种外设应该怎么配置,想到如此复杂的过程,很快就放弃了。但现在,我有一个想法,用Mbed,我可以很快实现我的想法,即使我半年一年没接触过硬件的开发了,我已经不熟悉某一款芯片了,也没问题,好的工具真的能激发人创作的欲望。

其实我始终认为,硬件的开发,对于我们学生或者极客而言,IDE、OS都是工具,我们的目的是借助这些硬件实现我们的创意,无论是机器人还是我想做的开灯神器(手动滑稽),我们不应该把精力浪费在这些工具上。我们希望用最快的速度,最少的弯路,先把自己的创意实现了,再去关注原理(甚至于某些情况下,原理我们都不用关注)。而不是把百分之八十以上的时间,花在学习芯片本身应该如何使用,驱动应该怎么写上。等你做完这些事,也就没有心境去完成你的创意了。硬件的开发,门槛不应该被拉的这么高。

我印象最深刻的,就是大学那会儿我因为要生成一个控制舵机的PWM,从STC89C52,到STC12C5A60S2,到STC15系列,整整折腾了半年时间。大家感兴趣吗?感兴趣的话,我就再给自己挖一个坑,之后写一篇文章,痛述当年的心酸历程。

前段时间,我在知乎上看到一个回答,说中国嵌入式行业的学生们,并不像CS专业的学生,始终接触最新的技术,去努力提升自己,而是用着十几年前的IDE,循规蹈矩的做一些事。我在大学也是做机器人的,也是用着十几年前的IDE过来的。中国的学生、极客,在这方面真的很吃亏。不是我们不思进取,而是我们从一个做机器人、电子设计或是物联网的念头开始,了解到单片机这个概念。我们希望学习各种知识,但我们接触到的信息,就是郭天祥多年前的51单片机教程,然后去学习一款性能并不怎么样的芯片。就是野火的《STM32库开发实战指南》,花费很长的学习周期,学会调库,但是各种结构体,依然让人非常的抓狂。不是嵌入式的同学们不愿意接触最新的东西,而是我们压根都不知道,还有Mbed这种东西呢?还有Platformio这种东西呢?硬件还能这么玩呢?我们身边的老师不知道有这些东西,我们的学长不知道有这些东西。我们就只能用最笨的办法,最老的工具,最浪费时间的方式,走很多的弯路,浪费非常多不必要的时间和精力。

这种现状,导致了我们参加一个比赛、或是实现一个创意,百分之八十的时间都是在熟悉芯片的使用,熟悉各种传感器、电机的原理,折腾驱动,而真正做产品,实现功能的时间非常少。Mbed勾起了我重新玩单片机的热情,所以我非常想把这样一个工具告诉所有正在接触单片机、希望用单片机实现一些创意的人,它真的把硬件开发的门槛降得非常低。

我不奢求我这样一个单片机的爱好者,写这样一篇文章,就能改变现状。我只希望自己把折腾的过程,走过的弯路,整理成文字,祈祷文章中的关键字,能被百度、谷歌收录,有更多的人看到我的文章。我之后会出一系列的文章,比如我在使用Mbed的过程中遇到的一些问题,或者时我用Mbed实现的一些小创意。无论你是从博客还是知乎等平台看到我的文章,都请大家RSS订阅或者关注走一波吧,原创不易,但愿至少当你在百度或者google搜索的时候,不至于冒出来的全是一堆英文链接吧!