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

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

【深圳 IO 攻略】隱藏關(guān)第 1 關(guān):宣傳片

2022-07-04 13:27 作者:ココアお姉ちゃん  | 我要投稿

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

點(diǎn)擊主頁(yè)上的【控制面板】,在【謎題檔案】欄里輸入數(shù)字 0451,打開(kāi)隱藏關(guān)第 1 關(guān)《深圳 IO 宣傳片》。

本關(guān)需要按照時(shí)序圖的要求,根據(jù)階段 1~4 的波形信號(hào)向顯示器發(fā)送相應(yīng)的數(shù)字信號(hào)。

乍一看,這關(guān)有四路 p 輸入,我們想當(dāng)然會(huì)以為至少要兩塊芯片才能搞定。但其實(shí),這四路輸入中的前三路里,任何一路出現(xiàn)了非 0 信號(hào)時(shí),另兩路信號(hào)都一定是 0。因此我們可以將前三路信號(hào)合并成一路信號(hào)。

我在《番外篇:早期謎題的極致優(yōu)化方案》里說(shuō)過(guò):

有多個(gè)信號(hào)同時(shí)接在同一個(gè)【只寫(xiě)】p 口時(shí),大的電平信號(hào)會(huì)覆蓋小的電平信號(hào),最終輸出的電平值是所有輸出信號(hào)中的最大值。 作者:ココアお姉ちゃん https://www.bilibili.com/read/cv17173760 出處:bilibili

這一點(diǎn)對(duì)于【只讀】p 口也同樣適用,當(dāng)我們的芯片的 p 口同時(shí)連接了多個(gè)外部輸入源時(shí),我們從該 p 口讀到的值為本秒內(nèi)這些外部輸入源中的最大值。本關(guān)我們可以利用這個(gè)特性,將階段 1~3 的三路信號(hào)同時(shí)接在 MC6000 芯片的 p1?口上,就能成功將階段 1~3 三路輸入合并為一路輸入。剩下的階段 4,很自然地就接到了 p0 口上。如圖所示:

這里我皮了一下,畫(huà)了兩個(gè) SZIO(深圳 IO 的首字母)的字符畫(huà)。嗯,你要認(rèn)為是數(shù)字 5210 也行……接線上可以看出來(lái),階段 1~3 的信號(hào)最終都會(huì)流向 p1,而階段 4 的信號(hào)最終會(huì)流向 p0。

我們來(lái)對(duì)比一下合并前和合并后的時(shí)序圖:

(合并前)
(合并后,毫無(wú) PS 痕跡)

當(dāng)我們將階段 1~3 三路輸入信號(hào)合并后,我們發(fā)現(xiàn)了這樣一條規(guī)律:合并輸入出現(xiàn)上升沿信號(hào)時(shí),將 acc +1 并發(fā)送給顯示器;合并輸入出現(xiàn)下降沿信號(hào),且?acc 為 2 時(shí),向顯示器發(fā)送 -1、-2。階段 4 比較簡(jiǎn)單,檢測(cè)到 100 信號(hào)后就向顯示器發(fā)送 +15、-15 的閃爍信號(hào)即可,無(wú)需檢測(cè) 0 信號(hào)?,F(xiàn)在的思路就很明確了,我們寫(xiě)下這樣的代碼:

本芯片的 dat 寄存器用于存儲(chǔ)上一秒鐘的合并輸入的值,以便和本秒的信號(hào)值做比較,進(jìn)而檢測(cè)上升沿和下降沿信號(hào)。首先,比較本秒和前一秒的合并信號(hào)的差值(tcp p1 dat)。差值為正時(shí),說(shuō)明出現(xiàn)了上升沿信號(hào)。我們首先將新的信號(hào)值存入 dat 供下一秒使用(+ mov p1 dat),然后按照計(jì)劃,將 acc +1 后發(fā)送給顯示器(+ add 1, + mov acc x3)。差值為負(fù)時(shí),說(shuō)明出現(xiàn)了下降沿信號(hào)。此時(shí)也需要將新的信號(hào)值存入 dat 供下一秒使用(- mov p1 dat)。僅當(dāng)出現(xiàn)下降沿時(shí) acc < 3(- tcp acc 3),才能向顯示器發(fā)送 -1 和 -2(- mov -1 x3, - mov -2 x3)。階段 2 的 100 和 0 反復(fù)橫跳的過(guò)程里也會(huì)產(chǎn)生下降沿信號(hào),那時(shí)候 acc ≥ 3,不可以向顯示器發(fā)送 -1 和 -2。

