第6章 實現乙個不太精確的延遲函式

2021-05-25 18:54:23 字數 1041 閱讀 2635

那麼怎麼知道這個間隔時間呢,書上說得很清楚,這裡就不再贅述了,我們需要做的就是先決定我們想要的間隔時間,比如說10毫秒,那麼就拿計算機的輸入頻率除以10,得到填充到8253的count0暫存器的值,確定相應的模式,填充進去就好。具體填充的指令字和埠號看書就好,懶得在這裡囉嗦。在init_pcb中新增配置8253的**吧:

code:

out_byte(0x43,0x34);   

out_byte(0x40,(u16)(1193182l / 100));   

out_byte(0x40,(u16)((1193182l / 100) >> 8));  

code:

void milli_delay(u32 milli_sec)   

}  別忘了在proto.h中加入相應的宣告:

code:

void milli_delay(u32 milli_sec);  

最後讓這個新新增的函式來取代我們原來的delay函式:

code:

void proc_a()   

}   

void proc_b()   

}  

由圖看出,發生了很多次中斷重入,由於現在從程序進入到核心態只有兩種方式,一種是時鐘中斷,一種就是get_ticks系統呼叫,由於我們已經禁止了時鐘中斷自身的重入,那麼惟一可能發生的重入就是進行系統呼叫的過程發生了時鐘中斷,我們已經做了相應的措施來應付重入,因此不用多慮。

還有乙個問題就是這個新的延遲函式還不夠精確,比如上圖的前四行,b0x01和b0x65之間差了0x64,剛好就是100,這就很精確了。但a0x00和a0x6d差了6d,多延遲了90ms。其中有多程序的原因,來看圖分析,當發生了0x64次時鐘中斷時,cpu的控制權在程序b中,程序a還沒能從milli_delay中返回而跳回去列印當前的ticks。另外,呼叫disp_color_str函式中也有可能發生時鐘中斷,從而也造成一些延遲。那我們就把程序的數量減為1,同時把發生時鐘中斷列印星號以及發生中斷重入列印感嘆號的語句注釋掉,結果如圖所示:

大約1秒鐘列印一次,每次間隔正好為0x64。

元件設計系列 實現乙個支援非同步和延遲任務的執行緒

執行緒是乙個很簡單的,今天本文將實現一種支援非同步任務新增和延遲任務的執行緒類,開啟乙個執行緒後,可以往裡面持續新增非同步任務,任務序列執行,且執行順序與新增順序一致。支援新增延時任務。任務可以是業務方的任意函式 通過bind function實現 當然了,稍加改造,還可以支援定時任務的實現。同時,...

排序優化 如何實現乙個通用的 高效能的排序函式?

1.排序演算法一覽表 2.為什選擇快速排序?1 線性排序時間複雜度很低但使用場景特殊,如果要寫乙個通用排序函式,不能選擇線性排序。2 為了兼顧任意規模資料的排序,一般會首選時間複雜度為o nlogn 的排序演算法來實現排序函式。3 同為o nlogn 的快排和歸併排序相比,歸併排序不是原地排序演算法...

排序優化 如何實現乙個通用的 高效能的排序函式?

1 三數取中法 我們從區間的首 尾 中間,分別取出乙個數,然後對比大小,取這 3 個數的中間值作為分割槽點。這樣每間隔某個固定的長度,取資料出來比較,將中間值作為分割槽點的分割槽演算法,肯定要比單純取某乙個資料更好。但是,如果要排序的陣列比較大,那 三數取中 可能就不夠了,可能要 五數取中 或者 十...