Arduino多核编程:简单例子

不管你是Arduino领域的新手还是经验丰富的开发人员,很可能你还只使用过单核在进行编程。 这没有什么好笑的---- 事实上,直到几天前我才使用Arduino IDE进行了第一次多核编程。 我和所有其他Arduino粉丝都非常喜欢IDE的易用性以及MicroController 开发所需的很少的环境配置。 同样的IDE,只需要很少的环境配置,就可以用于多核开发了。
下面来看看怎样编写使用六个并行MCU内核的程序吧,但在此之前首先让我们来了解为什么多核优于一个内核。

db3fe2ff-8664-4e80-ab09-c147d21b7c91-image.png

为什么要使用多核?

如果你的项目是关于读取传感器的值或让LED亮起来这种简单而无需任何复杂的计算的工作,那么你的电路板的MCU有1个或100个核心都是一样的。 这种简单地工作无论用1核还是100核最后得出的效果都是很相似的 - 至少从人类可以感知到的角度来看。 但是,通过多个核心,你可以开发具有复杂算法和计算的更先进的解决方案,例如快速傅里叶变换,手势识别,边缘计算,预测性维护,甚至是简单的实时3D渲染。 下面,我们将介绍如何利用索尼的物理网开发套件"Spresense"来在Arduino IDE里进行多核编程。 该板不仅具有六个ARM核心,还有高达156 MHz的频率。 而且如果需要的话,这个板子可以使用电池供电。

第一步: 在Arduino IDE里安装Spresense

Spresense Arduino软件包1.3.0版以上支持使用Arduino IDE进行多核编程。 如果你还没有安装它,最简单的方法是按照Spresense开发人员网站上的步骤操作。
链接:https://developer.sony.com/develop/spresense/developer-tools/get-started-using-arduino-ide/set-up-the-arduino-ide#_installation_through_arduino_ide_board_manager

第二步:打开示例代码

我们使用的例子将用一个主核和四个子核,在Arduino IDE的文件菜单中,打开示例代码:
File → Examples → MultiCore MP → Boot → Main

ea8803d5-26ea-4c9d-b4cf-bc2bc63601de-image.png


976bf3ed-0adb-4af4-af53-77d9bd5b8f7d-image.png


这个 main.ino 代码(Sketch)中 包含了多核MP库,在FOR循环中调用MP.begin(subid)函数来启动每个子核:

64f067c2-da9f-40db-a497-07eadfa2491f-image.png

第三步:编译并上传主核心代码

为了上传Spresense板上面正确核心的代码(Sketch),从Arduino IDE 工具菜单选择:
Tools → Core → MainCore

d0aafb1a-710d-4313-85e4-4dbe5af70ccd-image.png


接下来,按下上传按钮上传编译主核代码:

a7acc44b-f85a-4d5c-a9e0-e1d074c4a297-image.png

第四步:快速检查

如果上传成功了的话,主核现在应该已经被编好程了。你可以打开串口检测器看看输出,如下图,主核工作良好,其他的核心有一个错误。这当然,因为我们还没有上传他们的代码,这就是我们接下来要做的。

1fd70c40-8433-401e-85c7-c7dc76568fc4-image.png

第五步:子核心编程

在IDE中,打开File → Examples → MultiCore MP → Boot → Sub1

9abd01a4-4943-437f-9b9e-f89483582b53-image.png


a7099935-13d9-4ee5-ba1b-9f7e49734147-image.png


setup()函数里, MP.begin()函数通知主核各个子核已经启动好了. 在loop() 函数里, MPlog()每一次迭代输出 一次“loop” 并且让第一个LED灯闪一下。

9931aac4-0301-4655-92c6-e1c55a5dd4d6-image.png

第六步:子核程序编译上传

从Arduino IDE 的工具菜单中选择SubCore 1:
Tools → Core → SubCore 1.

a77f9812-fa8b-4985-a941-d4d14221fd77-image.png


按下上传按钮编译上传子核程序到板子上
然后,对剩下的三个子核重复5和6步。

第七步:最终结果

如果子核程序上传的对的话,LED灯会闪烁,并且串口监视器会输出所有核心的记录:

70e88df1-492a-4ab2-97de-f3ab53d5493f-image.png


如果你想把所有核心代码放在一个Sketch里,可以参照 MessageHello这个示例代码,在Spresense的官方网站上,更多的例子也可以在Spresense开发者官方网站上找到。


本文为我原创

本文禁止转载或摘编

-- --
  • 投诉或建议
评论