1. 简述

本文不涉及对测试中所用到的设备或软件的推广。

micro:bit 是一款由英国广播电视公司(BBC)为青少年编程教育设计,并由微软,三星,ARM,英国兰卡斯特大学等合作伙伴共同完成开发的微型电脑,目前推出V1,V2两款,后者较比前者性能稍强。

MakeCode 是微软所推行的应用于编程教育的图形编程语言,也是micro:bit 目前主流应用的编程语言。

其编辑器主要由三个部分组成,图形化积木(blocks)编辑器,仿真模拟器,图形化积木所对应的JavaScript代码编辑器。

我对其中关于forever积木在micro:bit 上实机运行的多工性能用逻辑分析仪进行了测试,由于micro:bit V1及V2版本性能有差异,将分别测试并记录。

2. 测试环境

micro:bit V1及V2版本各一块,将micro:bit 的引脚全部引出的扩展板,SX24M8逻辑分析仪,PulseView。

3. 测试程序1 在五个forever积木中分别控制引脚电平

javascript代码:

pins.digitalWritePin(DigitalPin.P12, 0)
pins.digitalWritePin(DigitalPin.P13, 0)
pins.digitalWritePin(DigitalPin.P14, 0)
pins.digitalWritePin(DigitalPin.P15, 0)
pins.digitalWritePin(DigitalPin.P16, 0)
basic.pause(2000)
basic.forever(function () {
pins.digitalWritePin(DigitalPin.P12, 1)
pins.digitalWritePin(DigitalPin.P12, 0)
})
basic.forever(function () {
pins.digitalWritePin(DigitalPin.P13, 1)
pins.digitalWritePin(DigitalPin.P13, 0)
})
basic.forever(function () {
pins.digitalWritePin(DigitalPin.P14, 1)
pins.digitalWritePin(DigitalPin.P14, 0)
})
basic.forever(function () {
pins.digitalWritePin(DigitalPin.P15, 1)
pins.digitalWritePin(DigitalPin.P15, 0)
})
basic.forever(function () {
pins.digitalWritePin(DigitalPin.P16, 1)
pins.digitalWritePin(DigitalPin.P16, 0)
})

3.1 关于forever积木

在on start内的程序执行完后,forever内的程序会被循环执行。

forever内没有while(True)死循环的时候,执行完自身内部的程序后会让出纤程(fiber),此时允许执行其他的forever,即可以在后台存在多个forever,而多个forever将在系统中组成一个“大循环”。

3.2 五个forever的执行顺序

micro:bit V1-测试程序1-PulseView截图:

D0连接P12,D1连接P13,D2连接P14,D3连接P15,D4连接P16。

由此图可见,执行顺序是以javascript代码中的顺序为准的,而此顺序与在图形化积木编辑器内创建forever积木的顺序有关。

3.3 执行digital write pin积木所需要的时间

micro:bit V1-PulseView截图:

micro:bit V2-PulseView截图:

micro:bit V1:6微秒(μs)

micro:bit V2:1微秒(μs)

3.4 从第一个forever开始运行到五个结束运行过后再次拉起第一个forever所需要的最少时间

micro:bit V1-PulseView截图:

micro:bit V2-PulseView截图:

micro:bit V1:24毫秒(ms)

micro:bit V2:20毫秒(ms)

在测试程序1中,即使只有一个forever在执行,再次拉起forever所需要的最少时间也不会改变。

3.5 从一个forever执行完毕到下一个forever开始执行所需要的间隔时间

micro:bit V1-PulseView截图:

micro:bit V2-PulseView截图:

上图分别是micro:bit V1和V2刚开机时与持续运行约20秒后的表现,发现随着运行时间的持续,forever之间的运行间隔时间变得不均匀。

4. 测试程序2 加入while循环及pause 1ms延时积木



javascript代码:

