2014-02-19 17 views
1

我試圖將兩個程序加載到AVR芯片上,但我找不到任何資源如何做到這一點。在AVR芯片上加載兩個程序

這樣做的目的是讓芯片開始運行第一個程序,第一個程序跳轉(使用匯編)到第二個程序(在存儲器中的第二個點加載)。我知道這聽起來毫無用處,但稍後我想要實現它的更大一點。

有沒有辦法在內存中的指定位置加載程序並完成此任務?或者也許有辦法生成一個可以做到這一點的十六進制文件嗎?

在此先感謝,我希望這是有道理的。

+0

你使用什麼特定的AVR? ATmega32U4有很多引導程序示例,您可以查看AVR109應用筆記。 –

+0

您應該可以修改鏈接器文件來處理這個問題。 – bblincoe

+1

這聽起來沒有用處 - 這正是引導加載程序所做的。 – Clifford

回答

1

代碼的起始地址通常由鏈接器腳本或設置決定。工具鏈的默認值是從復位開始運行(即復位向量將指向代碼的起始地址)。您的輔助程序需要位於不同的內存空間(通過鏈接器設置),您的主程序只需跳到第二個程序即可。

您可能需要警惕一些問題;您的主程序可能不會讓I/O和外設處於「重置」狀態,因此您的輔助程序不應做出任何假設。在跳轉之前,禁用任何可能產生中斷的外設可能很重要。

就合併十六進制文件而言,如果您小心並準備好手動解釋十六進制記錄,或者使用SRecord tool更靈活(且不太容易出錯),則可以使用文本編輯器輕鬆實現這些文件。

您可能會遇到的一個問題是,雖然代碼本身可能分開定位,但AVR中的矢量表是固定的,並且將在兩個程序之間共享。這兩個程序的中斷向量表必須相同,並且必須共享處理程序 - 如果處理程序需要與任何正在「正在運行」的程序進行通信,那麼這並非易事。最簡單的解決方案是安排它,以便只有一個程序使用中斷。 SRecord將有用地解決或警告兩個十六進制文件定義重疊的內存區域的衝突,我認爲您可以安排它,以便一個文件覆蓋另一個文件。

+0

這是非常有幫助的,而且我正在尋找的東西,是否有任何機會知道SRecord的Mac替代品,或者如果SRecord可以在Mac上編譯? – user2009114

+1

@ user2009114根據SRecord項目網站*「SRecord幾乎可以運行在任何UNIX系統上」。* - 幾乎可以肯定包括OSX。我只用過預製的Windows二進制文件。該項目的自述文件說,構建指令位於下載焦油球上的「BUILDING」文件夾中。這是一個簡單的應用程序,我想機智是一個簡單的構建。 – Clifford

+0

@ user2009114:..表示Google很快就會產生[此OSX問題](http://sourceforge.net/p/srecord/support-requests/8/),但提供了一個解決方案[here](http:/ /sourceforge.net/p/srecord/discussion/248569/thread/dd92d2e6/f5eb/) - 儘管這也表明了另一個可能的問題。 – Clifford

4

這聽起來像一個引導程序。我在Microchip的PIC中實現了這一點,而不是AVR,但訣竅在於鏈接器文件。

自舉程序在啓動時運行。它尋找新的應用程序固件來燒入閃存。如果沒有新的固件,它會查看是否有新的應用程序固件。如果有,則跳轉到應用程序的重置向量。應用程序開始運行,就像它只是一個電源。

訣竅是引導加載程序和應用程序的鏈接文件被耦合在一起。自舉程序保留地址0x0000到0x0FFF。應用程序保留地址0x1000至0xFFFF。此外,引導加載程序和應用程序需要就應用程序的啓動位置達成一致。它可能不是地址0x1000。

+2

此外,十六進制文件將需要合併,否則編程器軟件將需要運行配置選項,以便它編程第二個文件時不會擦除整個芯片。 –

+0

我在Atmega128上使用了一個arduino,所以有一個引導程序(optiboot,我相信)。我想這裏的問題是,我正試圖在引導加載程序之上加載兩個程序。所以本質上,引導加載程序啓動的程序是一種內核,它跳轉到編程內存中其他位置的內核。對不起,如果我誤解了你的答案。我正在嘗試使用av​​rdude作爲編程器軟件,所以也許有一種方法可以使用它在單獨的預先指定的內存插槽中加載這兩個程序? – user2009114

0

我也使用這種技術用於PIC處理器上的引導加載程序和應用程序。正如前面提到的海報,問題的第一部分是使用鏈接程序定位兩個程序,使它們不重疊。在分別構建兩個程序之後,我使用Hexmate將兩個程序的十六進制文件合併爲一個單獨的十六進制文件。你可以得到這個實用程序的Windows PC副本http://www.schmalzhaus.com/Tools/HexmateInstructions.html