首页>资讯>游戏攻略>深圳SHENZHENIO第27关深海探测网格攻略
深圳IO是一款硬核的编程游戏,有着严谨的游戏内容,那么一起来看看第27关深海探测网格的攻略吧。
主界面
由于游戏过分硬核,先放个手册中的图看看冰山一角:
不过这也正对应了嵌入式开发中会遇到的海量数据手册,相当程度上还原了嵌入式日常开发的情景。
游戏中设计到部分的编程有些类似于汇编语言,这里上手还是有一些些难度的,大家请做好准备,继续直接扔核弹:
不用害怕,在游戏过程中,会逐步引导你学会使用新的指令,对于新的器件,也是随着主线的进行逐步开放的
在游戏中,你不仅可以完成指定的基本目标,还可以挑战全网玩家,看谁能达成最佳优化目标。
鱼和熊掌不可兼得,多数情况下想要达成更好的性能就要增加成本啦,不过这正是优秀的嵌入式开发人员的意义所在——比你好,还比你的便宜。
第27关:深海探测网格
关卡展示
本关有【声纳】和【磁】两个波形输入,同时 C2S-RF901 会不定期地提供一些长度为 2 的数据包。仅当收到的数据包的首数字和锁中的数字相等时才向 tx 端口输出数据包,要输出的数据包的内容和收到的数据包的第二个数字有关:第二个数字为 1 时,输出(包括当前时间在内的)前 6 秒的【声纳】值;第二个数字为 2 时,输出前 6 秒的【磁】值。
思路:由于 p 口数据“一旦错过就不再”,所以对于两种波形数据,我们只能像下面这样“错位存储”:
当我们读取数据的时候,也必须“隔行扫描”错位读取。
声纳数据只放在偶数地址里,磁数据只放在奇数地址里。如果需要读取前 6 秒内的【声纳】数据,我们需要将地址指针前移 12 格(或者后移 2 格)后,读取一格,舍弃一格,如此循环 6 次,就成功发送了【声纳】的数据包。如果需要读取前 6 秒内的【磁】数据,则改为将地址指针前移 11 格(后移 3 格),循环部分同样读取一格,舍弃一格,如此循环 6 次,就成功发送了【磁】的数据包。电路图和代码如下:
首先我们将当前的声纳和磁数据存入 RAM(mov p1 x0, mov p0 x0),然后判定当前数据包的首数字是否和锁中的数字一致(teq x2 x3)。如果首数字和锁中的数字不一致,直接跳到最后休眠(slp 1)。一致的情况下,根据数据包的第二个数字决定需要让地址指针向前前进多少格。我们之前分析过,第二个数字是 1 时,需要跳 2 格;第二个数字是 2 时,需要跳 3 格。但如果我们将循环节变为“先舍弃、后读取”的话,就变成了这样:第一个数字是 1 时跳 1 格,第二个数字是 2 时跳 2 格。跳的格数和第二个数字完全一致了。我们的 4~6 行代码正是这样的逻辑:得到现在的地址(+ mov x1 acc),数据包的第二个数字是多少就向前跳多少格(+ add x2),然后将新地址重新放回地址寄存器(+ mov acc x1)。然后我们准备进入循环,令 acc 作为循环次数计数器,初始值设为 6,表示要执行 6 次循环(+ mov 6 acc)。
第 8~12 行是个循环,这里我们用到了一个特殊的寄存器:null。它的作用是,如果你从这个寄存器读数字,那么会读到恒 0;如果你往这个寄存器里写数字,那么相应的数字会被丢弃。null 寄存器通常都是和 ROM/RAM 配合使用的,我们从 ROM/RAM 的数据口里读一个数据,但是送往 null 寄存器,直接舍弃掉,这样可以很方便地让地址自增。当我们只想让地址自增,不想对获得的数据做处理时,比起“将地址读入 acc、令 acc +1、将新的 acc 送回地址寄存器”这三步来说,读一次数据口,然后舍弃掉获得的数字,是更优的做法。
我们的循环节正是“先舍弃”(+ mov x0 null),“后读取”(+ mov x0 x3),“循环 6 次”(+ tcp acc 1, + sub 1, + jmp 8)。循环完成后,休眠一秒,进入下一个时钟周期(slp 1)。
点击左下角的【模拟】,稍等片刻,便会弹出结算界面:
评论 (0)分享