pins.digitalWritePin(DigitalPin.P12, 0)
pins.digitalWritePin(DigitalPin.P13, 0)
pins.digitalWritePin(DigitalPin.P14, 0)
pins.digitalWritePin(DigitalPin.P15, 0)
pins.digitalWritePin(DigitalPin.P16, 0)
basic.pause(2000)
basic.forever(function () {
while (true) {
pins.digitalWritePin(DigitalPin.P12, 1)
pins.digitalWritePin(DigitalPin.P12, 0)
basic.pause(1)
}
})
basic.forever(function () {
while (true) {
pins.digitalWritePin(DigitalPin.P13, 1)
pins.digitalWritePin(DigitalPin.P13, 0)
basic.pause(1)
}
})
basic.forever(function () {
while (true) {
pins.digitalWritePin(DigitalPin.P14, 1)
pins.digitalWritePin(DigitalPin.P14, 0)
basic.pause(1)
}
})
basic.forever(function () {
while (true) {
pins.digitalWritePin(DigitalPin.P15, 1)
pins.digitalWritePin(DigitalPin.P15, 0)
basic.pause(1)
}
})
basic.forever(function () {
while (true) {
pins.digitalWritePin(DigitalPin.P16, 1)
pins.digitalWritePin(DigitalPin.P16, 0)
basic.pause(1)
}
})

4.1 再次拉起第一个forever所需要的最少时间

micro:bit V1-PulseView截图:

micro:bit V2-PulseView截图:

较比 3.4 中所测得的数值有显著的减少

micro:bit V1:6毫秒(ms)

micro:bit V2:4毫秒(ms)

4.2 改变pause 1ms延时积木的位置

将pause 1ms延时积木的位置调换到顶部,经过逻辑分析仪测试对结果没有影响,但如果放置在需要运行的两个积木中间则会改变运行时间。

4.3 加入while循环及pause 1ms延时积木提高了运行效率

while(Ture)循环积木单独加入forever中将形成死循环无法让出纤程(fiber),而再在while中加入pause延时积木,则会使程序运行到此处时,在等待延时的时间同时让出纤程(fiber),允许其他forever的运行,且延时结束并运行完一次while循环内的程序后并不会退出到while循环外等待forever积木再次被系统唤起(除非加入了break的条件),while循环内的程序将立即循环执行,多个forever中都如此设计将极大提高系统运行效率。

并非一定要将pause延时设置为1ms,只要在micro:bit V1中设置低于6ms,micro:bit V2中设置低于4ms,实际执行都将等于这个最低值,而若超出这个值后将按照设置的值来等待延时。

5. 测试程序3 将第一个forever中的pause 1ms延时积木换为show number显示积木

javascript代码:

pins.digitalWritePin(DigitalPin.P12, 0)
pins.digitalWritePin(DigitalPin.P13, 0)
pins.digitalWritePin(DigitalPin.P14, 0)
pins.digitalWritePin(DigitalPin.P15, 0)
pins.digitalWritePin(DigitalPin.P16, 0)
basic.pause(500)
basic.forever(function () {
while (true) {
pins.digitalWritePin(DigitalPin.P12, 1)
pins.digitalWritePin(DigitalPin.P12, 0)
basic.showNumber(1)
}
})
basic.forever(function () {
while (true) {
pins.digitalWritePin(DigitalPin.P13, 1)
pins.digitalWritePin(DigitalPin.P13, 0)
basic.pause(1)
}
})
basic.forever(function () {
while (true) {
pins.digitalWritePin(DigitalPin.P14, 1)
pins.digitalWritePin(DigitalPin.P14, 0)
basic.pause(1)
}
})
basic.forever(function () {
while (true) {
pins.digitalWritePin(DigitalPin.P15, 1)
pins.digitalWritePin(DigitalPin.P15, 0)
basic.pause(1)
}
})
basic.forever(function () {
while (true) {
pins.digitalWritePin(DigitalPin.P16, 1)
pins.digitalWritePin(DigitalPin.P16, 0)
basic.pause(1)
}
})

5.1 show number显示积木在逻辑分析仪中的表现

micro:bit V1-PulseView截图:

micro:bit V2 表现一致。

在micro:bit 上显示数字1需要750ms,这750ms的时间里让出了纤程(fiber)让另外4个forever得以正常运行,这证明显示积木也可以像pause延时积木一样在while循环中让出纤程(fiber)。

6. 测试程序4 将所有pause 1ms延时积木换为show number显示积木

6.1 实机LED矩阵显示效果

micro:bit V1和V2都只能观察到LED矩阵显示数字1.

6.2 在逻辑分析仪中的表现

micro:bit V1-PulseView截图:

micro:bit V2-PulseView截图:

在micro:bit V1中仅show number 1所在的while循环还在执行,其余循环都没有执行。

在micro:bit V2中表现的比较特殊,即使LED矩阵并没有显示对应数字,也会在每一次show number 1所在的while循环完成后,依顺序每次循环执行一个forever中对引脚电平控制的积木。

