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

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

【深圳 IO 攻略】阿瓦隆城第 3 關(guān):喂貓機(jī)

2022-06-27 17:40 作者:ココアお姉ちゃん  | 我要投稿

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

關(guān)卡展示

本關(guān)的要求如下:

  1. 【標(biāo)簽閱讀器】會(huì)不定期地發(fā)送單數(shù)字的數(shù)據(jù)包,可能是 1、2、3 中的一個(gè)。當(dāng)【標(biāo)簽閱讀器】發(fā)送數(shù)據(jù)包時(shí),表示需要讓機(jī)器給對(duì)應(yīng)號(hào)碼的小貓喂食。

  2. 給 X 號(hào)貓喂食時(shí),需要一次投喂【數(shù)量 X】份【型號(hào) X】類型的食物,向?qū)?yīng)類型的食物輸出端口發(fā)送時(shí)長 1 秒的脈沖信號(hào),脈沖值號(hào)為該數(shù)量值。投喂完畢后,為了防止貓吃撐,需要確?!緯r(shí)間 X】秒內(nèi)不再給 X 號(hào)貓繼續(xù)喂食,即使收到【標(biāo)簽閱讀器】發(fā)來的喂食信號(hào),也無視。

這一關(guān)我們接觸到了一個(gè)新的元件——開關(guān)元件。這是一個(gè)雙閘開關(guān),它有 A、B 兩個(gè)輸入量,任何時(shí)候,兩個(gè)輸入都一定有一個(gè)激活,有一個(gè)關(guān)閉。如果我們將開關(guān)的 A 口接到芯片的 p?口上,那么從 p?口讀到 100 時(shí)表示開關(guān)接在 A 閘上,讀到 0 時(shí)表示開關(guān)接在 B 閘上;反之亦然,如果我們改為將開關(guān)的 B 口接到芯片的 p?口上,那么從 p?口讀到 100 時(shí)表示開關(guān)接在 B 閘上,讀到 0 時(shí)表示開關(guān)接在 A 閘上。

本關(guān)的常數(shù)芯片的數(shù)量是整個(gè)深圳 IO?的所有謎題之最,一共有 9 塊常數(shù)芯片,這給我們的布線工作造成了很大的阻礙。布線是本關(guān)的最大難點(diǎn),邏輯上反而不復(fù)雜。電路圖和代碼如下:

左下方的芯片是和【標(biāo)簽閱讀器】這個(gè)輸入端口直接連接的芯片,將其視為 0 號(hào)芯片。左上方、中上方和中下方的芯片分別用于接管 1、2、3 號(hào)貓的喂食任務(wù),將它們分別視為 1、2、3 號(hào)芯片。右下角的芯片用于收到信號(hào)時(shí)給相應(yīng)的輸出端口發(fā)送脈沖信號(hào),將它視為 4 號(hào)芯片。

首先,0 號(hào)芯片每個(gè)時(shí)鐘周期里都將【標(biāo)簽閱讀器】的 x 口同步信號(hào)轉(zhuǎn)成 p 口的廣播信號(hào),同時(shí)發(fā)給 3 塊任務(wù)芯片。讀到 -999 時(shí),會(huì)自動(dòng)轉(zhuǎn)成下限值 0(mov x0 p0, slp 1)。為什么要將同步的點(diǎn)對(duì)點(diǎn)信號(hào)轉(zhuǎn)換為非同步的廣播信號(hào)呢?這主要基于以下兩方面考慮:①同步信號(hào)只能被讀取一次,而實(shí)際上每秒鐘 1~3 號(hào)芯片都需要判斷自己是不是來任務(wù)了。轉(zhuǎn)成廣播信號(hào)后,在相同的時(shí)鐘周期里,同樣的數(shù)字能被 3 塊芯片都讀取到;②題目要求喂一次貓后要在一定時(shí)間內(nèi)無視對(duì)同一只貓的喂食請(qǐng)求。無視的最好方法是使用 slp 指令睡眠。而我們觀察時(shí)序圖發(fā)現(xiàn),【標(biāo)簽閱讀器】在無數(shù)據(jù)時(shí)會(huì)讀到 -999。它其實(shí)相當(dāng)于一個(gè) C2S-RF901 元件,也就是只要你不讀數(shù)據(jù),數(shù)據(jù)就會(huì)一直積壓在元件內(nèi)部。我們睡醒以后再去讀數(shù)據(jù),讀到的都是之前積壓的已經(jīng)過時(shí)的【隊(duì)頭】數(shù)據(jù)。

