电玩圈游戏网 搜一搜

安卓手游去频道 >

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

安卓应用去频道 >

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

游戏视频去频道 >

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

资讯攻略去频道 >

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

专题合集去频道 >

游戏专题 应用专题

排行榜单去频道 >

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

首页>资讯>游戏攻略>深圳SHENZHENIO第30关航空鸡尾酒调酒器攻略

深圳SHENZHENIO第30关航空鸡尾酒调酒器攻略

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

深圳IO是一款硬核的编程游戏,有着严谨的游戏内容,那么一起来看看第30关航空鸡尾酒调酒器的攻略吧。

主界面

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

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

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

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

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

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

第30关:航空鸡尾酒调酒器

关卡展示

本关的【小键盘】会不定期地给出一个 1~7 的按键输入,我们需要根据不同的输入数字调配出不同的饮料。这些饮料的配方请参考数据手册:

小键盘数字和饮料种类的对应关系如下:

1,子弹杯伏特加(伏特加 × 1.5 盎司)

2,柠檬糖(伏特加 × 3 盎司,柠檬配料 × 1 盎司)

3,大都会(伏特加 × 2 盎司,莱姆配料 × 1 盎司,蔓越莓配料 × 1 盎司)

4,寇德角(伏特加 × 2 盎司,蔓越莓配料 × 2 盎司)

5,伏特加马天尼(伏特加 × 3 盎司,干苦艾酒 × 1 盎司)

6,螺丝锥子(杜松子酒 × 3 盎司,莱姆配料 × 1 盎司)

7,杜松子马天尼(杜松子酒 × 3 盎司,干苦艾酒 × 1 盎司)

对每种原材料来说,其 100 信号的持续时间是跟需求量相关的(0.5 盎司/秒)。

这道题很明显是个【打表】题,每一个数字都对应着一个固定的“原材料波形时序图”。我们使用 DX-300 甚至可以控制三个 p 口的时序。这道题需要控制六种原材料,也就是六个 p 口的时序,所以需要使用两块 DX-300。我们先把两块 DX-300 接到电路图上。

上方的 DX-300 控制【伏特加】、【杜松子】和【柠檬】的时序,下方的 DX-300 控制【莱姆】、【蔓越莓】和【苦艾】的时序。我们先看每种饮料和上方的 DX-300 建立出的时序映射关系是怎样的:

1,100 × 3s(伏特加 1.5 盎司)

2,101 × 2s + 100 × 4s(伏特加 3 盎司,柠檬 1 盎司。伏特加和柠檬同时在上方出现,所以该时序由两部分组成。等同于【伏特加 + 柠檬】1 盎司,伏特加 2 盎司)

3,100 × 4s(伏特加 2 盎司)

4,100 × 4s(伏特加 2 盎司)

5,100 × 6s(伏特加 3 盎司)

6,10 × 6s(杜松子酒 3 盎司)

7,10 × 6s(杜松子酒 3 盎司)

再看和下方的 DX-300 建立出的时序映射关系是怎样的:

1,(无)

2,(无)

3,110 × 2s(莱姆配料和蔓越莓配料各 1 盎司)

4,10 × 4s(蔓越莓配料 2 盎司)

5,1 × 2s(干苦艾酒 1 盎司)

6,100 × 2s(莱姆配料 1 盎司)

7,1 × 2s(干苦艾酒 1 盎司)

下方的时序图简单点,都是单一时序,甚至还有两种饮料没有时序。每种饮料的时序和 DX-300 的值及持续睡眠时间两个值相关,所以为了将每种饮料的这两个数字都存储下来,我们需要将小键盘的值乘以 2,得到一个地址,将两个数字放置在以该地址起始的两个连续空间内。然后我们写出下面这样的代码:

我们观察一下这个 ROM,发现 6、7 地址写的是 3 号饮料的配料及持续时长,8、9 地址写的是 4 号饮料的配料及持续时长,依此类推。所有饮料的配料及持续时长都写在饮料编号 ×2 地址起始处的两个连续空间里。

那么我们首先等待小键盘的输入(slx x3),并将小键盘的值乘以 2,得到需要跳转到的 ROM 地址(mov x3 acc, add acc),然后将计算好的地址值发给上方的芯片,以便后续让上方的芯片生成上方三种原料的时序图(mov acc x3)。此时,因为第 1、2 种饮料是不需要生成下方的时序图的,也就是说仅当地址值大于 4 时才需要生成时序图。当地址值大于 4 时(tcp acc 4),我们将 ROM 定位到该地址(+ mov acc x1),然后连续读取原料和持续时长两个值,生成对应的时序图(+ mov x0 x2, + slp x0),完成后将信号清除(+ mov 0 x2)。

现在我们开始生成上方三种原料的时序图,代码如下:

这里我们接触到了一条新指令,也是 MC 系列芯片指令集中的最后一条指令:空操作指令 nop。它的作用是:当前机器周期内不执行任何实际操作。nop 指令和下面这些指令的效果是一样的,都是不造成任何状态变化的指令:

mov acc acc

mov dat dat

mov acc null

mov dat null

mov null null

mul 1

add 0

sub 0

slp 0

jmp (下一行的行标)

空操作指令,既占行数,又费电,最后还不产生任何效果。那么为什么我们需要这样一条空操作指令呢?答案是为了传输上的同步。我们注意到,上方的 x2 口既和小键盘相连,又和下方芯片的 x3 口相连。由于小键盘同样的数字只传一次,所以我们希望的是从 x2 口获得下方芯片传来的数据,而不是获得从小键盘传来的数字。因此,等待唤醒后(slx x2),我们需要执行一次空操作(nop),让小键盘的数字被下方的芯片捕获(上方芯片 nop 时,下方芯片同时执行 mov x3 acc),接下来我们从 x2 口获得的(mov x2 x1)就是由下方芯片传来的地址数据了。如果没有这条空操作指令,每次唤醒后,小键盘的数字会随机被上方/下方的芯片之一接收,导致非预期的运行结果。

我们注意到,第 2 种饮料是特殊的,它的时序由两部分组成:101 × 2s + 100 × 4s。但是我们的 ROM 对于每种饮料都只能存储单一的时序。所以当获得的地址值是 4 时(teq x1 4),我们需要在开头额外执行一个 101 × 2s 的时序(+ mov 101 x3, + slp 2)。剩下的部分,和下面的芯片类似,定位到 ROM 对应的地址,生成时序后(mov x0 x3, slp x0)清除信号(mov 0 x3)。

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

评论 (0)

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

上拉或点击查看更多