1. 简述

优惠券网站 https://m.cps3.cn/

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

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. 从图形到像素:前端图形编程技术概览

    \n 图形是人与人之间传递信息的媒介,直观性远胜于口头语言和书面语言.4000多年前,古巴比伦人在石块上绘制建筑物的平面图:2000多年前,古希腊人用图形表达建筑思想,而与其相关的数学直到文艺复兴时期 ...

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

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

  3. 用Xlib库进行基本图形编程

    用Xlib库进行基本图形编程 用Xlib库进行基本图形编程 目录 1.前言 2.X Window系统的客户服务器模式 3.GUI编程-同步化的编程模型 4.基本的Xlib概念         1.X ...

  4. 《JavaScript高效图形编程(修订版)》——第2章 DHTML基础 2.1创建DHTML sprite

    本节书摘来自异步社区<JavaScript高效图形编程(修订版)>一书中的第2章,第2.1节,作者:[美]Raffaele Cecco著,更多章节内容可以访问云栖社区"异步社区& ...

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

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

  6. 关于windows图形编程 Hello2 程序的问题

    今天买了本windows图形编程, 袁风,机械工业出版社(N年前就绝版了,淘宝上买的复印版,效果比有些正版书要好), 在我运行书中示例程序 "Hello2.cpp" 的时候,发现程 ...

  7. C#(Sharp)GDI plus与图形编程(计算机图形学必备知识)

    文章目录 9.1 GDI+与图形编程 9.1.0 GDI概念 9.1.1 GDI+绘图命名空间 9.1.2 坐标系统 9.1.3 Graphics类 9.2 绘图工具类 9.2.1 Pen类 9.2. ...

  8. python的交互式解释器_python3.4.1解释器python交互式图形编程实例(三)

    本文实例为大家分享了python交互式图形编程实例的第三部代码,供大家参考,具体内容如下 #!/usr/bin/env python3 # -*- coding: utf-8 -*- #时钟 from ...

  9. java jfm入门_java图形编程

    //将布局管理器设置为边框布局 this.setLayout(new BorderLayout()); 边框布局:将组件按东南西北中的方式进行放置.一个方向只能放一个组件,组件大小岁容 jfm.set ...

最新文章

  1. Vicious Keyboard CodeForces - 801A (暴力+模拟)
  2. 计算机发现概述教案,计算机网络概述教案
  3. Ardino基础教程 7_蜂鸣器发声实验
  4. Day03-卷积神经网络原理与使用
  5. 2021-12-27
  6. hexo博客生成博文,当生成的文章数量超过1000时,耗尽所有内存资源后出现out of memory
  7. 面向对象基础回顾(二)
  8. 普通话测试第四题评分标准_普通话考试中命题说话的扣分标准
  9. 二叉树的遍历java版本
  10. ANSYS——模态提取方法简介
  11. Codeforces 864E Fire(背包DP)
  12. python open ascii codec cant_Python3.6 报错问题:'ascii' codec can't encode character
  13. go语言 recover
  14. 单件模式的两个简单实例
  15. 数据结构笔记(二十八)-- 图的广度优先遍历
  16. 使用SQL Server发布数据库快照遇到错误:对路径”xxxxx“访问被拒绝的解决方法...
  17. DELPHI 字符转16进制、16进制转字符
  18. 西北师范大学计算机科学与工程学院导师,西北师范大学计算机科学与工程学院导师简介-陈旺虎...
  19. Oracle用户、身份、数据类型、和mysql的区别
  20. CANCELLED: io.grpc.Context was canclled without error

热门文章

  1. 赠书 | 1月以来 Tether 增发47亿 USDT,美元都去哪儿了?
  2. 惊喜开学季,教你如何在人工智能时代站稳脚跟!
  3. pandas文件读取与存储
  4. 倩女幽魂显示服务器繁忙,倩女幽魂手游新服首开服务器爆满,万人排队逼疯玩家...
  5. 林仕鼎:大数据需要三类人才
  6. 20230404英语学习
  7. c语言中接收字符串函数,C语言中字符串处理函数拾锦
  8. android记事本开发背景,Android记事本开发之界面设计
  9. 一对一关联查询注解@OneToOne的实例详解(一)
  10. 【雕爷学编程】Arduino动手做(92)--- 433M无线收、发模块