最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

【深圳 IO 攻略】第 9 關(guān):無線游戲控制器

2022-06-01 13:47 作者:ココアお姉ちゃん  | 我要投稿

本文首發(fā)于 B 站《深圳 IO》文集(https://www.bilibili.com/read/readlist/rl569860)。原創(chuàng)不易,轉(zhuǎn)載請注明出處。

關(guān)卡展示

這一關(guān)我們需要在收到 rx 口的 -1 信號時,向 tx 口傳送長度為 3 的數(shù)據(jù)包。

數(shù)據(jù)包的第一個數(shù)字為當前的 X 坐標;

數(shù)據(jù)包的第二個數(shù)字為當前的 Y 坐標;

數(shù)據(jù)包的第三個數(shù)字根據(jù)以下規(guī)則生成:

到這一關(guān)時,我有必要提一個之前一直被忽略的概念:p?口和 x 口的區(qū)別。我們的 MC 系列芯片有兩種通訊端口,簡單口(包括 p0、p1 兩個口,簡稱 p 口)和擴展口(MC4000 有 x0、x1 兩個口,MC6000 則還有額外的 x2、x3 兩個口,簡稱 x 口)。p 口只能和外部的簡單 I/O 端口或者另一塊芯片的 p 口通訊,同樣地,x 口只能和外部的復雜端口(帶黃色三角形符號的端口)或者另一塊芯片的 x 口通訊。只有 DX-300 這塊芯片可以轉(zhuǎn)換數(shù)據(jù)的通訊類型,它可以將至多 3 個只提供 0/100 信號的 p 口數(shù)據(jù)轉(zhuǎn)換為一個三位數(shù)的 x 口數(shù)據(jù),或者將一個從 x 口傳來的三位數(shù)按照規(guī)則依次給最多三個 p 口設(shè)置 0/100 信號。如果要給 p 口設(shè)置其余的數(shù)字,那就只能通過 p 口設(shè)置,無法通過 x 口 + DX-300 這樣的組合來設(shè)置。

說完了 p 口和 x 口的通訊方式,以及兩種口如何相互轉(zhuǎn)換外,我們來談?wù)剝煞N口在數(shù)據(jù)傳輸上有什么區(qū)別:

  1. p 口傳輸?shù)氖请娖叫盘?,范圍僅限 0~100。如果給 p 口傳輸超過上/下限的值,那么對應的 p 口只能接收到正好位于上/下限的值。x 口傳輸?shù)氖菙?shù)字信號,能傳輸 -999~+999 范圍內(nèi)的數(shù)據(jù)。

  2. p 口在一個時鐘周期內(nèi)只能傳一個數(shù),如果多次傳輸,則僅最后一次傳輸?shù)闹涤行?。x 口則可以傳遞任意長度的數(shù)據(jù)。

  3. 與第二條對應的是,p 口在同一個時鐘周期內(nèi)可以反復讀取,而 x 口因為可以傳遞任意長度的數(shù)據(jù),所以數(shù)據(jù)包里的每個數(shù)字都只能讀一次。即使數(shù)據(jù)包里只有一個數(shù)字,也依然只能讀一次,不能像 p 口那樣反復讀。

  4. 除 DX-300 及前兩關(guān)里出現(xiàn)的?C2S-RF901 元件外,所有 x 口的數(shù)據(jù)采用同步協(xié)議傳輸。在同一個時鐘周期里,必須要有一個 x 口發(fā)送數(shù)據(jù),同時有另一個 x 口接收數(shù)據(jù),且接收和發(fā)送的數(shù)據(jù)包長度一致時,這一次 x 口的通訊才算成功。如果在同一個時鐘周期內(nèi),出現(xiàn)了一方發(fā)送另一方卻不接收,或者一方接收另一方卻不發(fā)送的情況,就會導致線程阻塞。

如圖所示:

當然這一關(guān)的重點不在于“同步通訊”。這一關(guān)我們只需要知道 x 口如何在一秒鐘內(nèi)傳輸多個數(shù)就可以了。電路圖和代碼如下:

