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

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

【深圳 IO 攻略】第 17 關(guān):共生環(huán)境維護(hù)機(jī)器人

2022-06-03 16:31 作者:ココアお姉ちゃん  | 我要投稿

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

關(guān)卡展示

本關(guān)的 C2S-RF901 設(shè)備會(huì)不定期地發(fā)送一些長(zhǎng)度為 3 的數(shù)據(jù)包。第一個(gè)數(shù)字表示需要令電機(jī)移動(dòng)到哪一格,第二個(gè)數(shù)字表示需要清潔的秒數(shù),第三個(gè)數(shù)字表示需要加液的秒數(shù)。

電機(jī)初始位置在第 0 格,電平信號(hào)為 50。如果要讓電機(jī)向左移動(dòng)一格,需要給電機(jī)發(fā)送 0x1s + 50x1s 的脈沖信號(hào);如果要讓電機(jī)向右移動(dòng)一格,需要給電機(jī)發(fā)送 100x1s + 50x1s 的脈沖信號(hào)。

本關(guān)的電機(jī)移動(dòng)較為復(fù)雜,因?yàn)槎嗔?50 這種信號(hào),所以沒(méi)辦法簡(jiǎn)單地用?gen 指令來(lái)生成脈沖信號(hào)了。如果把所有的工作都寫在同一塊芯片里,即使是 MC6000 也很難寫得下。所以我們這里來(lái)嘗試分工,一塊芯片專門用來(lái)處理電機(jī)的移動(dòng)任務(wù),另一塊芯片專門用來(lái)給前面那塊芯片發(fā)送電機(jī)應(yīng)當(dāng)?shù)竭_(dá)的位置,等到達(dá)后再親自處理清潔和加液任務(wù)。

電路圖和代碼如下:

上方芯片做的工作是等待下方芯片傳輸目標(biāo)位置上來(lái),并給電機(jī)發(fā)送脈沖信號(hào)控制電機(jī)移動(dòng)到目標(biāo)位置。上方芯片的 acc 寄存器用于記錄實(shí)時(shí)的電機(jī)位置,初始值為 0;而 dat 寄存器用于接收從下方芯片發(fā)來(lái)的目標(biāo)位置。

首先我們將電機(jī)的電平信號(hào)初始化為 50(mov 50 p1),然后開(kāi)始等待下面的芯片發(fā)送“位置”數(shù)據(jù)(slx x2)。等待到信號(hào)后,我們將電機(jī)的目標(biāo)位置放入 dat 寄存器(mov x2 dat),并檢查電機(jī)的當(dāng)前位置是否已經(jīng)在目標(biāo)位置上(teq dat acc)。如果已經(jīng)在目標(biāo)位置上,則發(fā)送一個(gè)信號(hào)給下面的芯片,告知下面的芯片該清潔和加液了(+ mov?0 x2),同時(shí)開(kāi)始休眠,等待下一個(gè)信號(hào)(+ jmp 2,跳到了第 2 行 slx x2)。如果不在目標(biāo)位置上,則判斷目標(biāo)位置在當(dāng)前位置的左邊還是右邊(tcp dat acc)。如果目標(biāo)位置在電機(jī)的左邊,則令電機(jī)的實(shí)時(shí)位置 -1(- sub 1),同時(shí)給電機(jī)發(fā)送一秒鐘的 0 信號(hào)(- gen p1 0 1)。如果目標(biāo)位置在電機(jī)的右邊,則令電機(jī)的實(shí)時(shí)位置 +1(+ add 1),同時(shí)給電機(jī)發(fā)送一秒鐘的 100 信號(hào)(+ gen p1 1 0)。然后,無(wú)論電機(jī)往哪個(gè)方向走,第二秒鐘都是給電機(jī)發(fā)送 50 信號(hào)(mov 50 p1, slp 1)。做完以上事情后,跳回到第 4 行(jmp 4)繼續(xù)判斷當(dāng)前位置是否等于目標(biāo)位置。只要尚未到達(dá)目標(biāo)位置,就重復(fù)做以上事情,直到到達(dá)目標(biāo)位置為止。

下方的芯片做的事情就比較簡(jiǎn)單了。首先從?C2S-RF901 讀入隊(duì)列中的首數(shù)字(mov x0 acc),檢查首數(shù)字是否為非負(fù)數(shù)(tcp acc -1)。若為非負(fù)數(shù),說(shuō)明收到了一個(gè)長(zhǎng)度為 3 的數(shù)據(jù)包。首數(shù)字表示的是當(dāng)前電機(jī)應(yīng)該到達(dá)的位置,將該位置通過(guò) x1 口發(fā)給上面的芯片(+ mov acc x1),然后等待上面的芯片給自己發(fā)送完成信號(hào)(+ slx x1)。收到完成信號(hào)后,我們讀入隊(duì)列中的第二個(gè)表示清潔時(shí)長(zhǎng)的數(shù)字,并給【清潔工具】端口發(fā)送這么長(zhǎng)時(shí)間的 100 信號(hào)(+ gen p1 x0 x1。注意這里不能寫成 + gen p1 x0 0,因?yàn)槲覀儽仨氁焉戏叫酒l(fā)來(lái)的數(shù)字 0 給接收掉,否則會(huì)導(dǎo)致運(yùn)行時(shí)阻塞。所以這里必須讀入 x1 口發(fā)來(lái)的常數(shù) 0,而不能直接寫常數(shù) 0)。接著,我們讀入隊(duì)列中的第三個(gè)表示加液時(shí)長(zhǎng)的數(shù)字,并給【加液工具】端口發(fā)送這么長(zhǎng)時(shí)間的 100 信號(hào)(+ gen p0 x0 1)。若一開(kāi)始收到的首數(shù)字為 -999 時(shí),只需要休眠一秒(- slp 1),進(jìn)入下一個(gè)機(jī)器周期就行了。

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

