2013-09-21 25 views
2

我正在致力於Cortex-M3。 我想添加一個功能(或ISR)到現有的固件鏡像,而無需更新整個程序。 我可以編譯並構建一個沒有main的函數並寫入flash嗎? 如果我知道這個函數被寫入的地址,我可以使用函數指針調用這個函數嗎?將代碼添加到現有固件中

我們有單線程和沒有OS的代碼。根本問題是,在這種情況下,我們將如何創建安裝和使用應用程序的環境。

+0

不,我們是不是要修補一些別人二進制。我們有單獨的線程代碼,我們也沒有操作系統和問題是如何將創建安裝環境和使用在這種情況下的應用程序。 – user1884725

+0

你的大部分問題都是用*鏈接器*優​​雅地解決的。看看你的工具包的文檔。例如,[Gnu Ld](http://sourceware.org/binutils/docs/ld/)帶有'gcc'工具。您可以從一個模塊中提取符號,並在沒有*函數指針的情況下調用它們。即使你可以在沒有鏈接器技巧的情況下以純C做到這一點,你的代碼通常會受到*限制*。如果你真的沒有操作系統,那麼我猜你已經有了一個自定義鏈接腳本。 –

+0

是的,你可以。你將能夠做什麼將完全取決於你如何實現它。事實上,你可以實現一個復位向量,甚至給它一個新的向量表,這樣你就可以在存儲器的某個地方上傳一個小的啓動加載器。 – nonsensickle

回答

0

是的,你可以。

有3個文件,你將需要了解之前,你可以肯定,你知道如何解決這個問題:

  1. The SAM3N4C Startup Code
  2. The DeviceVectors definition
  3. The SAM3N4C Linker Memory Region Definitions
  4. The SAM3N4C Linker Script

我已經給你鏈接到SAM3N4 C芯片,因爲我很熟悉它。該代碼可以適合你正在使用的芯片。

爲了使它適用於你所要求的你將需要一個向量表有一個指向你的函數的指針。您需要將此矢量表置於已知地址,您將使用它來獲取您的函數指針。你的函數將被放置在這個向量表之後的內存中。

簡要說明:

看來你還是不熟悉的東西上是如何工作的Cortex-M3,所以我會盡量解釋一下。

main並不特殊。這只是一個功能,它甚至不是第一件事情。在Cortex-M3上運行的第一個函數是您的復位向量中斷服務程序。此功能然後設置您的所有內存,然後調用main(請參閱The SAM3N4C Startup Code)。

在Cortex-M3上,有一個指向這個特殊函數的指針,它位於從內存開始的已知偏移量(0x00000004)處,這就是您的硬件用來啓動/啓動的指針。來自The SAM3N4C Startup CodeReset_Handler()功能被放置在該地址處。這可以在DeviceVectors exception_table結構中完成,您可以看到該結構正在使用The SAM3N4C Startup Code中給出的代碼進行初始化。該結構包含所有函數指針,並且復位向量位於從內存起始位置的偏移量0x00000004處,因此需要將exception_table置於內存的起始位置。這是通過使用__attribute__ ((section(".vectors")))標誌將exception_table放入.vectors部分(請參閱The GNU attribute syntax)完成的。然後將其用於The SAM3N4C Linker Script,其中包括The SAM3N4C Linker Memory Region Definitions中給出的存儲器區域定義,以將其置於存儲器的最開始處(使用KEEP(*(.vectors .vectors.*))行,其被放入存儲器的第一個)。

我建議調查您現有的鏈接器腳本的工作方式,因爲它們會爲您提供有關如何執行此操作的線索。閱讀更多關於the GNU linker將幫助你。

而且,你是以後的解決辦法,在我看來,複製此行爲,但你可以使用一個較小的「量表」,因爲你只需要一個功能...

0

如果您使用「編譯代碼位置獨立代碼「,則可以將您的功能重新定位到ROM(閃存)或RAM中的任何位置。

編寫重定位到內存中的代碼仍然不是微不足道的,你應該確保理解ARM架構,並且至少不要害怕ARM機器指令集。訣竅是首先了解這是如何發生在教學層面的,然後嘗試用C來做同樣的事情。當然,存在一些複雜性。在運行main之前,在初始化過程中有幕後工作,它們設置零和非零初始化變量。它取決於你的編譯器如何實際進行。運行一個虛擬程序是非常有用的,並且逐步執行所有的執行BEFORE你會得到main

請參閱此相關的問題:Trying to load position independent code on cortex-m3

+0

更有效的解決方案是爲目標位置編寫與位置相關的代碼。 –