Linux如何運行于8位AVR微控制器?
更新記錄2
太平洋夏令時(PDT),2012年4月3日凌晨1點:上傳了新的源代碼存檔;使用內存的FPM(Fast Page Mode,快頁模式)模式和修改后的i-cache(指令緩存)配置文件加快了仿真器頻率(6.5KHz->10KHz);更新了移植指南,包括內核鏡像、新的更小的ramdisk(虛擬磁盤)和新的完整鏡像。
更新記錄1
太平洋夏令時(PDT),2012年3月29日晚19點:上傳了新的源代碼存檔;修改了Makefile,并且現在包含了一個移植指南,它可以幫助您將它移植到其他的開發板或CPU中。
簡介
我們經常可以看到初學者在微控制器論壇中詢問他們是否可以在他們微不足道的小的8位微機中運行Linux。這些問題的結果通常是帶來笑聲。我們也經常看到,在Linux論壇中,詢問Linux運行的最低要求是什么。常見的答案是Linux需要一個32位架構和一個MMU(存儲器管理單元),并至少1MB的RAM來滿足內核的需求。本項旨在(并且成功)粉碎這些概念。下圖中您所看到的開發板基于ATmega1284P。我還制作了一塊基于ATmega644a的開發板,也同樣獲得了成功。該開發板沒有使用其他處理器,啟動Linux 2.6.34內核。事實上,它甚至可以運行一個完整的Ubuntu棧,包括X(如果你有時間等它啟動)和gnome。
RAM(隨即存取存儲器)
是的,沒錯,完整的Linux安裝需要數兆字節的RAM和32位帶有MMU的CPU。本項目擁有這一切。首先,讓我們訪問RAM。正如您所看到的,在電路中有一塊古董級的30引腳SIMM內存模塊。這些是基于80286的PC曾經使用的。它通過接口和ATmega連接,我寫代碼來訪問它并按照規格刷新它(SDRAM需要恒定速率刷新以避免丟失數據)。它到底有多快呢?刷新中斷每62ms發生一次,占用時間1.5ms,因此占用3%以下的CPU。訪問RAM,為了便于編程,一次訪問一個字節。這樣產生的最大帶寬約為300KBps。
存儲
對于RAM需要工作在休眠狀態,我們有兩件事要處理。存儲并不是太難解決的問題。使用SPI可以十分容易的與SD卡交互,我的項目中做到了這一點。一個1GB的SD卡可以工作的很好,雖然512MB就已經滿足這一特殊的文件系統(Ubuntu Jaunty)。ATmega擁有一個硬件SPI模塊,但無論出于何種原因,它工作的不是十分順暢,因此我將這個接口進行位拆裂。它仍然足夠塊——大約200KBps。這對項目來說還非常有意義——它能夠在有足夠管腳的任何微控制器上實現,而不用使用其他硬件模塊。
CPU(中央處理單元)
所有剩下的就是那個32位CPU和MMU需求。不過AVR沒有MMU,并且它是8位的。為了克服這一困難,我編寫了一款ARM仿真器。ARM是我最熟悉的架構,并且它足夠簡單,可以讓我很舒服的為它編寫出一個仿真器。為什么要編寫一個,而不是移植一個呢?好吧,移植別人的代碼是沒有樂趣的,再加上我看到沒有將仿真器輕松移植到8位設備上的書面資料。原因之一:AVR編譯器堅持16位處理整數將會給你帶來麻煩,如簡單的“(120)”,產生0。你需要用“1UL20”。不必要的說,困擾其他人的未知基本代碼尋遍所有的地方,整數都被假定并將會失敗,這將是一個災難。另外,我想用這個機會編寫一款很好的模塊化ARM仿真器。所以我付諸行動。
其他功能
電路板通過一個串行端口和真實世界進行通信。目前,它通過串行端口連接到我PC運行的minicom上,但是它可測的替代連接是連接到電路上的一個鍵盤和一個字符LCD,可以使其完全獨立。電路板上還有兩個LED。它們指示SD卡的訪問情況。一個代表讀操作,一個代表寫操作。電路板上還有一個按鈕。當按下并按住1秒時它將使串行端口脫離仿真的CPU的當前有效速度。AVR的主頻是24MHz(超過原有20MHz的輕微超頻)。
linux操作系統文章專題:linux操作系統詳解(linux不再難懂)
評論