從裸機到作業系統

2021-08-03 14:47:51 字數 1167 閱讀 6960

開始學習微控制器那是大二時候的事了,當時最為困惑的是為什麼主函式中要是乙個while(1),在windows下寫c語言程式不就是主函式裡面直接寫,到最後return 0不就完了麼。到後來隨著學習的深入,漸漸明白,微控制器下的程式可以認為是乙個單執行緒的程式,只能在這個超級迴圈中往復的執行,最多加一些中斷,處理一些非同步事件,組成前後臺系統,就這樣一直幸福的在while(1)中做了一些事情,如下面的實現乙個led小燈以間隔500ms閃爍,多麼令人愉快的事情啊。

while(1)

直到某一天,當我再次的加入乙個led小燈,想實現兩個燈分別以500ms和300ms的間隔依次閃爍的時候,我困惑了,這可怎麼辦?噢,有定時器麼,在定時器中斷中實現小燈的閃爍不就完了,如下:

while(1)

/* 定時器中斷處理函式,500ms執行一次 */

void led0_handler(void)

else

}/* 定時器中斷處理函式,300ms執行一次 */

void led1_handler(void)

else

}

但似乎又有一些問題,你讓我的while(1)幹什麼,呆呆的在那看著,我的定時器就那麼幾個,你讓小燈都用了,其他裝置用什麼啊,可不可以就在while(1)裡面幹活,不要讓它們 占用我寶貴的定時器資源了。想想辦法,那這樣吧,狀態機或許是一種不錯的解決方案。

int count0 = 500;

int count1 = 300;

int sta = 4;

int last_sta0 = 0;

int last_sta1 = 0;

while(1)

if(count1 == 0)

break;

default:break;

}}

很顯然,沒有用定時器並且全部在while(1)中實現,但是只有兩個燈,如果5個8個豈不是邏輯特別混亂,還怎麼讓人看**呀。並且這種方式存在乙個弊端,定時時間並不完全準確,需要準確的測量case 4的間隔時間,如果又有一些中斷事件的話那就造成了時間的不確定性。

基於以上種種問題,終於發現在裸機下有些問題解決起來真是費勁,但不用怕,問題都是先發現後解決,不過早已有人替我們解決了這些問題,試試作業系統怎麼樣?或許會讓你一下子豁然開朗,體驗到飛一般的感覺。

作業系統與裸機的區別

我們在學習stm32到一定階段可能會了解作業系統,然後便有這種問題產生,下面我就來粗略說說 作業系統與裸機的區別,以及stm32能執行什麼作業系統,能執行linux系統嗎 等問題。作業系統與裸機的區別 裸機執行的程式 一般由乙個main函式中的while死迴圈和各種中斷服務程式組成,平時cpu執行w...

作業系統 再識 Linux從檔案到字元裝置

在 dev下面有很多裝置,其中也有大家廣為使用的字元裝置,呢裡面的檔案是如何與字元裝置掛鉤的呢 平時我們使用的open函式是如何動態載入字元裝置的操作集的呢 下面就讓我們慢慢剖析 以核心2.6.26為參考 一.首先是檔案系統 需要動態解析檔案路徑名 像 dev ts0 在檔案系統裡分為3個部分 1....

基於作業系統程式設計與裸機程式設計的區別

因為學的是控制,剛開始的時候玩的微控制器比較多,微控制器進行開發的乙個重要的特點就是裸機程式設計。也就是說核心跑的完完全全是你的 但是在作業系統上程式設計就完全不一樣,因為你的程式大部分都在呼叫作業系統的介面函式,從而間接的管理硬體。作業系統搭好了框架,實現硬體抽象,檔案儲存管理,程序管理,本質上就...