簡體   English   中英

Cortex M7:啟動后立即分支

[英]Cortex M7: Branch just after start

我正在使用使用 cortex-M7 處理器的 ATSAMV71Q21B MCU。 為了增加冗余,我想有多個引導加載程序,並在啟動微控制器后進入其中一個引導加載程序。 最后,ARM 處理器開始在復位向量位置 0x00000000 處執行。 我無法選擇我想從哪里開始。

我想知道是否可以使用幾條指令分支到我的引導加載程序之一。

目前,我試圖生成一百條指令的所有解決方案對我來說太多了。 我想我需要在向量位置 0x00000000 手動添加分支指令。 雖然,我不確定我應該在哪里分支以及這樣做是否可以。

確實,我不確定我是否真的理解生成的匯編代碼的開頭。 因此,我不確定在哪里分支。

下面是程序開頭的一個例子:

0x00400000  70 0a 40 20 d9 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00 00 00 00 00  p.@ Ù.@.Õ.@.Õ.@.Õ.@.Õ.@.Õ.@.....
0x00400020  00 00 00 00 00 00 00 00 00 00 00 00 d5 01 40 00 d5 01 40 00 00 00 00 00 d5 01 40 00 d5 01 40 00  ............Õ.@.Õ.@.....Õ.@.Õ.@.
0x00400040  d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00  Õ.@.Õ.@.Õ.@.Õ.@.Õ.@.Õ.@.Õ.@.Õ.@.
0x00400060  d5 01 40 00 00 00 00 00 d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00  Õ.@.....Õ.@.Õ.@.Õ.@.Õ.@.Õ.@.Õ.@.
0x00400080  d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00  Õ.@.Õ.@.Õ.@.Õ.@.Õ.@.Õ.@.Õ.@.Õ.@.
0x004000A0  d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00  Õ.@.Õ.@.Õ.@.Õ.@.Õ.@.Õ.@.Õ.@.Õ.@.
0x004000C0  d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00  Õ.@.Õ.@.Õ.@.Õ.@.Õ.@.Õ.@.Õ.@.Õ.@.
0x004000E0  d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00  Õ.@.Õ.@.Õ.@.Õ.@.Õ.@.Õ.@.Õ.@.Õ.@.
0x00400100  d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00 00 00 00 00 00 00 00 00  Õ.@.Õ.@.Õ.@.Õ.@.Õ.@.Õ.@.........
0x00400120  d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00  Õ.@.Õ.@.Õ.@.Õ.@.Õ.@.Õ.@.Õ.@.Õ.@.
0x00400140  d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00  Õ.@.Õ.@.Õ.@.Õ.@.Õ.@.Õ.@.Õ.@.Õ.@.
0x00400160  d5 01 40 00 d5 01 40 00 10 b5 05 4c 23 78 33 b9 04 4b 13 b1 04 48 af f3 00 80 01 23 23 70 10 bd  Õ.@.Õ.@..µ.L#x3..K.±.H¯ó.€.##p..
0x00400180  2c 04 40 20 00 00 00 00 28 04 40 00 0c 4b 43 b1 0c 48 0d 49 10 b5 af f3 00 80 0c 48 03 68 23 b9  ,.@ ....(.@..KC±.H.I.µ¯ó.€.H.h#.
0x004001A0  10 bd 0a 48 03 68 33 b9 70 47 09 4b 00 2b f7 d0 bd e8 10 40 18 47 06 4b 00 2b f5 d0 18 47 00 bf  ...H.h3.pG.K.+÷Ð.è.@.G.K.+õÐ.G.¿
0x004001C0  00 00 00 00 28 04 40 00 30 04 40 20 28 04 40 00 00 00 00 00 fe e7 00 bf 16 49 17 4a 91 42 08 b5  ....(.@.0.@ (.@.....þç.¿.I.J‘B.µ

如果我理解正確,這是一個向量表,我不應該在這里分支。 那是對的嗎 ?

0x00400000  70 0a 40 20 d9 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00 00 00 00 00  p.@ Ù.@.Õ.@.Õ.@.Õ.@.Õ.@.Õ.@.....
0x00400020  00 00 00 00 00 00 00 00 00 00 00 00 d5 01 40 00 d5 01 40 00 00 00 00 00 d5 01 40 00 d5 01 40 00  ............Õ.@.Õ.@.....Õ.@.Õ.@.
0x00400040  d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00  Õ.@.Õ.@.Õ.@.Õ.@.Õ.@.Õ.@.Õ.@.Õ.@.
0x00400060  d5 01 40 00 00 00 00 00 d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00  Õ.@.....Õ.@.Õ.@.Õ.@.Õ.@.Õ.@.Õ.@.
0x00400080  d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00 d5 01 40 00  Õ.@.Õ.@.Õ.@.Õ.@.Õ.@.Õ.@.Õ.@.Õ.@.

所以這些看起來不錯第一個是堆棧指針加載值

0x20400a70 

也許是一個奇怪的數字,但這部分有 0x80000 字節的內存,所以它是有效的。 所以可能是鏈接器腳本生成的值(鏈接器腳本中的堆棧設置,而不僅僅是從 ram 的頂部開始)。

重置向量是

0x004001d9 

它的格式正確(設置了 lsbit),因為它指向您沒有提供的內容。

許多其他人是

0x004001d5

同樣格式正確的可能是基於它與重置向量的接近程度的無限循環,但誰知道必須查看代碼。 啟動沒有太大關系。

芯片/系列文檔表明用戶閃存位於地址 0x00400000 並且對於這些部分來說非常大,因此該轉儲左側的地址和復位向量看起來都很好。

有跡象表明在某個地址 0x00800000 或 0x08000000 處有一個 sam-ba bootloader 或者我不記得了,你可以查一下。 現在我使用了其他 Atmel 部件,這些部件沒有在 Atmel 的閃存中燒錄引導加載程序,而是將其源代碼到 sam-ba,您可以自己構建和使用(為什么要讓自己變得更簡單,更輕巧),但我遇到了問題這種方法閃存如何鎖定或不鎖定,解鎖和擦除有多容易,那么重點是什么? 使用 SWD。 在這種情況下,文檔中的此注釋可能表示已燒毀,那么您需要查看如何選擇啟動該應用程序而不是用戶應用程序,在任何一種情況下,因為它們指示特定地址。 如果它是用戶可更改的,那么這將是您可能想要放置引導加載程序的位置,或者如果已修復且不可更改,則只需將其用作引導加載程序。

至於一般情況下你把你的引導加載程序放在哪里,你選擇你的設計,引導加載程序的含義,什么功能等。經常被誤用,但這個術語意味着既可以引導部分,也可以在某些情況下加載其他應用程序方式(在 ram 中運行一個,重新編程用戶/啟動/應用程序閃存等)。 您需要查看閃存在此設備上的工作方式,假設您希望能夠使用新固件重寫其中的一部分。 有時您可以同時執行和閃存,但更有可能這樣做,他們使用多個閃存庫,因此您可以在一個閃存庫中運行並修改另一個,然后導致他們的引導方案是什么,它總是只在一個上引導而不是另一個,所以你要么必須永遠保持引導加載程序的原樣,要么有一個方案,還必須有一個方案來選擇引導加載程序啟動后哪些庫上的哪些映像作為默認固件。

這些內核通常可以在 ram 中運行代碼,沒有理由期望不在此處(這不是核心,重要的是芯片供應商的實現)因此將引導加載程序的一部分復制並跳轉到 ram 以便不運行flash 允許您對任何 flash 進行重新編程,但如果它出現故障或斷電,則該部件可能會變磚,從而使自己處於危險之中。

如果芯片供應商尚未使用工廠引導加載程序完成此操作,並且該工廠加載程序適合現場使用,則它可能使用 I/O 引腳來確定哪個引導,必須查看文檔。 如果你選擇自己做這件事,讓一個 gpio pin 選擇兩個引導路徑並不是不明智的,然后你可以有一個非常小,理想情況下沒有錯誤的十多行組裝線,讀取 gpio pin 並分支到一個固定點您選擇的閃存例如 0x00500000 和 0x00600000,具體取決於您認為您的應用程序的實際大小。 然后,如果用戶希望加載閃存,您可以進行復制並跳轉到 ram,然后您可以選擇加載其中一個。 少數幾行代碼可能是幾十行,並對某種選定的銀行和未選定的銀行進行校驗和,如果選定的銀行不好且未完成。 或者您提供的第三個引導加載程序,以防兩者沒有校驗和。

大量的解決方案,通常如果您沒有單獨存儲的閃存,您需要分支到 ram 並且在如何設計內存空間方面有更多的自由(假設閃存可以按頁擦除)。 否則,您可能只想使用芯片供應商提供的銀行解決方案。

因此,所有這些都記錄在 arm 和 Atmel(微芯片)的文檔中,您在開始使用此設備之前應該擁有這些文檔。 在任何這些中與 arm 遠程相關的唯一一件事是向量表的工作方式。 所有其余的地址、大小等都是芯片供應商的實現。 所以你的大部分閱讀都在芯片供應商的文檔中,在這種情況下,他們有大量的數據表方法(而不是單獨的數據表和參考手冊方法)。

如果你想使用它,你需要重新閱讀我發現的關於 sam-ba 的內容,如果它對你有用,flash 實現的性質,它是否在應用程序可編程等中。然后你不僅設計你的功能引導加載程序但地址空間,無論它是在閃存中還是在 ram 中執行。

編輯

如果我不明白這個問題。

arm 復位向量位於 0x00000004 而不是 0x00000000(對於 cortex-ms),它是處理程序 ORRED 的地址,值為 1。 地址 0x00000000 是堆棧指針初始化值,如果您選擇在代碼中初始化堆棧指針而不使用此機制,您可以將任何您想要的放在那里。

如果要更改重置處理程序地址,則必須修改 0x00000004,在某些部分,您可以在不擦除的情況下進行更改(通常閃爍要么通過擦除全部為 1,然后您可以寫零,不能寫,但可以更改一個每個字節/字/塊的基礎上為零)。 所以要改變這個你可能需要保存它擦除塊/頁面,改變你想要的位並寫回。 例如,您可以將其從 0x004001d9 更改為 sah 0x004101d9 或 0x004000d9,但不值得嘗試這樣做。 該值是處理程序的地址 ORRED 加一。

它不是分支,因為此時代碼未執行(通常/假設)它是讀取該位置並將其用作起點的邏輯,第一次提取不是分支。

正如所指出的,查看向量表在項目中的位置,然后修改它以指向您的備用重置處理程序。 可能是這樣的代碼

.word STACK_END
.word reset_handler
.word 

在這種情況下,其余的許多都是一些填充/虛擬矢量。 只需用處理程序替換 reset_handler 或您找到的任何內容,記住這是一個引導加載程序,如果您打算調用任何 C 函數,則需要引導 C,如果 C++ 或其他語言更糟。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM