在MakeCode中提升forever积木的多工性能


#1

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积木中分别控制引脚电平

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截图:
image

micro:bit V2-PulseView截图:
image

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

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

micro:bit V1-PulseView截图:

micro:bit V2-PulseView截图:
image

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延时积木

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

micro:bit V1-PulseView截图:
image

micro:bit V2-PulseView截图:

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

micro:bit V1:6毫秒(ms)
micro:bit V2:4毫秒(ms)

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

image

将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,实际执行都将等于这个最低值,而若超出这个值后将按照设置的值来等待延时。