|
|
本帖最后由 egypt 于 2020-5-21 09:37 編輯
從題主給的代碼,無法看出 “切換的內(nèi)容有5項”,所以只能從別的角度來分析
首先假設(shè)一個 main 中主邏輯循環(huán)長這樣
main ()
{
InitHardware(); // 硬件初始化
while(1)
{ GetKey(); // 掃描按鍵函數(shù)
ProcessKey(); // 根據(jù)按鍵設(shè)定標(biāo)志函數(shù)
DoDisplay(); // 根據(jù)標(biāo)志進(jìn)行顯示函數(shù)
.... // 此處為 delay 或者其它功能性的函數(shù)
}
}
這個流程簡單說,像 獲取消息事件 → 分揀處理消息事件并生成內(nèi)部標(biāo)志 → 根據(jù)內(nèi)部標(biāo)志執(zhí)行對應(yīng)動作
回過來說題主的代碼, 假設(shè) GetKey / ProcessKey / DoDisplay 函數(shù)都是只耗費(fèi) 【1毫秒】的代碼, 那么 GetKey 哪怕寫在 DoDisplay() 里頭都沒問題(代價是:可讀性、可維護(hù)性就非常差了。一點(diǎn)都不模塊化);
但是,大部分情況下 DoDisplay() 函數(shù)的耗時,經(jīng)常是一個不定的,而且很大的值。可以設(shè)想一下,假設(shè) DoDisplay() 這個函數(shù)耗費(fèi) 10秒 才結(jié)束,那么跑完一次外圍 while 循環(huán),就得 10秒,衍生為,讀取按鍵就變成 10秒讀取一次,或者說按鍵要按住 10秒才能讓邏輯循環(huán)往下走一輪(從題主開頭的表述就是,一直按著按鍵,一直顯示的內(nèi)容停止,松開按鍵才能切換)……
常見改法是,要確保 GetKey / ProcessKey 有機(jī)會被執(zhí)行和【設(shè)置標(biāo)志】。這也是題主提及的,【定義一個切換標(biāo)志位】的核心意思了。至于 GetKey 在 中斷上 或者 輪詢 等機(jī)制,或者說 DoDisplay 需要分拆為片段等【比方說每顯示一行字就為一個片段?】,留待題主自己根據(jù)項目復(fù)雜度去評估了【其實(shí)有些機(jī)器在畫面的移動卷屏?xí)r,只是操作顯示緩存,多出來的地方留黑邊。操作緩存的效率可比讀取字模快多了】
|
評分
-
查看全部評分
|