當(dāng)合并輸入沒(méi)有產(chǎn)生上升沿或下降沿信號(hào)時(shí),我們需要檢查階段 4 的輸入信號(hào)是否為 100(tcp p0 0)。當(dāng)階段 4 的信號(hào)為 0 時(shí),我們關(guān)閉所有的 + - 號(hào)指令,直接跳到最后睡覺(jué)(slp 1);而當(dāng)階段 4 的信號(hào)為 100 時(shí),我們需要向顯示器發(fā)送一組?+15、-15 的閃爍信號(hào)(+ mov 15 x3, + slp 1, + mov -15 x3, slp 1),兩秒后回到第 9 行繼續(xù)判斷。

點(diǎn)擊左下角的【模擬】,運(yùn)行程序,會(huì)發(fā)現(xiàn)我們的 SZIO 形狀的導(dǎo)線會(huì)跟隨著顯示器畫(huà)面的變化同步閃爍,非常漂亮:

稍等片刻,便會(huì)彈出結(jié)算界面:

優(yōu)化電量

第一版方案其實(shí)是最省成本和代碼行數(shù)的方案,一塊芯片就把四路輸出全搞定了。如果我們土豪一點(diǎn),四路輸出用四塊芯片分別完成,那就有足夠的代碼空間來(lái)打磨細(xì)節(jié),節(jié)省出不少的電量。省(tu)電(hao)版的電路圖和代碼如下:

階段 1~4 的輸入信號(hào)依次和右上、左上、右下、左下的芯片的 p0 口相連接,因此右上、左上、右下、左下的芯片依次是 1 號(hào)、2 號(hào)、3 號(hào)、4 號(hào)芯片。

經(jīng)測(cè)試,80 個(gè)測(cè)試樣例里,階段 1 的上升沿信號(hào)最早在第 2 秒鐘出現(xiàn),階段 2 的上升沿信號(hào)最早在第 15 秒鐘出現(xiàn),階段 3 的上升沿信號(hào)最早在第 36 秒鐘出現(xiàn),階段 4 的上升沿信號(hào)最早在第 47 秒鐘出現(xiàn)。因此,這幾個(gè)階段的上升沿信號(hào)來(lái)臨前都可以保持為睡眠狀態(tài),以節(jié)省電量。

先看右上方的 1 號(hào)芯片。首先睡 1 秒(slp 1),然后檢查是否有上升/下降沿信號(hào)出現(xiàn)(tcp p0 dat)。沒(méi)有時(shí),關(guān)閉一切 + - 號(hào)指令,直接跳回第一行睡覺(jué)。出現(xiàn)上升沿信號(hào)后,將本秒的信號(hào)值送入 dat 以便下一秒接著檢測(cè)上升/下降沿信號(hào)(+ mov p0 dat),然后將 acc +1 后發(fā)送給顯示器(+ add 1, + mov acc x2)。經(jīng)測(cè)試,階段 1 的兩個(gè)相鄰的上升/下降沿信號(hào)間至少間隔?5?秒,在此期間可以安心睡覺(jué)(+ slp 4,然后跳到開(kāi)頭執(zhí)行 slp 1)。出現(xiàn)下降沿信號(hào)后,直接向顯示器發(fā)送 -1 和 -2(- mov -1 x2, - mov -2 x2),然后階段 1 就結(jié)束了,可以永久睡眠了(- slp 999)。