這個(gè)標(biāo)簽閱讀器,我們需要讓多個(gè)芯片在同一秒內(nèi)讀取多次,同時(shí)這幾塊芯片都只關(guān)心當(dāng)下這一秒的數(shù)據(jù),不關(guān)心歷史數(shù)據(jù)。因此,這個(gè)輸入量以 p 口的形式給出才是最合理的??墒穷}目既然沒有以 p 口的形式給出這個(gè)輸入量,我們就只能用 0 號(hào)芯片將其轉(zhuǎn)換成 p 口量了。

1~3 號(hào)芯片的代碼邏輯大同小異,我只挑 1 號(hào)講。首先我們需要空操作一次,等待 0 號(hào)芯片將輸入信號(hào)轉(zhuǎn)換成廣播信號(hào)(nop)。此時(shí)切記不能急于直接讀 p0 口的值,因?yàn)橹苯幼x的話,讀到的是上一秒的數(shù)據(jù)。我們必須要等待一個(gè)機(jī)器周期,讓 0 號(hào)芯片消耗一條指令的時(shí)間,把這一秒的數(shù)據(jù)同步到 p0 口上后,1~3 號(hào)芯片才能正確讀取到本秒 p0 口的值。

等到 0 號(hào)芯片同步完畢后,我們檢查 p0 口是不是 1,也就是是否請(qǐng)求給 1 號(hào)貓喂食(teq p0 1)。如果需要給 1 號(hào)貓喂食,則把食品類型、食品數(shù)量依次發(fā)給右下角的 4 號(hào)芯片,委托它完成喂食任務(wù)(+ mov p1 x3, + mov x0 x3)。委托完成后,休眠【時(shí)間 1】秒,在這些時(shí)間內(nèi),一律不接收 p0 口的實(shí)時(shí)廣播信號(hào),不響應(yīng)任何“給 1 號(hào)貓喂食”的請(qǐng)求(+ slp x1)。如果本秒鐘里 p0 口的值不是 1,也就是沒有請(qǐng)求給 1 號(hào)貓喂食,那么就休眠 1 秒,進(jìn)入下一個(gè)時(shí)鐘周期后,繼續(xù)監(jiān)聽是否要給 1 號(hào)貓喂食(- slp 1)。

2、3 號(hào)芯片的邏輯幾乎完全一致,只是改為了判斷是否要給 2、3 號(hào)貓喂食(teq p0 2/3)。另外,為了布線上的方便,2、3 號(hào)芯片改為用 x1 口和 4 號(hào)芯片相連;常數(shù)芯片的位置也做了調(diào)整,“時(shí)間”芯片移動(dòng)到了各自的 x3 口上,“數(shù)量”芯片移動(dòng)到了各自的 x2 口上,僅僅是“型號(hào)”開關(guān)仍然放在 p1 口上。因此向 4 號(hào)芯片發(fā)送數(shù)據(jù)時(shí),以及休眠時(shí),讀/寫的端口也需要同步進(jìn)行修改(+ mov p1 x1, + mov x3 x1, + slp x2)。

最后是右下角的 4 號(hào)芯片。1~3 號(hào)芯片向 4 號(hào)芯片發(fā)送喂食請(qǐng)求時(shí),一共會(huì)發(fā) 2 個(gè)數(shù)字。先發(fā)送的是食物類型,后發(fā)送的是食物數(shù)量。我們的三個(gè)雙閘開關(guān)都接在了對(duì)應(yīng)芯片右側(cè)的 p1 口上,都選擇了把 A 端和芯片相連。因此,當(dāng) 1~3 號(hào)芯片從 p1 口讀到 100 時(shí),表明需要給自己的貓投喂 A 類型的食物;反之亦然,當(dāng) 1~3 號(hào)芯片從 p1 口讀到 0 時(shí),表明需要給自己的貓投喂 B 類型的食物。

現(xiàn)在來看 4 號(hào)芯片的代碼。首先等待 1~3 號(hào)芯片發(fā)來喚醒信號(hào)(slx x0)。喚醒后,我們收到的第一個(gè)數(shù)字是要投喂的食物類型,100 為 A,0 為 B。判斷第一個(gè)數(shù)字是 0 還是 100,激活對(duì)應(yīng)的 + - 號(hào)指令(tcp x0 50)。判斷完成后,我們需要接收第二個(gè)喂食量的數(shù)字。第一個(gè)數(shù)字是 0 時(shí),我們將該喂食量發(fā)到【食物 B】端口(- mov x0 p0);第一個(gè)數(shù)字是 100 時(shí),我們將該喂食量發(fā)到【食物 A】端口(+ mov x0 p1)。接下來,休眠 1 秒,讓該脈沖信號(hào)生效(slp 1)。1 秒過后,同時(shí)清除兩個(gè)食物端口的信號(hào),完成本次脈沖信號(hào)的發(fā)送(mov p0 p1)。

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

