2011-09-08 35 views
2

我對上電覆位有疑問:重置重置嵌入式系統中發生了什麼?

1.據我所知,微控制器在上電時被硬連線以某些特定存儲位置開始,例如0000H。在0000h,是否寫入中斷服務程序用於復位(初始化堆棧指針和程序計數器等),或者復位地址在0000h(例如7000)出現,以便微控制器在7000地址處跳轉,並且在那裏寫入堆棧和PC的初始化。

2.誰寫這個重置服務程序?它是微控制器芯片(英特爾或微芯片等)的製造商,還是任何程序員都可以更改此重置服務程序(例如,程序員在上電覆位後從7000h將PC更改爲4000h,從而導致從4000獲取第一條指令,而不是7000)。

3.如何將堆棧指針和程序計數器初始化爲相應的初始地址,因爲開機時微控制器不處於將地址放入堆棧指針和程序計數器寄存器的狀態(直到復位服務才完成初始化常規)。

  1. 考慮到所有可能性,重置服務程序中的步驟應該是什麼?

在此先感謝

+1

你想使用特定的芯片或主板?你能指定那個芯片或電路板嗎? –

回答

1

使用控制器/嵌入式系統上完全看。我在遊戲開發中使用的那些IP地址在RAM的起始地址。編譯器提供的引導代碼初始化靜態/常量內存,設置堆棧指針,然後將執行跳轉到某種類型的main()例程。較老的系統也從一個固定的地址開始,但是你必須手動設置堆棧,啓動向量表和其他東西在彙編程序中。起始彙編程序文件的通用名稱是CRT0.s,用於我已完成的工作。

所以1.你是對的。微處理器必須從某個固定地址開始。 2. ISR可由製造商或編譯器創建者提供,或者您可以自己編寫一個,具體取決於所討論系統的複雜程度。 3.堆棧和初始程序員計數器通常通過某種引導程序來處理,這些引導程序通常可以用您自己的代碼覆蓋。往上看。

最後:這些步驟將取決於芯片。如果有任何種類的電源中斷,RAM可能會被加擾,所有的ISR矢量表和啓動代碼應該被重寫,應該運行該應用程序,就好像它剛剛啓動一樣。但是,請閱讀您的文檔!我確信那裏有特定於平臺的東西,會針對您的具體情況回答這些問題。

2

處理器內核通常具有您所說的某種表的起始地址,或者是地址列表或者像ARM這樣的執行指令的地方。包裹在覈心內,但在芯片內可能會有所不同。不像8051,mips,arm,xscale等芯片供應商所特有的核心將會有更廣泛的不同答案。例如,一些微控制器供應商會研究帶狀引腳,並且如果釋放重置時帶子是以特定方式連接的,那麼它將從芯片內的特殊引導閃存執行,例如,您可以使用引導加載程序將用戶引導閃存編程爲。如果綁帶沒有按照某種方式綁定,那麼有時它會啓動您的用戶代碼。我知道的一個供應商仍然會啓動引導加載程序閃存,如果向量表具有有效的校驗和,那麼他們將跳轉到向量表中的復位向量,否則它們將處於引導加載程序模式,等待您與他們交談。

當你進入更大的處理器,非微控制器,那裏的軟件居住在處理器之外,或者在啓動閃存(與處理器分離的芯片)或某些在重置之前以某種方式管理的RAM等。規則爲核心,從地址0xFFFFFFF0開始或從地址0x00000000開始,如果存在垃圾,那麼很好地觸發未定義的指令向量,如果這是垃圾只是掛在那裏或坐在無限循環中調用未定義的指令向量。這適用於ARM,例如,您可以使用從工廠擦除的引導閃存(全部爲0xFF)構建一塊電路板,然後您可以使用jtag在第一次停止閃存並編程閃存,並且不必卸載或套接字或預編程任何東西。只要你的引導程序不掛在胳膊上,你就可以擁有一個不易碎的設計。 (實際上,你可以經常在復位時握住手臂,仍然可以使用jtag調試器進行操作,而不用擔心使用jtag引腳或懸掛手臂核心的錯誤代碼)。

