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. 详解php中函数的引用传递和返回 (附代码)

    本篇文章带大家了解一下php的引用,详细介绍一下函数的引用传递和引用返回.有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助.php的引用(就是在变量或者函数.对象等前面加上&符号 ...

  2. mysql中FIND_IN_SET函数用法

    本篇文章主要介绍mysql中FIND_IN_SET函数用法,用来精确查询字段中以逗号分隔的数据 以及其与 like 和 in 的区别 1.问题发现 之前在做工作任务时有这么一个需求:需要用接口所传的服 ...

  3. 全面了解Vue3的 ref 和相关函数和计算属性

    基础类型的响应性 -- ref 在vue3里面,我们可以通过 reactive 来实现引用类型的响应性,那么基础类型的响应性如何来实现呢? 可能你会想到这样来实现: const count = rea ...

  4. day-01-初识Python与条件判断

    cpu 内存 硬盘 操作系统 cpu:计算机的运算和计算中心,相当于人类大脑.飞机 ​ 内存:暂时存储数据,临时加载数据应用程序,4G,8G,16G,32G ​ 速度快,高铁,断电即消失.造价很高 ​ ...

  5. 【解决】Could not GET 'https://maven.google.com

    现象 解决方案 1. 由于Google被墙导致的问题 参考 配置阿里云源修改maven的源地址. 2. 由于错误配置代理导致的问题(提示400) 查看工程目录下的gradle.properties和C ...

  6. OO 第二单元

    前言 ​ 第二单元 OO 作业的主题是多线程,课程组通过了电梯调度这个经典问题考察了多线程的调度. ​ 从第五次作业到第七次作业的迭代为,单部多线程可捎带电梯,多部多线程可捎带调度电梯(电梯属性相同) ...

  7. 03.ElementUI源码学习:代码风格检查和格式化配置(ESlint & Prettier)

    书接上文.在团队协作中,为避免低级Bug.以及团队协作时不同代码风格对彼此造成的困扰与影响,会预先制定编码规范.使用 Lint工具和代码风格检测工具,则可以辅助编码规范执行,格式化代码,使样式与规则保 ...

  8. 自定义grub主题

    1 概述 自定义grub引导菜单的主题,笔者的linux是deepin,感觉默认的grub主题不太好看,嗯,没办法,就是想改了. 这篇文章主要是修改/boot/grub/grub.cfg以及/boot ...

  9. 004-Java中的运算符

    @ 目录 一.运算符 一.分类 二.算数运算符 三.关系运算符 四.逻辑运算符 五.赋值运算符 六.条件运算符(三目运算符) 七.+运算符 一.运算符 一.分类 二.算数运算符 加  $+$ 减  $ ...

  10. JDBC_03_反射机制注册驱动

    反射机制注册驱动 代码:以类加载的方式注册驱动,因为注册驱动的代码是一个静态代码块,所以用Class.forname()加载该类,静态代码块也会进行加载 import java.sql.*; publ ...