at91rm9200啟動過程教程 系統上電,檢測BMS,選擇系統的啟動方式,如果BMS為高電平,則系統從片內ROM啟動。AT91RM9200的ROM上電后被映射到了0x0和0x100000處,在這兩個地址處都可以訪問到ROM。由于9200的ROM中固化了一個BOOTLOAER程序。所以PC從0X0處開始執行這個BOOTLOAER(準確的說應該是一級BOOTLOADER)。這個BOOTLOER依次完成以下步驟: 1、PLL SETUP,設置PLLB產生48M時鐘頻率提供給USB DEVICE。同時DEBUG USART也被初始化為48M的時鐘頻率; 2、相應模式下的堆棧設置; 3、檢測主時鐘源(Main oscillator); 4、中斷控制器(AIC)的設置; 5、C 變量的初始化; 6、跳到主函數。 完成以上步驟后,我們可以認為BOOT過程結束,接下來的就是LOADER的過程,或者也可以認為是裝載二級BOOTLOER。AT91RM9200按照DATAFLASH、EEPROM、連接在外部總線上的8位并行FLASH的順序依次來找合法的BOOT程序。所謂合法的指的是在這些存儲設備的開始地址處連續的存放的32個字節,也就是8條指令必須是跳轉指令或者裝載PC的指令,其實這樣規定就是把這8條指令當作是異常向量表來處理。必須注意的是第6條指令要包含將要裝載的映像的大小。關于如何計算和寫這條指令可以參考用戶手冊。一旦合法的映像找到之后,則BOOT程序會把找到的映像搬到SRAM中去,所以映像的大小是非常有限的,不能超過16K-3K的大小。當BOOT程序完成了把合法的映像搬到SRAM的任務以后,接下來就進行存儲器的REMAP,經過REMAP之后,SRAM從映設前的0X200000地址處被映設到了0X0地址并且程序從0X0處開始執行。而ROM這時只能在0X100000這個地址處看到了。至此9200就算完成了一種形式的啟動過程。如果BOOT程序在以上所列的幾種存儲設備中找到合法的映像,則自動初始化DEBUG USART口和USB DEVICE口以準備從外部載入映像。對DEBUG口的初始化包括設置參數115200 8 N 1以及運行XMODEM協議。對USB DEVICE進行初始化以及運行DFU協議。現在用戶可以從外部(假定為PC平臺)載入你的映像了。在PC平臺下,以WIN2000為例,你可以用超級終端來完成這個功能,但是還是要注意你的映像的大小不能超過13K。一旦正確從外部裝載了映像,接下來的過程就是和前面一樣重映設然后執行映像了。我們上面講了BMS為高電平,AT91RM9200選擇從片內的ROM啟動的一個過程。如果BMS為低電平,則AT91RM9200會從片外的FLASH啟動,這時片外的FLASH的起始地址就是0X0了,接下來的過程和片內啟動的過程是一樣的,只不過這時就需要自己寫啟動代碼了,至于怎么寫,大致的內容和ROM的BOOT差不多,不同的硬件設計可能有不一樣的地方,但基本的都是一樣的。由于片外FLASH可以設計的大,所以這里編寫的BOOTLOADER可以一步到位,也就是說不用像片內啟動可能需要BOOT好幾級了,目前AT91RM9200上使用較多的bootloer是u-boot,這是一個開放源代碼的軟件,用戶可以自由下載并根據自己的應用配置。總的說來,筆者以為AT91RM9200的啟動過程比較簡單,ATMEL的服務也不錯,不但提供了片內啟動的功能,還提供了UBOOT可供下載。筆者寫了一個BOOTLODER從片外的FLASHA啟動,效果還可以。 uboot結構與使用uboot是一個龐大的公開源碼的軟件。他支持一些系列的arm體系,包含常見的外設的驅動,是一個功能強大的板極支持包。其代碼可以 http://sourceforge.net/projects/u-boot下載 在9200上,為了啟動uboot,還有兩個boot軟件包,分別是loader和boot。分別完成從sram和flash中的一級boot。其源碼可以從atmel的官方網站下載。 我們知道,當9200系統上電后,如果bms為高電平,則系統從片內rom啟動,這時rom中固化的boot程序初始化了debug口并向其發送'c',這時我們打開超級終端會看到ccccc...。這說明系統已經啟動,同時xmodem協議已經啟動,用戶可以通過超級終端下載用戶的bootloader。作為第一步,我們下載loader.bin.loader.bin將被下載到片內的sram中。這個loder完成的功能主要是初始化時鐘,sdram和xmodem協議,為下載和啟動uboot做準備。當下載了loader.bin后,超級終端會繼續打印:ccccc....。這時我們就可以下在uboot了。uboot將被下載到sdram中的一個地址后并把pc指針調到此處開始執行uboot。接著我們就可以在終端上看到uboot的shell啟動了,提示符uboot>,用戶可以uboot>help 看到命令列表和大概的功能。uboot的命令包含了對內存、flash、網絡、系統啟動等一些命令。 如果系統上電時bms為低電平,則系統從片外的flash啟動。為了從片外的flash啟動uboot,我們必須把boot.bin放到0x0地址出,使得從flash啟動后首先執行boot.bin,而要少些boot.bin,就要先完成上面我們講的那些步驟,首先開始從片內rom啟動uboot。然后再利用uboot的功能完成把boot.bin和uboot.gz燒寫到flash中的目的,假如我們已經啟動了uboot,可以這樣操作: uboot>protect off all uboot>erase all uboot>loadb 20000000 uboot>cp.b 20000000 10000000 5fff uboot>loadb 21000000 uboot>cp.b 210000000 10010000 ffff 然后系統復位,就可以看到系統先啟動boot,然后解壓縮uboot.gz,然后啟動uboot。注意,這里uboot必須壓縮成.gz文件,否則會出錯。 怎么編譯這三個源碼包呢,首先要建立一個arm的交叉編譯環境,關于如何建立,此處不予說明。建立好了以后,分別解壓源碼包,然后修改Makefile中的編譯器項目,正確填寫你的編譯器的所在路徑。 對loader和boot,直接make。對uboot,第一步:make_at91rm9200dk,第二步:make。這樣就會在當前目錄下分別生成*.bin文件,對于uboot.bin,我們還要壓縮成.gz文件。 也許有的人對loader和boot搞不清楚為什么要兩個,有什么區別嗎?首先有區別,boot主要完成從flash中啟動uboot的功能,他要對uboot的壓縮文件進行解壓,除此之外,他和loader并無大的區別,你可以把boot理解為在loader的基礎上加入了解壓縮.gz的功能而已。所以這兩個并無多大的本質不同,只是他們的使命不同而已。 特別說名的是這三個軟件包都是開放源碼的,所以用戶可以根據自己的系統的情況修改和配置以及裁減,打造屬于自己系統的bootloder。
上傳時間: 2013-10-27
上傳用戶:wsf950131
2.1將n個人圍成一圈,m為未進入游戲前的先行碼,用來淘汰第一個出 局的人,然后依次給出淘汰者的密碼,根據輸入的密碼來確定下一個淘汰是哪一個,并依次輸出被淘汰的人對應的號碼。 2.2用單向循環鏈表實現操作。
標簽: 2.1
上傳時間: 2013-12-25
上傳用戶:xuanchangri
二分圖是一個無向圖,它的n 個頂點可二分為集合A和集合B,且同一集合中的任意兩個頂點在圖中無邊相連(即任何一條邊都是一個頂點在集合A中,另一個在集合B中)。當且僅當B中的每個頂點至少與A中一個頂點相連時,A的一個子集A 覆蓋集合B(或簡單地說,A 是一個覆蓋)。覆蓋A 的大小即為A 中的頂點數目。當且僅當A 是覆蓋B的子集中最小的時,A 為最小覆蓋。
上傳時間: 2015-05-07
上傳用戶:alan-ee
實現背包問題 package problem 1. 問題描述 假設有一個能裝入總體積為T的背包和n件體積分別為w1 , w2 , … , wn 的物品,能否從n件物品中挑選若干件恰好裝滿背包,即使w1 +w2 + … + wn=T,要求找出所有滿足上述條件的解。例如:當T=10,各件物品的體積{1,8,4,3,5,2}時,可找到下列4組解: (1,4,3,2)、(1,4,5)、(8,2)、(3,5,2)。 2. 基本要求 讀入T、n、w1 , w2 , … , wn 3.提示: 可利用遞歸方法:若選中w1 則問題變成在w2 , … , wn 中挑選若干件使得其重量之和為T- w1 ,若不選中w1,則問題變成在w2 , … , wn 中挑選若干件使得其重量之和為T 。依次類推。 也可利用回溯法的設計思想來解決背包問題。首先將物品排成一列,然后順序選取物品裝入背包,假設已選取了前i 件物品之后背包還沒有裝滿,則繼續選取第i+1件物品,若該件物品“太大”不能裝入,則棄之而繼續選取下一件,直至背包裝滿為止。但如果在剩余的物品中找不到合適的物品以填滿背包,則說明“剛剛”裝入背包的那件物品“不合適”,應將它取出“棄之一邊”,繼續再從“它之后”的物品中選取,如此重復,,直至求得滿足條件的解,或者無解。 注:沒壓縮密碼
上傳時間: 2014-01-18
上傳用戶:yxgi5
停車場是一條可以停放n輛車的狹窄通道,且只有一個大門汽車停放安到達時間的先后依次由北向南排列(大門在最南端,最先到達的第一輛車停在最北端)若停車場已經停滿n輛車,后來的汽車在便道上等候,一旦有車開走,排在便道上的第一輛車可以開入;當停車場的某輛車要離開時,停在他后面的車要先后退為他讓路,等它開出后其他車在按照原次序開入車場,每兩停在車場的車要安時間長短繳費。 要求:以棧模擬停車場,以隊列車場外的便道,按照從終端輸入的數據序列進行模擬管理。每一組數據包括三個數據項:汽車“到達”或“離去”信息、汽車牌照號碼、以及到達或離去的時刻。對每一組數據進行操作后的信息為:若是車輛到達,則輸出汽車在停車場的內或便道上的位置:若是車輛離去則輸出汽車在停車場內的停留時間和應繳納的費用(在便道上的停留時間不收費)。棧以順序結構實現,隊列以鏈表結構實現。
標簽: 停車場
上傳時間: 2014-01-25
上傳用戶:hanli8870
前 言 軟件質量是被大多數程序員掛在嘴上而不是放在心上的東西! 除了完全外行和真正的編程高手外,初讀本書,你最先的感受將是驚慌:“哇!我以前捏造的C++/C程序怎么會有那么多的毛病?” 別難過,作者只不過比你早幾年、多幾次驚慌而已。 請花一兩個小時認真閱讀這本百頁經書,你將會獲益匪淺,這是前面N-1個讀者的建議。
上傳時間: 2013-12-18
上傳用戶:zhuoying119
[問題描述] 將N個關鍵字去整數的記錄進行整序, 以使所有關鍵字為非負數的記錄排在關鍵字為負數的記錄之前,要求使用最少的附加空間,且算法的時間復雜度為O(N) [輸入] 待排序記錄個數,各關鍵字的值。 [輸出] 關鍵字從正負分開,正數在前 [存儲結構] 待排序記錄順序存儲。 [算法的基本思想] 快速排序算法每次任取一個記錄的關鍵字為標準,將其余記錄分為兩組將,N個關鍵字去整數的記錄進行整序, 以使所有關鍵字為非負數的記錄排在關鍵字為負數的記錄之前。 #include <iostream> using namespace std #define MAXNUM 100//設文件的最長可能長度 void sort(int* keys, const int len)//排序
上傳時間: 2014-01-13
上傳用戶:aig85
面 向 綜 合 網 絡 的 JAIN API 將 業 務 便 捷 性、 網 絡 匯 聚 以 及 安 全 的 網 絡 接 入 帶 給 電 話 和 數 據 網 絡。JAIN 技 術 為 公 共 交 換 電 話 網 (PSTN)、IP 網 和 無 線 網 的 業 務 創 建 提 供 了 新 水 平 的 抽 象 能 力 及 相 關 的 Java 接 口, 使 IP 與 IN (智 能 網) 的 整 合 成 為 可 能。 這 被 成 為 綜 合 網。 由 于 JAIN API 包 含 對 網 絡 內 部 資 源 的 安 全 接 入, 這 就 創 造 了 推 出 成 千 上 萬 新 業 務 的 機 遇, 超 越 當 前 實 現 的 數 十 種 業 務
上傳時間: 2013-12-22
上傳用戶:wang0123456789
參加運動會的n個學校編號為1~n。比賽分成m個男子項目和w個女子項目,項目編號分別為1~m和m+1~m+w。由于各項參加人數差別較大,有些項目取前五名,得分順序為7,5,3,2,1 還有些項目只取前三名,得分順序為5,..
上傳時間: 2015-12-20
上傳用戶:ljt101007
[問題描述]: 設停車場是一個可停放n輛汽車的狹長通道,且只有一個大門可供汽車進出。汽車在停車場內按車輛到達時間的先后順序,依次由北向南排列(大門在最南端,最先到達的第一輛車停放在車場的最北端),若車場內已停滿n輛汽車,則后來的汽車只能在門外的便道上等待,一旦有車開走,則排在便道上的第一輛車即可開入;當停車場內某輛車要離開時,在它之后進入的車輛必須先退出車場為它讓路,待該輛車開出大門外,其他車輛再按原次序進入車場,每輛停放在車場的車在它離開停車場時必須按它停留的時間長短交納費用。試為停車場編制按上述要求進行管理的模擬程序。
上傳時間: 2013-12-25
上傳用戶:xsnjzljj