电玩圈游戏网 搜一搜

安卓手游去频道 >

角色扮演 射击枪战 棋牌卡牌 体育运动 角色扮演 赛车竞速 休闲益智 音乐舞蹈 模拟经营 战棋塔防 推理解谜 策略战争

安卓应用去频道 >

社交通讯 系统工具 影音视听 拍摄美化 效率办公 学习教育 生活服务 旅游出行 资讯阅读 金融理财 网络购物 游戏助手

游戏视频去频道 >

动作冒险 射击枪战 棋牌卡牌 体育运动 角色扮演 赛车竞速 音乐舞蹈 模拟经营 战棋塔防 推理解谜 策略战争 休闲益智

资讯攻略去频道 >

手游资讯 手游攻略 手游问答 游戏资讯 游戏杂谈 游戏攻略 软件教程 软件资讯

专题合集去频道 >

游戏专题 应用专题

排行榜单去频道 >

游戏排行 应用排行
首页 游戏 应用 视频 资讯 专题 榜单

首页>资讯>游戏攻略>深圳SHENZHENIO第17关共生环境维护机器人攻略

深圳SHENZHENIO第17关共生环境维护机器人攻略

作者:佚名来源:百度2022/06/07

深圳IO是一款硬核的编程游戏,有着严谨的游戏内容,那么一起来看看第17关的共生环境维护机器人的攻略吧。

主界面

由于游戏过分硬核,先放个手册中的图看看冰山一角:

不过这也正对应了嵌入式开发中会遇到的海量数据手册,相当程度上还原了嵌入式日常开发的情景。

游戏中设计到部分的编程有些类似于汇编语言,这里上手还是有一些些难度的,大家请做好准备,继续直接扔核弹:

不用害怕,在游戏过程中,会逐步引导你学会使用新的指令,对于新的器件,也是随着主线的进行逐步开放的

在游戏中,你不仅可以完成指定的基本目标,还可以挑战全网玩家,看谁能达成最佳优化目标。

鱼和熊掌不可兼得,多数情况下想要达成更好的性能就要增加成本啦,不过这正是优秀的嵌入式开发人员的意义所在——比你好,还比你的便宜。

第 17 关:共生环境维护机器人

关卡展示

本关的 C2S-RF901 设备会不定期地发送一些长度为 3 的数据包。第一个数字表示需要令电机移动到哪一格,第二个数字表示需要清洁的秒数,第三个数字表示需要加液的秒数。

电机初始位置在第 0 格,电平信号为 50。如果要让电机向左移动一格,需要给电机发送 0x1s + 50x1s 的脉冲信号;如果要让电机向右移动一格,需要给点击发送 100x1s + 50x1s 的脉冲信号。

本关的电机移动较为复杂,因为多了 50 这种信号,所以没办法简单地用 gen 指令来生成脉冲信号了。如果把所有的工作都写在同一块芯片里,即使是 MC6000 也很难写得下。所以我们这里来尝试分工,一块芯片专门用来处理电机的移动任务,另一块芯片专门用来给前面那块芯片发送电机应当到达的位置,等到达后再亲自处理清洁和加液任务。

我们先把电机移动的程序写出来:

上方芯片的 acc 寄存器用于记录实时的电机位置,初始值为 0。

首先我们将电机的电平信号初始化为 50(mov 50 p1),然后开始等待下面的芯片发送“位置”数据(slx x2)。等待到信号后,我们将电机的目标位置放入 dat 寄存器(mov x2 dat),并检查电机的当前位置是否已经在目标位置上(teq dat acc)。如果已经在目标位置上,则发送一个信号给下面的芯片,告知下面的芯片该清洁和加液了(+ mov 0 x2),同时开始休眠,等待下一个信号(+ jmp 2,跳到了第 2 行 slx x2)。如果不在目标位置上,则判断目标位置在当前位置的左边还是右边(tcp dat acc)。如果目标位置在电机的左边,则令电机的实时位置 -1(- sub 1),同时给电机发送一秒钟的 0 信号(- gen p1 0 1)。如果目标位置在电机的右边,则令电机的实时位置 +1(+ add 1),同时给电机发送一秒钟的 100 信号(+ gen p1 1 0)。然后,无论电机往哪个方向走,第二秒钟都是给电机发送 50 信号(mov 50 p1, slp 1)。做完以上事情后,跳回到第 4 行(jmp 4)继续判断当前位置是否等于目标位置。只要尚未到达目标位置,就重复做以上事情,直到到达目标位置为止。

下方的芯片做的事情就比较简单了:

首先从 C2S-RF901 读入队列中的首数字(mov x0 acc),检查首数字是否为 -999(tcp acc -999)。若不为 -999,说明收到了一个长度为 3 的数据包。首数字表示的是当前电机应该到达的位置,将该位置通过 x1 口发给上面的芯片(+ mov acc x1),然后等待上面的芯片给自己发送完成信号(+ slx x1)。收到完成信号后,我们读入队列中的第二个表示清洁时长的数字,并给【清洁工具】端口发送这么长时间的 100 信号(+ gen p1 x0 x1。注意这里不能写成 + gen p1 x0 0,因为我们必须要把上方芯片发来的数字 0 给接收掉,否则会导致运行时阻塞。所以这里必须读入 x1 口发来的常数 0,而不能直接写常数 0)。接着,我们读入队列中的第三个表示加液时长的数字,并给【加液工具】端口发送这么长时间的 100 信号(+ gen p0 x0 0)。做完以上操作后,或一开始收到的首数字为 -999 时,休眠一秒(slp 1),进入下一个机器周期。

点击左下角的【模拟】,稍等片刻,便会弹出结算界面:

优化电量

下方的 MC4000 里的 gen 指令出现了 0 秒的睡眠时长,最后的 + gen p0 x0 0 和 slp 1 两条指令等价于下面的指令组合:

+ mov 100 p0

+ slp x0

+ mov 0 p0

+ slp 0

slp 1

究其原因,slp 1 是一条共享指令。如果我们把上方的 tcp 判断改成 tcp acc -1,然后将最后的 slp 1 改成读到 -999 时独享的 - slp 1 指令,那么我们就能将上方的 + slp 0 改成 + slp 1 了,这样就能节省掉 slp 0 导致的无效电量消耗。于是代码变成了下面这样:

+ mov 100 p0

+ slp x0

+ mov 0 p0

+ slp 1

- slp 1

以上代码可以化简为:

+ gen p0 x0 1

- slp 1

由于去掉了无效的 slp 0,所以电量由 209 降低到了 206。

评论 (0)

相关阅读
网友评论0条评论

上拉或点击查看更多