arduino啓動代碼的來源是可用的,你可以漫步,看看他們在做什麼。
處理器(核心)啓動的方式對於該體系結構以及可能的版本或變體(avr系列有多種變體)非常具體。然後你可以在芯片周圍包裹一個芯片,像處理器那樣簡單,其中許多外圍設備和資源都在其他芯片中,或者像芯片上的微控制器或系統,其中許多(如果不是全部)資源在芯片上。 Arduinos上的芯片是微控制器,芯片上有相當數量的資源,但是如果沒有用戶界面(按鈕等)或顯示器,您可能非常滿意在芯片內部運行整個應用程序的意義。什麼使芯片對人類有用? (教育肯定,但最終你想要一些芯片接口)
隨着AVR,處理器核心和芯片公司是同一家公司,他們擁有/控制整個事情,以前atmel現在微芯片(希望他們不要破壞atmel),所以你可以去他們的網站獲取所有信息,處理器核心和芯片信息。芯片有望在家庭中類似。以ARM爲例,雖然ARM擁有處理器核心,但其他許多芯片公司都將自己的東西包裝在它們周圍,這意味着你必須去支持一些信息,剩下的芯片公司,以及兩個由於每個芯片供應商都不會與其他芯片公司兼容,因爲各種原因(包括對其IP的合法保護),武器纏繞的武器在基於武器的世界中差異很大。所以首先你必須瞭解處理器是如何啓動的,主要有兩種方法,一種是地址表,復位地址,中斷地址,可能是故障或其他中斷。程序員填寫這張表(它在某種非易失性存儲器中(通常但不一定是),如flash或rom),這些地址指向處理這些事件的代碼。
然後你編寫處理這些事件的代碼,你似乎要問的是重置事件。正如答案,它變得非常多的芯片和架構特定。通常情況下(但並非總是如此),這些例外是無窮無盡的,因爲並非所有架構和芯片的設計方式都完全相同,就像啓動一個模型一樣 - 即使它們都是四輪車,t也不同於啓動特斯拉)將堆棧指針設置爲指向您和芯片/系統設計人員知道地址的內存。基本的東西只是爲了讓處理器運行起來,你可能不得不初始化一些通用寄存器,但通常不會,也許設置一些處理器功能標誌等。也許你想打開一個緩存或其他東西。此代碼通常但不總是在非易失性存儲器中,只讀,所以您可能需要安裝RAM,有時不需要使用微控制器。然後,您可能需要設置一些時鐘,這些時鐘對於微控制器和處理器來說都很常見,但細節非常多芯片和系統特定。並非總是如此,但許多微控制器都內置RC振盪器(電阻器電容依賴於電子的速度,如果您願意,會產生振盪,永動機),但它們不是很準確,所以如果您需要精確度,您可以調整它們或者在調諧設置中使用熔絲,或者經常需要切換到晶振,但這是特定於電路板的,您必須遵循一些芯片特定的過程切換到該振盪器。如果芯片上有一個芯片可以使該振盪器的速度倍增,那麼也許還需要使用一個PLL,或許可以在芯片內將8Mhz的外部時鐘轉換爲48Mhz的時鐘。
因此,標誌,時鐘,內存,堆棧不一定按此順序。也許還有其他一些事情。接下來的外設,也許你的應用程序想要使用uart和spi控制器和兩個定時器。那麼你必須提出這些,都非常具體的芯片。有時您必須啓用外設的時鐘,這些外設在復位時被禁用以節省功耗。然後根據您想要使用這些通用ISA外設的模式,您必須根據您的應用程序進行設置。重複,直到所有這些設置。
然後你的應用程序可能需要做它需要初始化的東西,也許你在spi總線或總線上有一個溫度傳感器,一個顯示器和一個sd卡。您必須與這些人討論並根據他們的籌碼規則和程序初始化這些外圍設備。
最終數十到數萬行代碼後,您的應用程序可以開始做它的事情。
arduino有一個引導程序,它是avr芯片的一個特性,並且當然是由arduino設計人員和工具使用的。如果您使用其中一個引腳聲明的芯片來重置芯片,則會通過芯片中的功能將其引導加載程序加載爲應用程序。如果您以其他方式斷言該引腳然後重置,那麼它將從應用程序閃存引導,運行您的應用程序。至少在串行接口方面,AVR芯片系列有幾種不同的方式進入引導程序或邏輯,可用於重新編程應用程序閃存「在電路中」。舊的arduino時代,這是一個串行端口(uart)接口,帶有一個基於Atmel產品的簡單協議,但是如果您真正查看它們的引導加載程序並編寫自己的加載程序,而不是使用avrdude或Arduino沙箱。無論哪種方式,這是一個非常普遍的解決方案,微控制器往往有一種或多種方式進入芯片,然後在電路中進行編程,無論是引導加載程序還是邏輯或某種組合。
該引導加載程序本身就是一個完整的應用程序,其目的是提供一個接口來要求它爲您重新寫入閃存。作爲一個完整的應用程序,它必須完成應用程序的所有工作,可由處理器啓動,設置資源/外圍設備,然後繼續執行主應用程序代碼。
所以你可以去atmel站點,也許看看attiny avr微控制器的更簡單的,或者看看你的arduino,找到你擁有的芯片家族並下載資源。這些文檔的名稱因供應商而異,通常稱爲數據表的內容包括芯片引腳和引腳定義,器件的訂購信息(可包含引腳數量,閃存/ RAM數量等的器件型號選項)和電子信息。一些供應商的所有編程信息都在數據表中,數據表中有一些或沒有,您需要某種形式的參考手冊或用戶手冊或其他名稱,有時還有一個涵蓋處理器核心或所有可能的外設,然後數據表告訴你芯片有哪些可能的列表以及它們所處的位置(處理器地址)。
硬件初始化的相當一部分工作是研究,找到電路板的文檔,和/或閱讀原理圖,或者如果你的公司正在讓硬件工程師去問問他們的東西是否是硬件工程師不可理解或完整(通常沒有理由完全記錄它是否存在該人和你,在白板或skype消息或電子郵件上記錄的文件就足以滿足你不需要的冗長文件)。芯片供應商的文檔幾乎總是有錯誤,所以需要通過缺乏更好的術語來查看寄存器中的位是否符合文檔所說的內容,或者您是否可以通過戳他們或閱讀他們的示例代碼或其他開源代碼。除了非常特定的系統的特定應用程序之外,您將找到一個包含所有您需要的硬件init信息的地方。
它爲微控制器所有的寄存器寫入一個初始值。因此,您需要獲取微控制器數據表,並決定要在每個寄存器中放置什麼值。 – user3386109
幾乎從來沒有你需要觸摸永遠註冊,文檔顯示或應該後重置狀態,你不一定需要觸摸那些處於你想要的狀態,假設你的初始化後重置。如果不是,那麼最簡單的方法是塊的部分重置,然後觸摸你不喜歡默認的塊,最壞的情況是觸摸塊中的大部分寄存器。 –
我曾經拆解過一個AVR程序,並且在啓動代碼之前沒有發現硬件初始化,那麼復位立即跳轉到啓動代碼,所以它寫在哪裏? –