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

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

【深圳 IO 攻略】第 8 關(guān):仿真蜂鳴器

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

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

關(guān)卡展示

本關(guān)要求當(dāng)用戶發(fā)送 1 信號(hào)時(shí)生成不間斷的方波脈沖,直到用戶發(fā)送 0 信號(hào)為止。

這一關(guān)我們接觸到了一個(gè)新的元件:C2S-RF901。它有如下特點(diǎn):

  • 和簡(jiǎn)單 IO 口每秒鐘只能表示一個(gè)數(shù)據(jù)不同,這個(gè)元件可以存儲(chǔ)大量數(shù)據(jù),并且采用 FIFO(First In First Out,先進(jìn)先出)的隊(duì)列模式存儲(chǔ)。

  • 和簡(jiǎn)單 IO 口可以在同一秒內(nèi)反復(fù)讀取數(shù)據(jù)值不同,這個(gè)元件中的每個(gè)數(shù)據(jù)都只能被讀取一次。簡(jiǎn)單 IO 口的數(shù)據(jù)在同一個(gè)時(shí)鐘周期內(nèi)可以反復(fù)讀取,但也因此導(dǎo)致“一旦錯(cuò)過就不再”,下一秒鐘就不能再讀取上一秒中的數(shù)據(jù)了。

  • 任何時(shí)候,當(dāng)你讀取這個(gè)元件中的數(shù)據(jù)時(shí),這個(gè)元件會(huì)將實(shí)時(shí)的【隊(duì)頭】元素返回給你。如果隊(duì)列里沒有數(shù)據(jù),這個(gè)元件會(huì)返回給你一個(gè) -999 的值。

那么這道題其實(shí)和第三題【脈沖發(fā)生器】有點(diǎn)類似,唯一的不同是輸入源產(chǎn)生了變化。第三題的脈沖發(fā)生器讀取的是實(shí)時(shí)的按鈕狀態(tài),而這一題讀取的是隊(duì)列里隊(duì)頭的狀態(tài)(有可能不是實(shí)時(shí)的狀態(tài))。因此存在這樣一種可能:實(shí)時(shí)狀態(tài)是 -999,但是從隊(duì)列里讀取到了前一秒緩存下來的 0。所以我們?nèi)匀豢梢苑判牡厥褂?gen 來生成耗時(shí) 2 秒的方波脈沖,不用害怕在脈沖發(fā)生的第一秒鐘來了個(gè)停止信號(hào),然后下一秒錯(cuò)過該信號(hào)。如果輸入源改為由簡(jiǎn)單 IO 口提供的?0/100 的按鈕信號(hào),那么就不能這樣做了,必須每秒鐘監(jiān)視,否則就存在上面說的“一旦錯(cuò)過就不再”的可能性,錯(cuò)過用戶發(fā)出的停止信號(hào)。

這道題的電路板和代碼如下:

這里我們接觸了一條新的指令:取反指令 not。這條指令不需要提供任何額外的操作數(shù),它的作用是:若 acc 的值為 0,則將 acc 改寫為 100;若 acc 的值不為 0,則將 acc 改寫為 0。

這道題我們用了和上一題類似的想法:用 acc 寄存器記錄蜂鳴器的開/關(guān)狀態(tài)。

首先我們從?C2S-RF901 里讀取值,判斷其是 -999(無數(shù)據(jù))還是 0、1(有數(shù)據(jù)),也就是將讀出來的數(shù)據(jù)和 -1 比大?。╰cp x0 -1)。我們發(fā)現(xiàn),這個(gè)元件里提供的數(shù)據(jù)永遠(yuǎn)是 1、0 交替的,而且永遠(yuǎn)是以 1 開頭。所以我們不需要判斷具體的值是 0 還是 1,而是只要有數(shù)據(jù),就反轉(zhuǎn) acc 寄存器(+ not)。另外,當(dāng)讀取到 -999(無數(shù)據(jù))時(shí),不對(duì) acc 寄存器做任何操作,維持原狀。

經(jīng)過以上操作后,我們判斷?acc 的值是?0 還是 100,然后分別做出不同的操作(tcp acc 50)。acc 的值為 100 時(shí),我們生成一個(gè) 2 秒的方波(+ gen p1 1 1);acc 的值為 0 時(shí),我們只需要待命,等待蜂鳴器開啟即可(- slp 1)。

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

優(yōu)化電量

