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. Android Studio 通过 ListView 学习 ArrayAdapte

    ListView •前言 ListView 绝对可以称得上是 Android 中最常用的控件之一,几乎所有的应用程序都会用到它. 由于手机屏幕空间有限,能够一次性在屏幕上显示的内容并不多,当我们的程序 ...

  2. 周爱民带你深入剖析JavaScript核心原理

    作为前端工程师必备技能,JavaScript 的重要性不言而喻.虽然易上手,但却有着诸多复杂微妙的机制,想要真正掌握绝非易事. 专栏面向JavaScript语言的实际应用者与深度爱好者,以讲述Java ...

  3. 呵呵,Semaphore,就这?

    这是并发线程工具类的第二篇文章,在第一篇中,我们分析过 CountDownLatch 的相关内容,你可以参考 一文搞懂 CountDownLatch 用法和源码! 那么本篇文章我们继续来和你聊聊并发工 ...

  4. 【笔记】《Redis设计与实现》chapter9 数据库

    9.1 服务器中的数据库 Redis服务器将所有都保存在服务器状态redis.h/redisServer结构中 struct redisServer{ //... // 一个数组,保存着服务器中所有数 ...

  5. 关于Vim/Neovim/SpaceVim的一些思考

    1 前言 最近看到了Neovim以及SpaceVim,于是上手试了一下. 2 Neovim与SpaceVim Neovim是Vim的一个分支,具有更加现代的GUI.嵌入式以及脚本化的终端.异步工作控制 ...

  6. TP6学习笔记一:安装与基本配置

    1 说明与概述 1.1 说明 以下内容大部分来源于TP6完全开发手册,以手册为主附上个人理解,仅作学习使用. 1.2 概述 第一篇学习笔记,主要记录TP6的基础,包括TP6简介,安装,Hello Wo ...

  7. 3. Mybatis Insert

    案例: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC &qu ...

  8. 使用 mvn install 命令将本地jar包注册到本地maven仓库

    前提: 要安装maven并配置环境变量. windows 系统环境变量配置 新建环境变量:MAVEN_HOME    值为:maven的解压包路径或安装路径. 在path 环境变量中添加:%MAVEN ...

  9. 【网络协议】 TCP三次握手的流程

    在TCP/IP协议中,TCP协议通过三次握手,建立可靠的连接服务: 三次握手是由客户端发起 第一步: 客户端向服务端发送请求报文(实际上就是一个具有特定格式的数据包),报文中包含一个标志为Syn,Sy ...

  10. 【日志追踪】(微服务应用和单体应用)-logback中的MDC机制

    一.MDC介绍 MDC(Mapped Diagnostic Contexts)映射诊断上下文,该特征是logback提供的一种方便在多线程条件下的记录日志的功能, 某些应用程序采用多线程的方式来处理多 ...