电玩圈游戏网 搜一搜

安卓手游去频道 >

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

安卓应用去频道 >

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

游戏视频去频道 >

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

资讯攻略去频道 >

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

专题合集去频道 >

游戏专题 应用专题

排行榜单去频道 >

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

首页>资讯>游戏攻略>深圳SHENZHENIO第8关仿真蜂鸣器攻略

深圳SHENZHENIO第8关仿真蜂鸣器攻略

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

深圳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)

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

上拉或点击查看更多