2016-04-21 24 views
1

首先我想介紹一下我自己,因爲我是新手。我是一名電子工程師,專門從事嵌入式系統設計和開發。我一直在從網站收集信息很久,我認爲有很多人有很多知識。我希望你們其他人可能會遇到這樣或那樣的問題。在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地址。幾個週期,然後跳轉到無限循環。我注意到了導致這個奇怪跳躍的指令的地址和無限循環的地址。我看看核心寄存器,發現有一個例外,並注意到它的編號爲0x03Hard Fault)。然後切換到調試用戶應用程序。

進入用戶應用程序後,我開始調試。用戶應用程序正常運行就像這樣(不從Bootloader跳轉)。然後我查找相關地址,並發現從引導加載程序跳轉時導致硬故障的例程來自IAR:__iar_data_init3。事情是,它是預編譯庫的一部分,我不確定是否可以安全地刪除它(通過刪除​​並直接將其替換爲啓動文件上的main的調用

真正的問題是:爲什麼在從booloader跳轉後應用程序的行爲是這樣的,但是如果沒有這樣的跳轉則不行?爲什麼這個例程跳轉到RAM地址(當它不應該這樣)?

當然,它可能是很少有具體的,但希望有人能夠幫助我

+2

您是否可以將帖子限制在您的問題中,並在可能的情況下進行闡述?這是非常通用的,通過提供你不明白的部分的代碼片段來嘗試更具體的... – yaman

+0

發佈一個簡單的例子,說明你做了什麼以及你認爲它應該做什麼。 –

+0

對不起,我按下Enter鍵併發布了一個不完整的問題。我不確定,這是非常具體的。 –

回答

0

看來,IAR與鏈接器配置做的事情對我來說並不是很清楚,但與某事有關 這個問題。事情是我搬遷的.text段:

define symbol __ICFEDIT_intvec_start__ = 0x00001800; 
define symbol __ICFEDIT_region_ROM_start__ = 0x00002000; 
define symbol __ICFEDIT_region_ROM_end__ = 0x0000FFFF; 

define region APP_ROM = mem:[from (__ICFEDIT_region_ROM_start__) to (__ICFEDIT_region_ROM_end__)]; 

place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; 
place at start of APP_ROM { readonly section .text }; 

看來,鏈接器不明白這一點,讓東西從其他應用程序跳時,應用程序胡作非爲。取而代之的是,在GUI中保留原始的.icf文件和編輯只有.intvec_start解決了這個問題,但是代碼緊接着向量表開始。不是一個問題,但我想將代碼重新放置得更遠一些。

感謝。