电玩圈游戏网 搜一搜

安卓手游去频道 >

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

安卓应用去频道 >

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

游戏视频去频道 >

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

资讯攻略去频道 >

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

专题合集去频道 >

游戏专题 应用专题

排行榜单去频道 >

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

首页>资讯>游戏攻略>深圳SHENZHENIO第9关无线游戏控制器攻略

深圳SHENZHENIO第9关无线游戏控制器攻略

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

深圳IO是一款硬核的编程游戏,有着严谨的游戏内容,那么一起来看看第9关的无线游戏控制器的攻略吧。

主界面

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

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

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

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

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

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

第1关:安全摄像头

第2关:信号放大器

第3关:脉冲发生器

第4关:动画 ESPORTS 标志

第5关:游戏积分器

第6关:调谐最优化引擎

第7关:被动红外感应器

第8关:仿真蜂鸣器

第9关:无线游戏控制器

关卡展示

这一关我们需要在收到 rx 口的 -1 信号时,向 tx 口传送长度为 3 的数据包。

数据包的第一个数字为当前的 X 坐标;

数据包的第二个数字为当前的 Y 坐标;

数据包的第三个数字根据以下规则生成:

到这一关时,我有必要提一个之前一直被忽略的概念:p 口和 x 口的区别。我们的 MC 系列芯片有两种通讯端口,简单口(包括 p0、p1 两个口,简称 p 口)和扩展口(MC4000 有 x0、x1 两个口,MC6000 则还有额外的 x2、x3 两个口,简称 x 口)。p 口只能和外部的简单 I/O 端口或者另一块芯片的 p 口通讯,同样地,x 口只能和外部的 X 端口(带黄色三角形符号的端口)或者另一块芯片的 x 口通讯。只有 DX-300 这块芯片可以转换数据的通讯类型,它可以将至多 3 个只提供 0/100 信号的 p 口数据转换为一个三位数的 x 口数据,或者将一个从 x 口传来的三位数按照规则依次给最多三个 p 口设置 0/100 信号。如果要给 p 口设置其余的数字,那就只能通过 p 口设置,无法通过 x 口 + DX-300 这样的组合来设置。

说完了 p 口和 x 口的通讯方式,以及两种口如何相互转换外,我们来谈谈两种口在数据传输上有什么区别:

1,p 口只能传输 0~100 范围内的数据。如果给 p 口传输超过上/下限的值,那么对应的 p 口只能接收到正好位于上/下限的值。x 口能传输 -999~+999 范围内的数据。

2,p 口在一个时钟周期内只能传一个数,如果多次传输,则仅最后一次传输的值有效。x 口则可以传递任意长度的数据。

3,与第二条对应的是,p 口在同一个时钟周期内可以反复读取,而 x 口因为可以传递任意长度的数据,所以数据包里的每个数字都只能读一次。即使数据包里只有一个数字,也依然只能读一次,不能像 p 口那样反复读。

4,除 DX-300 及前两关里出现的 C2S-RF901 元件外,所有 x 口的数据采用同步协议传输。也就是说,在同一个时钟周期里,必须要有一个 x 口发送数据,同时有另一个 x 口接受数据,且接收和发送的数据包长度一致时,这一次 x 口的通讯才算成功。如果在同一个时钟周期内,出现了一方发送另一方却不接收,或者一方一直在等待接收另一方却迟迟不发送的情况,就会导致线程阻塞。

如图所示:

当然这一关的重点不在于“同步通讯”。这一关我们只需要知道 x 口如何在一秒钟内传输多个数就可以了。电路图和代码如下:

首先我们检测 rx 口是否大于 -999(tcp x0 -999)。如果满足条件,激活 + 号指令。但由于内部仍有更细致的判断,所以不满足条件时需要同时关闭 + - 前缀的指令,直接跳到最后一行 slp 1。如果这里的判断改用 tgt 的话,那么当读入 -999 时会错误地激活第 5 行指令,向 tx 发送本不该发送的数据包。tcp 指令相较于其他三种比较指令,多了一个“在特定条件下同时关闭 + - 前缀指令”的功能,可以让我们在书写逻辑嵌套代码时更加得心应手。这就是我为什么在遇到判断时喜欢优先用 tcp 指令的原因。

当我们读入的 rx 数据大于 -999(即为 -1)时,我们需要按照规则,依次发送 X 坐标(+ mov p1 x1)、Y 坐标(+ mov p0 x1),以及由 a b 的值计算出来的一个 0~3 范围内的值。因为一块芯片只有两个 p 口,所以 a, b 这两个口不得不使用 DX-300 转换成 x 口信号,接到 MC6000 的 x3 口上。由于 a 口和 DX-300 的 p0 相连,b 口和 DX-300 的 p1 相连,所以 a 口影响个位数,b 口影响十位数。a b 口的数据经过 DX-300 转换后的数字如下表所示:

我们可以发现,当 DX-300 为一位数时,output 和 DX-300 一致;当 DX-300 为两位数时,output = DX-300 - 8。我们下面的这段代码就完成了先计算出放在数据包里的值,然后发送给 tx,这样的任务。

+ tcp x3 9 # 测试 DX-300 的值是否大于 9

- mov x3 x1 # DX-300 的值小于 9 时,原样发送给 tx

+ mov x3 acc # DX-300 的值大于 9 时,先发给 acc

+ sub 8 # 然后令 acc -8

+ mov acc x1 # 再将处理后的值发送给 tx

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

优化代码行数

我们可以通过列数学公式的方式将 9 行代码减少到 8 行代码。现在观察这张表:

我们不难发现因变量 output 和自变量 a b 之间满足如下等式关系:

然后我们又知道神奇的 DX-300 可以把一个只提供 0 和 100 信号的 p 口信号缩小 10 倍(变成 0/10)甚至 100 倍(变成 0/1)输出出来。设两个口缩小 100 倍后的信号为 a' 和 b',那么我们现在只要给 a 口和 b 口各配一个 DX-300,把它们的信号缩小 100 倍后,计算 2b' + a' 的值,发送到 tx 即可。

这次的设计方案里,前三行代码和上一个方案完全一样,重点在于后面的代码。

由电路图可知,x2 得到的是 a',x3 得到的是 b'。那么

+ mov x3 acc

+ add x3

+ add x2

这三行代码就是用于计算 2b' + a' 的值的。计算完成后,将计算后的值发送给 tx(+ mov acc x1)就完成了一个数据包的发送。

我们通过列数学公式的办法,将代码行数减少到了 8 行。

评论 (0)

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

上拉或点击查看更多