首先我想介紹一下我自己,因爲我是新手。我是一名電子工程師,專門從事嵌入式系統設計和開發。我一直在從網站收集信息很久,我認爲有很多人有很多知識。我希望你們其他人可能會遇到這樣或那樣的問題。在IAR EWARM問題上爲Kinetis MKE06Z微控制器定製自舉程序
我一直在爲Kinetis MKE06Z微控制器實現自定義引導加載程序時遇到了一些問題,而不是在引導加載程序本身中,而是在跳轉到應用程序代碼和行爲後重定位。應用程序完全以C編碼。
引導加載程序按預期執行所有操作,確定它是否應運行或跳轉到用戶應用程序。這是一個實現了跳躍的順序:
void JumpToUserApplication(uint32_t userStartup)
{
/* set up stack pointer */
asm("LDR r1, [r0]");
asm("MOV r13, r1");
/* jump to application reset vector */
asm("ADDS r0,r0,#0x04 ");
asm("LDR r0, [r0]");
asm("BX r0");
}
在Frescale的AN4767實現:其中
__disable_interrupt();
SCB->VTOR = RELOCATION_VECTOR_ADDR & 0x3FFFFE00;
JumpToUserApplication(RELOCATION_VECTOR_ADDR);
。
到目前爲止,這麼好。一旦執行了跳轉,我會跟蹤應用程序的行爲(在反彙編窗口中),並在某些指令後發現,它會被跳轉指令卡住某個特定地址,最終導致無限循環。然後我一步一步地運行它,以確定哪個是導致此故障的指令。這很奇怪,因爲它運行正常,並突然跳轉到RAM地址。幾個週期,然後跳轉到無限循環。我注意到了導致這個奇怪跳躍的指令的地址和無限循環的地址。我看看核心寄存器,發現有一個例外,並注意到它的編號爲0x03
(Hard Fault)。然後切換到調試用戶應用程序。
進入用戶應用程序後,我開始調試。用戶應用程序正常運行就像這樣(不從Bootloader跳轉)。然後我查找相關地址,並發現從引導加載程序跳轉時導致硬故障的例程來自IAR:__iar_data_init3
。事情是,它是預編譯庫的一部分,我不確定是否可以安全地刪除它(通過刪除並直接將其替換爲啓動文件上的main
的調用
真正的問題是:爲什麼在從booloader跳轉後應用程序的行爲是這樣的,但是如果沒有這樣的跳轉則不行?爲什麼這個例程跳轉到RAM地址(當它不應該這樣)?
當然,它可能是很少有具體的,但希望有人能夠幫助我
您是否可以將帖子限制在您的問題中,並在可能的情況下進行闡述?這是非常通用的,通過提供你不明白的部分的代碼片段來嘗試更具體的... – yaman
發佈一個簡單的例子,說明你做了什麼以及你認爲它應該做什麼。 –
對不起,我按下Enter鍵併發布了一個不完整的問題。我不確定,這是非常具體的。 –