7. 测试程序4 再次加入pause 1ms延时积木

7.1 实机LED矩阵显示效果

micro:bit V1和V2都能观察到LED矩阵按照顺序依次显示12345.

7.2 在逻辑分析仪中的表现

micro:bit V1-PulseView截图:

micro:bit V2 表现一致。

与5.1,6.2中所测得的结果相比较,表明show number显示积木可以在while循环中让出纤程(fiber)允许其他forever中的积木执行,却无法允许相同的show number显示积木执行。

只有加入pause 1ms延时积木才可将让出纤程(fiber)让其他的show number显示积木所在的forever得以执行,且必须等到前一个show number显示积木执行完毕后才可以执行后续的show number显示积木。

另外show leds,show icon,show arrow显示积木与之相同,但同样用于控制LED矩阵显示的plot X0 Y0积木及其相关联的积木则无法在while循环中让出纤程(fiber)。

8. 测试程序5 音乐积木

javascript代码:

pins.digitalWritePin(DigitalPin.P12, 0)
pins.digitalWritePin(DigitalPin.P13, 0)
pins.digitalWritePin(DigitalPin.P14, 0)
pins.digitalWritePin(DigitalPin.P15, 0)
pins.digitalWritePin(DigitalPin.P16, 0)
music.setVolume(25)
music.setTempo(60)
basic.pause(500)
basic.forever(function () {
while (true) {
music.playTone(262, music.beat(BeatFraction.Whole))
pins.digitalWritePin(DigitalPin.P12, 1)
pins.digitalWritePin(DigitalPin.P12, 0)
}
})
basic.forever(function () {
while (true) {
music.playTone(294, music.beat(BeatFraction.Half))
pins.digitalWritePin(DigitalPin.P13, 1)
pins.digitalWritePin(DigitalPin.P13, 0)
}
})
basic.forever(function () {
while (true) {
music.playTone(330, music.beat(BeatFraction.Quarter))
pins.digitalWritePin(DigitalPin.P14, 1)
pins.digitalWritePin(DigitalPin.P14, 0)
}
})
basic.forever(function () {
while (true) {
music.playTone(349, music.beat(BeatFraction.Eighth))
pins.digitalWritePin(DigitalPin.P15, 1)
pins.digitalWritePin(DigitalPin.P15, 0)
}
})
basic.forever(function () {
while (true) {
music.playTone(392, music.beat(BeatFraction.Sixteenth))
pins.digitalWritePin(DigitalPin.P16, 1)
pins.digitalWritePin(DigitalPin.P16, 0)
}
})

8.1 实际发声效果

仅测试了micro:bit V2,因为其板载蜂鸣器,如果是micro:bit V1则需痛过引脚外接音响设备。

从听觉上大致能判断实际播放的是“和声”,即多个音调同时响起,并不会按照forever的顺序逐一播放。

8.2 在逻辑分析仪中的表现

micro:bit V2-PulseView截图:

在while循环中没有加入pause延时积木的情况下也能让出纤程(fiber)去执行其他的forever。

程序依旧按照forever积木的顺序来循环执行,但各个forever中的play tone积木将持续运行完其设置的节拍所需的时间后才会执行后续的控制引脚高低电平的积木。

9.小结

micro:bit 应用MakeCode进行编程时可以善用forever积木内置一层while循环积木和一个pause 1ms延时积木来增强 多工 的性能表现,pause 1ms延时积木添加在所要运行的程序开头或结尾都可以。