簡答:有多少個不同的處理器芯片供應商?有許多不同的解決方案,儘可能多的你可以想到和更多的部署。儘管將重置處理程序地址放置在內存中的已知位置是最常見的。

編輯:

問題2和3,如果你是買一個芯片,一些微控制器有這種保護的引導程序,但即使有,通常你寫將由該產品所使用的啓動代碼。引導代碼的一部分是初始化堆棧指針和準備內存,並提出部分芯片和所有這些好東西。有時芯片供應商會提供例子。如果您購買的是板級產品,那麼您通常會找到一個板級支持包(BSP),它具有工作示例代碼來提供該板,並可能會執行一些操作。比如說Beagleboard,或者open-rd或embeddedarm.com帶有一個引導程序(u-boot或其他),一些已經預裝了linux。這樣的用戶通常只是編寫一些linux應用程序/驅動程序,並將它們添加到bsp中,但您並不侷限於此,通常歡迎您完全重寫並更換bootloader。無論誰編寫引導程序必須設置堆棧並啓動硬件等。

像gameboy advance或nds之類的系統,供應商有一些啓動代碼調用您的啓動代碼。所以他們可能會爲他們提供堆棧和設置,但他們正在交給你,系統的很多部分都可能啓動,你只需要決定如何分配存儲器,你想要的堆棧,數據,程序,等等。

一些供應商想要保持這種東西控制或祕密,其他人不。在某些情況下,您可能會得到一個沒有示例代碼的電路板或芯片,只是一些數據手冊和參考手冊。

如果你想進入這個業務,雖然你需要準備編寫這個啓動代碼(用匯編語言),可以調用一些C代碼來調出系統的其餘部分,那麼這可能會啓動主要操作系統或應用程序或其他。 Microcotrollers聽起來像你在玩什麼,你的問題的答案在芯片供應商用戶指南,一些供應商比其他廠商更好。搜索文檔中的重置或啓動字以嘗試找出它們的啓動方案。我建議你使用「美元票」來選擇更好的供應商。如果供應商的文檔不完整,祕密文檔,支持不好,不要向他們提供您的資金,請將資金花費在供應商可自由下載,寫得很好的文檔上,並提供書面例子和用戶論壇,全職員工可以圍繞回答問題進行調查。有些時候文檔不可用,除非是認真付費的客戶,這取決於市場。儘管大多數通用嵌入式系統都是公開記錄的。質量差別很大,但文檔等在那裏。

2

關於你的編號:

  1. 硬件重置過程是處理器相關的,並且將在數據表或參考手冊的部分可以充分地描述,但你的描述是通常的情況下 - 不同的體系結構可能會有微妙的變化。

  2. 雖然一些微控制器包含一個基於ROM的啓動代碼,可能包含啓動代碼,但通常這些啓動加載程序僅用於通過通信端口加載代碼,無論是直接編程閃存還是加載並執行輔助引導程序到RAM然後編程閃存。就C運行時啓動而言,這可以通過編譯器/工具鏈提供,也可以用匯編語言編寫。通常,即使啓動代碼由編譯器供應商提供,它也會作爲源提供,並與您的應用程序進行彙編和鏈接。編譯器供應商不能總是知道的東西,如內存映射,SDRAM映射和時間,或處理器的時鐘速度或什麼晶振在您的硬件使用,所以啓動代碼一般需要通過初始化存根定製或擴展,您必須執行你的硬件。

  3. 在ARM Cortex-M設備上,實際上初始PC和堆棧指針實際上是由硬件加載的,它們存儲在復位地址並在加電時加載。然而,在一般情況下,你是對的,復位地址或者包含啓動代碼或啓動代碼的載體,在前期的Cortex ARM架構,復位地址實際上包含了跳轉指令,而不是一個真正的向量地址。無論哪種方式,對於C/C++運行時必須至少初始化棧指針,初始化靜態數據,執行任何必要的C庫初始化並跳轉到主()中的啓動代碼。在使用C++的情況下,它還必須在調用main()之前執行任何全局靜態對象的構造函數。