首先我們檢測 rx 口是否大于 -999(tcp x0 -999)。如果滿足條件,激活 + 號指令。但由于內(nèi)部仍有更細致的判斷,所以不滿足條件時需要同時關(guān)閉 + - 前綴的指令,直接跳到最后休眠(slp 1)。如果這里的判斷改用 tgt 的話,那么當讀入 -999 時會錯誤地激活第 5 行指令,向 tx 發(fā)送本不該發(fā)送的數(shù)據(jù)包。tcp?指令相較于其他三種比較指令,多了一個“在特定條件下同時關(guān)閉 + - 前綴指令”的功能,可以讓我們在書寫邏輯嵌套代碼時更加得心應手。這就是我為什么在遇到判斷時喜歡優(yōu)先用 tcp 指令的原因。

當我們讀入的 rx 數(shù)據(jù)大于 -999(即為 -1)時,我們需要按照規(guī)則,依次發(fā)送 X 坐標(+ mov p1 x1)、Y 坐標(+ mov p0 x1),以及由 a b 的值計算出來的一個 0~3 范圍內(nèi)的值。因為一塊芯片只有兩個 p 口,所以 a, b 這兩個口不得不使用 DX-300 轉(zhuǎn)換成 x 口信號,接到 MC6000 的 x3 口上。由于 a 口和 DX-300 的 p0 相連,b 口和 DX-300 的 p1 相連,所以 a 口影響個位數(shù),b 口影響十位數(shù)。a b 口的數(shù)據(jù)經(jīng)過 DX-300 轉(zhuǎn)換后的數(shù)字如下表所示:

我們可以發(fā)現(xiàn),當 DX-300 為一位數(shù)時,output 和 DX-300 一致;當 DX-300 為兩位數(shù)時,output = DX-300 - 8。我們下面的這段代碼就完成了先計算出放在數(shù)據(jù)包里的值,然后發(fā)送給 tx,這樣的任務(wù)。

點擊左下角的【模擬】,稍等片刻,便會彈出結(jié)算界面:

優(yōu)化代碼行數(shù)

我們可以通過列數(shù)學公式的方式將 9 行代碼減少到 8 行代碼?,F(xiàn)在觀察這張表:

我們不難發(fā)現(xiàn)因變量 output 和自變量 a b 之間滿足如下等式關(guān)系:

然后我們又知道神奇的 DX-300 可以把一個只提供 0 和 100 信號的 p 口信號縮小 10 倍(變成 0/10)甚至 100 倍(變成 0/1)輸出出來。設(shè)兩個口縮小 100 倍后的信號為 a' 和 b',那么我們現(xiàn)在只要給 a 口和 b 口各配一個 DX-300,把它們的信號縮小 100 倍后,計算 2b' + a' 的值,發(fā)送到 tx 即可。

這次的設(shè)計方案里,前三行代碼和上一個方案完全一樣,重點在于后面的代碼。

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

這三行代碼就是用于計算 2b' + a' 的值的。計算完成后,將計算后的值發(fā)送給 tx(+ mov acc x1)就完成了一個數(shù)據(jù)包的發(fā)送。

我們通過列數(shù)學公式的辦法,將代碼行數(shù)減少到了 8 行。

【深圳 IO 攻略】第 9 關(guān):無線游戲控制器的評論 (共 條)

分享到微博請遵守國家法律
连城县| 犍为县| 宾阳县| 开远市| 北票市| 健康| 金山区| 潼南县| 贵德县| 赤壁市| 津南区| 湟源县| 鄂伦春自治旗| 丹棱县| 重庆市| 五家渠市| 纳雍县| 墨玉县| 玉门市| 安顺市| 浪卡子县| 青州市| 北辰区| 凌海市| 乌兰县| 奉贤区| 太仆寺旗| 文成县| 崇左市| 武邑县| 德化县| 泸州市| 太仆寺旗| 宜宾县| 孟津县| 道孚县| 大港区| 武城县| 本溪市| 华池县| 阿拉善右旗|