MakeCode图形编程应用在micro:bit上的多工性能实测的更多相关文章

  1. 现代3D图形编程学习-基础简介(3)-什么是opengl (译)

    本书系列 现代3D图形编程学习 OpenGL是什么 在我们编写openGL程序之前,我们首先需要知道什么是OpenGL. 将OpenGL作为一个API OpenGL 通常被认为是应用程序接口(API) ...

  2. 现代3D图形编程学习-基础简介(2) (译)

    本书系列 现代3D图形编程学习 基础简介(2) 图形和渲染 接下去的内容对渲染的过程进行粗略介绍.遇到的部分内容不是很明白也没有关系,在接下去的章节中,会被具体阐述. 你在电脑屏幕上看到的任何东西,包 ...

  3. 现代3D图形编程学习-基础简介(1) (译)

    本书系列 现代3D图形编程学习 基础简介 并不像本书的其他章节,这章内容没有相关的源代码或是项目.本章,我们将讨论向量,图形渲染理论,以及OpenGL. 向量 在阅读这本书的时候,你需要熟悉代数和几何 ...

  4. 现代3D图形编程学习-关于本书(译)

    本书系列 现代3D图形编程学习 关于这本书 三维图像处理硬件很快成为了必不可少的组件.很多操作系统能够直接使用三维图像硬件,有些甚至要求需要有3D渲染能力的硬件.同时对于日益增加的手机系统,3D图像硬 ...

  5. C算法编程题(四)上三角

    前言 上一篇<C算法编程题(三)画表格> 上几篇说的都是根据要求输出一些字符.图案等,今天就再说一个“上三角”,有点类似于第二篇说的正螺旋,输出的字符少了,但是逻辑稍微复杂了点. 程序描述 ...

  6. [ios]iOS 图形编程总结

    转自:http://www.cocoachina.com/ios/20141104/10124.html iOS实现图形编程可以使用三种API(UIKIT.Core Graphics.OpenGL E ...

  7. OpenGL基础图形编程

    一.OpenGL与3D图形世界1.1.OpenGL使人们进入三维图形世界 我们生活在一个充满三维物体的三维世界中,为了使计算机能精确地再现这些物体,我们必须能在三维空间描绘这些物体.我们又生活在一个充 ...

  8. 【转】OpenGL基础图形编程(一)

    原文:http://blog.chinaunix.net/uid-20638550-id-1909183.html  分类: 一.OpenGL与3D图形世界 1.1.OpenGL使人们进入三维图形世界 ...

  9. iOS 图形编程总结

    iOS实现图形编程可以使用三种API(UIKIT.Core Graphics.OpenGL ES及GLKit). 这些api包含的绘制操作都在一个图形环境中进行绘制.一个图形环境包含绘制参数和所有的绘 ...

随机推荐

  1. Python图像处理库——PIL

    PIL全称Python Image Library,是python官方的图像处理库,包含各种图像处理模块.Pillow是PIL的一个派生分支,包含与PIL相同的功能,并且更灵活.python3.0之后 ...

  2. maven setting.xml 阿里云镜像 没有一句废话

    <?xml version="1.0" encoding="UTF-8"?> <!-- Licensed to the Apache Soft ...

  3. JavaWeb 基础知识补充

    软件架构 1. C/S: Client/Server 客户端/服务器端         * 在用户本地有一个客户端程序,在远程有一个服务器端程序         * 如:QQ,迅雷...        ...

  4. Druid 监控分布式解决方案

    什么是 Druid Monitor Druid 是一个非常强大的数据库连接池,但是它的强大并不仅仅体现在作为一个高性能连接池加快数据访问上和连接管理上,它内置了一个强大的监控工具:Druid Moni ...

  5. 关于 下载 nfs-utils时的 gssproxy conflicts with selinux-policy-3.13.1-102.el7.noarch 错误

    使用 yum install nfs-utils -y 时 出现如下错误: 错误:gssproxy conflicts with selinux-policy-3.13.1-102.el7.noarc ...

  6. adb下载安装

    下载地址:https://www.androiddevtools.cn/# 首页tab工具栏: 选择Android SDK工具-- SDK Tools 下载任一版本即可 安装 :将下载的安装包解压到D ...

  7. Vue 批量注册局部组件及应用

    博客地址:https://ainyi.com/105 批量注册路由的有个博客说到:https://ainyi.com/77 实际工作中,可能会遇到一个大页面里面有很多个模块,这些模块一般是需要拆分到单 ...

  8. 8.switch语句

    switch语句语法 switch(expression){ case value : //语句 break; //可选 case value : //语句 break; //可选 //你可以有任意数 ...

  9. 【Jwt】JSON Web Token

    一.什么是JSON Web Token: 首先要明确的是JSON Web Token:是一个开放标准,这个标准定义了一种用于简洁,自包含的用于通信双方之间以JSON对象的形式安全传递信息的方法 而我们 ...

  10. python 利用opencv去除图片水印

    python 去除水印"人工"智能去除水印 这两天公司来了一个新的需求--去除水印,对于我一个从未接触过的这种事情的人来说,当时我是蒙的.不过首先我就去搜索了一下是否有该种合适的功 ...