首页>资讯>游戏攻略>深圳SHENZHENIO第8关仿真蜂鸣器攻略
深圳IO是一款硬核的编程游戏,有着严谨的游戏内容,那么一起来看看第8关的仿真蜂鸣器的攻略吧。
主界面
由于游戏过分硬核,先放个手册中的图看看冰山一角:
不过这也正对应了嵌入式开发中会遇到的海量数据手册,相当程度上还原了嵌入式日常开发的情景。
游戏中设计到部分的编程有些类似于汇编语言,这里上手还是有一些些难度的,大家请做好准备,继续直接扔核弹:
不用害怕,在游戏过程中,会逐步引导你学会使用新的指令,对于新的器件,也是随着主线的进行逐步开放的
在游戏中,你不仅可以完成指定的基本目标,还可以挑战全网玩家,看谁能达成最佳优化目标。
鱼和熊掌不可兼得,多数情况下想要达成更好的性能就要增加成本啦,不过这正是优秀的嵌入式开发人员的意义所在——比你好,还比你的便宜。
第1关:安全摄像头
第2关:信号放大器
第3关:脉冲发生器
第4关:动画 ESPORTS 标志
第5关:游戏积分器
第6关:调谐最优化引擎
第7关:被动红外感应器
第8关:仿真蜂鸣器
关卡展示
本关要求当用户发送 1 信号时生成不间断的方波脉冲,直到用户发送 0 信号为止。
这一关我们接触到了一个新的元件:C2S-RF901。
它有如下特点:
1,和简单 IO 口每秒钟只能表示一个数据不同,这个元件可以存储大量数据,并且采用 FIFO(First In First Out,先进先出)的队列模式存储。
2,和简单 IO 口可以在同一秒内反复读取数据值不同,这个元件中的每个数据都只能被读取一次。简单 IO 口的数据在同一个时钟周期内可以反复读取,但也因此导致“一旦错过就不再”,下一秒钟就不能再读取上一秒中的数据了。
3,任何时候,当你读取这个元件中的数据时,这个元件会将实时的【队头】元素返回给你。如果队列里没有数据,这个元件会返回给你一个 -999 的值。
那么这道题其实和第三题【脉冲发生器】有点类似,唯一的不同是输入源产生了变化。第三题的脉冲发生器读取的是实时的按钮状态,而这一题读取的是队列里队头的状态(有可能不是实时的状态)。因此存在这样一种可能:实时状态是 -999,但是从队列里读取到了前一秒缓存下来的 0。所以我们仍然可以放心地使用 gen 来生成耗时 2 秒的方波脉冲,不用害怕在脉冲发生的第一秒钟来了个停止信号,然后下一秒错过该信号。如果输入源改为由简单 IO 口提供的 0/100 的按钮信号,那么就不能这样做了,必须每秒钟监视,否则就存在上面说的“一旦错过就不再”的可能性,错过用户发出的停止信号。
这道题的电路板和代码如下:
这里我们接触了一条新的指令:取反指令 not。这条指令不需要提供任何额外的操作数,它的作用是:若 acc 的值为 0,则将 acc 改写为 100;若 acc 的值不为 0,则将 acc 改写为 0。
这道题我们用了和上一题类似的想法:用 acc 寄存器记录蜂鸣器的开/关状态。
首先我们从 C2S-RF901 里读取值,判断其是 -999(无数据)还是 0、1(有数据),也就是将读出来的数据和 -1 比大小(tcp x0 -1)。我们发现,这个元件里提供的数据永远是 1、0 交替的,而且永远是以 1 开头。所以我们不需要判断具体的值是 0 还是 1,而是只要有数据,就反转 acc 寄存器(+ not)。另外,当读取到 -999(无数据)时,不对 acc 寄存器做任何操作,维持原状。
经过以上操作后,我们判断 acc 的值是 0 还是 100,然后分别做出不同的操作(tcp acc 50)。acc 的值为 100 时,我们生成一个 2 秒的方波(+ gen p1 1 1);acc 的值为 0 时,我们只需要待命,等待蜂鸣器开启即可(- slp 1)。
点击左下角的【模拟】,稍等片刻,便会弹出结算画面:
优化代码行数
和第 3 关类似,此题也可以得出结论【执行到 slp 1 时,p1 的值一定是 0,因此 slp 1 可以用 gen p1 0 1 来替换】,然后我们就可以使用 DX-300 魔法将 100 变成 1,并将两条 gen 指令合并成一条,达成节省代码行数的目的。
代码如下,请读者尝试自行解读,我不再重复阐述。如果看不懂,请回去阅读第 3 关的【优化代码行数】一节。
评论 (0)分享