巧用測(cè)試指令,將蜂鳴器開啟/關(guān)閉的邏輯代碼分布在 +/- 代碼塊中,代替 acc 寄存器記錄蜂鳴器的開關(guān)狀態(tài),可以省去“修改并判定 acc 的值”的過程,達(dá)到節(jié)省電量的目的。具體代碼如下:

我們將蜂鳴器關(guān)閉的代碼寫在 - 代碼塊里,將蜂鳴器開啟的代碼寫在 + 代碼塊里。由于芯片通電時(shí) +/- 號(hào)前綴的指令都不會(huì)被激活,所以初始化時(shí)我們需要執(zhí)行一條測(cè)試指令以便激活一個(gè)代碼塊。第一個(gè)時(shí)鐘周期里,我們檢測(cè)數(shù)據(jù)包里是否有數(shù)據(jù)(@ tcp x0 -1),沒有數(shù)據(jù)時(shí)保持關(guān)閉狀態(tài),激活 - 前綴的指令;有數(shù)據(jù)時(shí)開啟蜂鳴器,激活 + 前綴的指令。

當(dāng)蜂鳴器處于關(guān)閉狀態(tài)時(shí),我們正常休眠(- slp 1),到達(dá)下一個(gè)時(shí)鐘周期后,如果讀到的是 -999,則保持 - 號(hào)激活;讀到了非負(fù)數(shù),則啟動(dòng)蜂鳴器,改為 + 激活。第三行的?- tcp x0 -1 完成的就是這樣的任務(wù),讀到 -999 時(shí),因?yàn)?-999 < -1,所以激活 - 號(hào)指令;讀到 1 時(shí),因?yàn)?1 > -1,所以激活 + 號(hào)指令。

當(dāng)蜂鳴器處于開啟狀態(tài)時(shí),我們生成脈沖信號(hào)(+ gen p1 1 1)后,如果讀到的是 -999,則保持 + 號(hào)激活;讀到了非負(fù)數(shù),則關(guān)閉蜂鳴器,改為 - 激活。此時(shí)同樣是跟 -1 比較,但激活的符號(hào)和上面正好相反,我們的測(cè)試指令的兩個(gè)操作數(shù)也換了位置:+ tcp -1 x0。讀到 -999 時(shí),因?yàn)?-1 > -999,所以激活 + 號(hào)指令;讀到 0 時(shí),因?yàn)?-1 < 0,所以激活 - 號(hào)指令。

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

由于不再使用 acc 寄存器存儲(chǔ)蜂鳴器的開/關(guān)狀態(tài),電量從 146 降低到了 110,同時(shí)其余兩項(xiàng)開銷也沒有任何增加。

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

和第 3 關(guān)類似,此題也可以得出結(jié)論【執(zhí)行到 slp 1 時(shí),p1 的值一定是 0,因此 slp 1 可以用 gen p1 0 1 來替換】。我們知道,not 指令是讓 acc 在 0 和 100 之間轉(zhuǎn)換,現(xiàn)在我們需要讓 acc 在 0 和 1 之間轉(zhuǎn)換。注意到:

  • 1 - 0 = 1

  • 1 - 1 = 0

所以我們只需要用 1 減去原先的 acc,就能讓 acc 的值在 0 和 1 之間翻轉(zhuǎn)一次。當(dāng)然深圳 IO 里,一切數(shù)學(xué)計(jì)算都要求第一個(gè)操作數(shù)是 acc 自己,而減法不滿足交換律,所以你沒法直接計(jì)算 1 - acc。不過我們可以曲線救國(guó),改成滿足交換律的加法,也就是 -acc + 1。

代碼如下,請(qǐng)讀者嘗試自行解讀,我不再重復(fù)闡述。如果看不懂,請(qǐng)回去閱讀第 3 關(guān)的【優(yōu)化代碼行數(shù)】一節(jié)。

最終的三項(xiàng)指標(biāo)為:成本 ¥4,電量 186,代碼行數(shù) 4(比歷史最佳少了 1 行)


【深圳 IO 攻略】第 8 關(guān):仿真蜂鳴器的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
长子县| 宁化县| 乌兰浩特市| 育儿| 四子王旗| 惠来县| 调兵山市| 永清县| 彩票| 眉山市| 日土县| 赫章县| 镇巴县| 宁明县| 含山县| 左云县| 同心县| 平罗县| 城步| 沙湾县| 温宿县| 密山市| 改则县| 桃园县| 鹤庆县| 丰县| 类乌齐县| 苏州市| 长丰县| 岑巩县| 芜湖市| 庐江县| 瑞安市| 两当县| 新兴县| 子洲县| 尚义县| 宁陵县| 南充市| 宝丰县| 梅河口市|