優(yōu)化成本

以上方案里,1~3 號(hào)芯片都只有 6 行代碼,且也沒用到 acc 和 dat 寄存器。只是因?yàn)?2P3X 共 5 個(gè)端口都有導(dǎo)線連接,就不得不使用 MC6000,非??上А,F(xiàn)在我們換一種方案,?1~3 號(hào)芯片改為使用?MC4000,4 號(hào)芯片改為使用?MC6000,然后我們將原先接在 1~3 號(hào)芯片上的“數(shù)量”芯片改接到 4 號(hào)芯片上。給 4 號(hào)芯片發(fā)送數(shù)據(jù)時(shí),之前是發(fā)送食物類型 + 食物數(shù)量,現(xiàn)在改為發(fā)送食物類型 + 貓的編號(hào),由 4 號(hào)芯片通過“三態(tài)判定”的方式計(jì)算數(shù)量是多少。若如此做,我們就會(huì)有兩塊 MC6000 被替換成?MC4000,成本上可以節(jié)省 4 塊錢。電路圖和代碼如下:

因?yàn)槲覀儗蓧K MC6000 換成了 MC4000,整體的占用體積變小了,布局也更加靈活自由了。這次我們將 1~3 號(hào)芯片擺在了同一個(gè)豎排,左邊還用導(dǎo)線擺出了 CAT 的字符畫,比上一個(gè)方案的布局要漂亮多了。

0 號(hào)芯片依然是將【標(biāo)簽閱讀器】的同步信號(hào)轉(zhuǎn)成廣播信號(hào)(mov x0 p1, slp 1)。

然后是 1~3 號(hào)芯片。本方案里,1~3 號(hào)芯片除了判斷語句外,代碼已經(jīng)完全一樣了,因?yàn)槿龎K芯片都統(tǒng)一將 x0 口用作通訊端口、p0 口用作廣播信號(hào)端口、p1 口用作食物類型端口、x1 口用作睡眠時(shí)長端口。首先等待 0 號(hào)芯片將廣播信號(hào)同步完成(nop),然后檢查 p0 口的數(shù)字是不是和自己管理的貓的編號(hào)一致(teq p0 1/2/3)。一致時(shí),依次將當(dāng)前要喂食的貓的編號(hào),以及食物類型發(fā)給 4 號(hào)芯片(+ mov p0 x0, + mov p1 x0),然后休眠 x1 秒,休眠過程中不響應(yīng)任何廣播信號(hào)(+ slp x1)。不一致時(shí),休眠 1 秒,進(jìn)入下一個(gè)時(shí)鐘周期后,繼續(xù)監(jiān)聽是否要給自己的貓喂食(- slp 1)。

最后是 4 號(hào)芯片。首先等待 1~3 號(hào)芯片的喚醒信號(hào)(slx x0)。第一個(gè)數(shù)字是要喂食的貓的編號(hào),我們對(duì)該編號(hào)做三態(tài)判定,向 acc 中存入正確的喂食量(mov x2 acc,?tcp x0 2, - mov x1 acc, + mov x3 acc)。然后我們接收第二個(gè)表示食物類型的數(shù)字,100 為 A,0 為 B(tcp x0 50)。第二個(gè)數(shù)字為 0 時(shí),我們向【食物 B】口投入食物(- mov acc p0),否則向【食物 A】口投(+ mov acc p1)。接下來,休眠 1 秒,讓該脈沖信號(hào)生效(slp 1)。1 秒過后,同時(shí)清除兩個(gè)食物端口的信號(hào),完成本次脈沖信號(hào)的發(fā)送(mov p0 p1)。

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

如此,便將成本壓縮到了 17 塊錢。

【深圳 IO 攻略】阿瓦隆城第 3 關(guān):喂貓機(jī)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
宝鸡市| 湖北省| 亚东县| 泰和县| 如皋市| 孙吴县| 靖边县| 禹城市| 曲阳县| 宁陵县| 平陆县| 扬中市| 叙永县| 陵川县| 抚松县| 德兴市| 高清| 遂川县| 平凉市| 鲁甸县| 阳西县| 孟州市| 扎鲁特旗| 咸宁市| 长兴县| 比如县| 绵竹市| 溧阳市| 广元市| 襄垣县| 宁化县| 蒙阴县| 叶城县| 轮台县| 安乡县| 霍邱县| 嘉鱼县| 无为县| 蒙城县| 株洲县| 烟台市|