關(guān)于循環(huán)的附加知識(shí)

循環(huán)結(jié)構(gòu)有兩種:一種是先執(zhí)行循環(huán)流程,后判斷是否繼續(xù)循環(huán);另一種是像本題一樣的,先判斷是否進(jìn)入循環(huán)流程,再執(zhí)行。區(qū)別在于,前者的循環(huán)流程至少會(huì)執(zhí)行一次,但是少一次跳轉(zhuǎn);后者多一次跳轉(zhuǎn),但是存在一開(kāi)始就不執(zhí)行循環(huán)流程的可能性。兩種循環(huán)的流程圖分別如下:

先執(zhí)行,后判斷的循環(huán),流程至少執(zhí)行一次,但只需要一條跳轉(zhuǎn)指令。
先判斷,后執(zhí)行的循環(huán),不滿足條件時(shí)要跳轉(zhuǎn)到循環(huán)流程的下面,循環(huán)流程完成一次后要跳轉(zhuǎn)到上方繼續(xù)判斷條件,一共需要兩條跳轉(zhuǎn)指令。只有存在【條件一開(kāi)始就不滿足】的可能性時(shí),使用該循環(huán)結(jié)構(gòu)才有意義。

曾經(jīng)的謎題里,我們用的都是前者。但是在本題里,我們使用了后者。注意一下我在解析代碼時(shí)說(shuō)的這段話:

等待到信號(hào)后,我們將電機(jī)的目標(biāo)位置放入 dat 寄存器(mov x2 dat),并檢查電機(jī)的當(dāng)前位置是否已經(jīng)在目標(biāo)位置上(teq dat acc)。如果已經(jīng)在目標(biāo)位置上,則發(fā)送一個(gè)信號(hào)給下面的芯片,告知下面的芯片該清潔和加液了(+ mov?0 x2),同時(shí)開(kāi)始休眠,等待下一個(gè)信號(hào)(+ jmp 2,跳到了第 2 行 slx x2)。如果不在目標(biāo)位置上,則判斷目標(biāo)位置在當(dāng)前位置的左邊還是右邊(tcp dat acc)。

得到目標(biāo)位置后,因?yàn)榇嬖凇倦姍C(jī)已經(jīng)在目標(biāo)位置上,不需要移動(dòng)】的可能性,所以存在一次循環(huán)流程都不用執(zhí)行的可能性。所以我們必須先判斷 acc 是否和 dat 相等(teq dat acc),相等時(shí)直接回傳 0 并跳到第 2 行,跳到循環(huán)體外面(+ mov 0 x2, + jmp 2)。第 7~14 行是循環(huán)體里要執(zhí)行的部分,然后第 14 行是一條曾經(jīng)從未見(jiàn)過(guò)的【無(wú)條件跳轉(zhuǎn)】指令,即不帶 + - 號(hào)的 jmp 指令(jmp 4)。我們觀察后一張流程圖,的確就是在循環(huán)執(zhí)行完畢后,【無(wú)條件】跳轉(zhuǎn)到循環(huán)入口處去重新判定條件。本題的 MC6000 代碼里,使用了典型的【先判斷,后執(zhí)行】的循環(huán)結(jié)構(gòu)。

【先判斷,后執(zhí)行】需要多一行跳轉(zhuǎn)指令,而深圳 I/O 里,一塊芯片最多 14 行代碼,代碼行數(shù)是極其珍貴的資源。所以后一種循環(huán)結(jié)構(gòu),只能是【存在一次都不執(zhí)行循環(huán)流程的可能性】,迫不得已時(shí)才會(huì)去使用。

【深圳 IO 攻略】第 17 關(guān):共生環(huán)境維護(hù)機(jī)器人的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
敦煌市| 永平县| 县级市| 都安| 金山区| 威信县| 通许县| 甘孜县| 广灵县| 济源市| 峨山| 东乌珠穆沁旗| 栖霞市| 乌兰察布市| 边坝县| 旬邑县| 淅川县| 苏尼特右旗| 东山县| 无极县| 东海县| 固原市| 衢州市| 海淀区| 朝阳区| 喀什市| 株洲县| 乐陵市| 阜康市| 布拖县| 营山县| 昭觉县| 江津市| 满洲里市| 日照市| 盈江县| 翼城县| 溆浦县| 祥云县| 芜湖县| 鄂尔多斯市|