一、一些想法
一直以來,linux被認為是個32位的「現代化」作業系統,一般也沒有人在8位、16位微控制器上面去移植linux。但是,從原理上來講,從任意位數的微控制器,都是可以執行linux的——本質上就是個作業系統麼,既然ucos可以,為什麼linux不行?
於是,我的畢業設計打算做這個選題。當然,雖然從原理上來講是可行的,但是在實際中遇到了乙個非常大的困難,那就是底層的**量改動非常大。並且linux體系中涉及到很多32位的東西,比如mmu。
後來就萌發了另外乙個思路:作為uclinux而言,本身是為了不支援mmu的微控制器而設計的,可以考慮移植uclinux到16位微控制器上面。同時,linux的早期版本,對ram和flash的要求都比較小,因此考慮移植早期版本的uclinux。
二、新的思路及其價值
但是今天又在google上面搜尋,突然見到了如下的文章:
這篇文章是用8位微控制器來啟動ubuntu,並且發表時間也比較新(**最後修改是在3.22號,最近的**更新是在4.3號)。其參考價值在於,作者並沒有採用傳統的「移植」的方法,來將linux的核心直接搬到8位的微控制器上面,而是通過加入了乙個中間層的方法——首先,作者在8位微控制器上面實現了乙個arm模擬器,模擬出來乙個arm環境;其次,將linux核心在模擬的arm環境中進行了執行。其巧妙之處在於,避開了複雜的移植過程(以及16位和32位的相容性問題),將工作主要集中在如何在8位微控制器上模擬32位的微控制器(並且模擬了諸如mmu、dma等系統模組,以及uart等外設)。那麼這樣的工作還有另外乙個重要的價值:在要求不高的情況下,我們可以採用更廉價、更低端的微控制器(16位微控制器、廉價的32位微控制器)來模擬高階的微控制器(arm9系列等等)。
三、新思路的具體實現方案
實際上從原理上來講,這種思路的實現也很簡單。不考慮外設(當然部分外設也可以模擬,比如模擬iic,模擬spi)的情況下,實際上微控制器內部就是①指令集②暫存器。
首先來說暫存器。實際上32位的微控制器,其暫存器都是32位的。同時,每個微控制器的核心暫存器就那麼幾個(比如8086,就是ax bx cx dx,還有ds ss sp等等)。既然是暫存器,那麼對於8位微控制器來說,32位的暫存器不就是4個暫存器連線起來麼?不就相當於乙個結構體(或者是陣列)麼?因此,我們的模擬器可以考慮用一系列的結構體來模擬32位微控制器的內部暫存器。
再來說指令集。不同微控制器之間的指令集是不同的,這個道理顯而易見(同時,這個也是阻礙linux或者其他作業系統移植的最大的因素,因為移植linux的話最難的部分就在於底層彙編的編寫)。但是,組合語言的本質是什麼?實際上就是機器語言的一種表現形式。那麼機器語言是什麼?不就是0和1麼。話又說回來,所有的c語言的程式,最終都需要轉化成機器語言才能夠執行——也就是說,c語言和機器語言是對應的。那麼,如果我手頭有乙個arm編譯出來的程式,那麼肯定全部是機器語言,由0和1組成。如果我知道arm系列每個機器語言的含義,並且對這個編譯出來的程式進行解碼,那麼就能得到對應的每一句的組合語言(這也就是所謂的反編譯)。那麼,如果我們在8位微控制器的程式中,首先讀出arm編譯出來的程式中每一句機器指令,然後加以解析,並且將這個機器指令對應的操作進行實現——
那麼我們不就通過程式,來完成了arm微控制器中cpu的功能麼?那麼,這樣我們實際上就通過8位微控制器上面的程式,完成了32位命令的解析,也就完成了乙個arm模擬器的工作的大部分。
當然,除了上述兩項,還有就是linux執行畢竟還是需要一定量的ram和外設,因此我們還要再加入一些外部ram和flash,這些方案沒有什麼難度,就只是工作量的問題啦。
四、一點展望
剛才那篇文件的作者,已經實現了armv5te指令集的模擬,也就是arm9微控制器的核心,但是他是啟動的ubuntu系統,比較複雜,而且核心啟動也比較麻煩(模組較多)。事實上,我們完全可以通過這樣乙個系統來啟動我們嵌入式的核心,大小在幾m級別而已,如果精簡一下的話,啟動會更迅速,也會更具有實用價值。
51微控制器上移植C語言的printf
移植了c語言的printf 函式到51微控制器上,實現了在51微控制器的串列埠類pc端的printf 輸出。在專案工程中新增xxprintf.h和xxprintf.c檔案 在專案中需要使用xxprintf 函式的地方引入標頭檔案xxprintf.h,在xxprintf.h中引入微控制器相關標頭檔案 ...
UCOS學習筆記 在51微控制器上移植UCOS
作業系統是一種與硬體 處理器 相關的軟體,根據某一種處理器設計的作業系統一般是不能再其他種類的處理器上執行的。若要在其他處理器上執行該作業系統,必須對作業系統進行相應的改造,即所謂作業系統的移植。一.ucos移植的一般性問題 1.可重入函式 在多工的作業系統中,系統提供的函式可以被多個任務呼叫,而不...
8位微控制器 16位 32位區別
8位微控制器 16位 32位區別?指cpu處理的資料的寬度,參與運算的暫存器的資料長度.如果匯流排寬度與cpu一次處理的資料寬度相同,則這個寬度就是所說的微控制器位數。如果匯流排寬度與cpu一次處理的資料寬度不同 1 匯流排寬度小於cpu一次處理的資料寬度,則以cpu的資料寬度定義微控制器的位數,但...