然后是左上方的 2 號(hào)芯片。階段 2 的前 14 秒內(nèi)都不會(huì)出現(xiàn)上升沿信號(hào),所以前 14 秒內(nèi)可以安心睡覺(jué)(@ slp 14)。因?yàn)殡A段 2 要給顯示器發(fā)送 3~11 的數(shù)字,所以睡醒后,我們給 acc 賦上 3 的初值(@ mov 3 acc)。其后,若尚未檢測(cè)到 100 信號(hào)(tcp p0 0),就關(guān)閉所有 + - 號(hào)指令,直接跳到最后一行睡覺(jué)。一旦檢測(cè)到 100 信號(hào),我們就把 acc 的值發(fā)給顯示器(+ mov acc x1, + slp 1)。此時(shí)檢查剛才發(fā)的數(shù)是否是 11(teq acc 11)。若不是 11,則將 acc +1,休眠 1 秒進(jìn)入下一個(gè)時(shí)鐘周期后繼續(xù)發(fā)(- add 1, slp 1),直到 acc 加到 11 為止。當(dāng) acc 加到 11 后,階段 2 就結(jié)束了,可以永久睡眠了(+ slp 999)。

接下來(lái)是右下方的 3 號(hào)芯片。階段 3 的前 35 秒內(nèi)都不會(huì)出現(xiàn)上升沿信號(hào),所以前 35 秒內(nèi)可以安心睡覺(jué)(@ slp 35)。因?yàn)殡A段 3 要給顯示器發(fā)送 12~14 的數(shù)字,所以睡醒后,我們給 acc 賦上 12 的初值(@ mov 12 acc)。其后,檢查本秒內(nèi)是否出現(xiàn)了上升沿信號(hào)(tcp p0 dat)。未出現(xiàn)時(shí),什么都不用做,關(guān)閉所有 + - 號(hào)指令,直接跳到最后一行睡覺(jué)。出現(xiàn)上升沿信號(hào)后,將本秒的信號(hào)值送入 dat 以便下一秒接著檢測(cè)上升/下降沿信號(hào)(+ mov p0 dat),然后將?acc 的值發(fā)送給顯示器。(+ mov acc x3)。經(jīng)測(cè)試,階段 3 的兩個(gè)相鄰的上升/下降沿信號(hào)間至少間隔 2?秒,在此期間可以安心睡覺(jué)(+ slp 1,最后一行還有一個(gè) slp 1)。至此,我們檢測(cè)前一個(gè)發(fā)給顯示器的值是不是 14(+ teq acc 14)。當(dāng)前一個(gè)發(fā)送的值不是 14 時(shí),說(shuō)明階段 3 尚未結(jié)束,將 acc +1 后,回到第三行繼續(xù)檢測(cè)上升/下降沿信號(hào)(- add 1)。當(dāng)前一個(gè)發(fā)送的值是 14 時(shí),階段 3 就結(jié)束了,可以永久睡眠了(+?slp 999)。

最后是左下方的 4 號(hào)芯片。經(jīng)測(cè)試,階段 4 永遠(yuǎn)是在第 47 秒啟動(dòng),所以前 46 秒可以安心睡覺(jué)(@ slp 46)。階段 4 一定是在第 47 秒啟動(dòng),但不一定是在第 60 秒結(jié)束。所以啟動(dòng)后,我們每向顯示器發(fā)送一次 +15、-15 的閃爍信號(hào)(mov 15 x1, slp 1, mov -15 x1, slp 1),就要檢查一下階段 4 是不是結(jié)束了(teq p0 0)。如果階段 4 的輸入信號(hào)沒(méi)有在發(fā)完閃爍信號(hào)后回到 100,就說(shuō)明階段 4 結(jié)束了,就該睡覺(jué)了,不能再向顯示器發(fā)送閃爍信號(hào)了(+ slp 999)。

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

我們花了 16 塊錢(qián),在兩塊 MC4000、兩塊?MC6000 上寫(xiě)了多達(dá) 35 行的代碼,壕無(wú)人性地將電量消耗減少到了 157。

【深圳 IO 攻略】隱藏關(guān)第 1 關(guān):宣傳片的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
定安县| 南昌市| 西畴县| 来凤县| 罗定市| 安仁县| 许昌县| 灵璧县| 讷河市| 任丘市| 巴楚县| 阿拉善左旗| 罗源县| 富锦市| 大宁县| 承德市| 浪卡子县| 镇康县| 宣恩县| 奈曼旗| 耿马| 博野县| 宜宾县| 温州市| 哈密市| 咸阳市| 南丰县| 玛沁县| 噶尔县| 泰宁县| 青龙| 比如县| 金寨县| 昌都县| 达尔| 玉屏| 陆良县| 赞皇县| 玉山县| 南充市| 九龙城区|