2012-10-03 71 views
9

我正在使用mbed的LPC 1768開發板(與cortex M3 cpu),我正試圖在這裏實現某些功能,主要是從SD卡升級用戶應用程序,我正在編寫兩個程序,第一個引導程序/納米內核和用戶應用程序(的HelloWorld一開始會做):Cortex M3的引導加載程序

  • 的Bootloader /納米內核在爲0x00地址運行時,它會做一些檢查,並最終搶在SD二進制文件卡
  • 引導加載程序/納米內核將複製此地址爲0x9000的二進制文件(稍後可能需要更改,但該空間不能被引導加載程序/納米內核使用,因此應該可以)
  • 引導加載程序跳轉到用戶應用程序0x9000 + 4

Sd卡很容易解決,我遇到了跳轉部分的問題。這裏是跳轉功能的代碼。

void run(void) { 

    void (*user_code_entry)(void); 

    unsigned *p; 
    SCB->VTOR = (USER_FLASH_START & 0x1FFFFF80); 

    // Load contents of second word of user flash - the reset handler address 
    // in the applications vector table 
    p = (unsigned *)(USER_FLASH_START +4); // USER_FLASH_START is 0x9000 

    user_code_entry = (void (*)(void))p; 

    // Jump to user application 
    user_code_entry(); 

}

所以我編了(我用的Keil uvision4)的用戶應用程序改變起始地址0×9000。如果我編寫我的主板(使用flashmagictool),然後手動跳轉(仍使用flashmagictool)到0x9004(0x9000 + 4),用戶應用程序將運行,所以我相信編譯工作正常,所以用戶應用程序可以運行在0x9000。

但是,如果我運行bootloader /納米內核,這一個不會跳轉到用戶應用程序,不幸的是,因爲我無法調試,我不知道發生了什麼...我也試圖不要使用SD複製部分,所以我首先編程bootloader,基本上只跳轉到0x9004。然後,我編寫將位於0x9000的用戶應用程序。如果我重新啓動主板,bootloader會運行但不會跳轉到用戶應用程序。我檢查了內存,看起來這兩個程序(引導程序+用戶應用程序)都是正確的,並且位置正確。

我相信我在這裏錯過了一些東西,有沒有我應該看的低級代碼?我已經閱讀過在線文檔的語調,並且從我發現的例子中,他們跳轉到用戶代碼的方式與我一樣...非常感謝您的幫助。

+0

這應該工作在PC上非常相似了,但是有虛擬地址,而不是物理 - 嘗試一下,看看它是否工作,然後將代碼移至Keil – Ulterior

+1

Cortex M3沒有MMU,因此沒有虛擬地址。 –

回答

8

Cortex M3只能在Thumb模式下運行。因此你總是要跳到address +1,否則會產生錯誤。

試試看:

user_code_entry = (void (*)(void))(USER_FLASH_START +4 +1);

+0

簡直不敢相信!非常感謝你渦輪J :) – batmat

+3

我意識到這可能工作,但它沒有任何意義。編譯器應該爲你生成Thumb指令。我做的和你在那裏完全一樣(沒有+1),它似乎爲我工作。你有'arm-none-eabi-gcc'編譯器的'thumb'標誌嗎? – nonsensickle

+0

謝謝!這也適用於我的M4。一切都很好編譯,調試器運行通過所有的代碼就可以了,除了這個IAR調試器警告的一個例外,在跳過代碼時會發生跳轉:「XPSR的T位是0,但應該是1.更改爲1 。「 – tniles09

3

剛閱讀NXP網站的AN10866文檔。你必須加載PC和堆棧指針,然後跳轉到復位中斷:

__asm void boot_jump(uint32_t address){ 
    LDR SP, [R0]  ;Load new stack pointer address 
    LDR PC, [R0, #4] ;Load new program counter address 
} 

void execute_user_code(void) 
{ 
    /* Change the Vector Table to the USER_FLASH_START 
    in case the user application uses interrupts */ 
    SCB->VTOR = USER_FLASH_START & 0x1FFFFF80; 

    boot_jump(USER_FLASH_START); 
} 
+0

我還想在第4-6頁和第4-7頁的http://infocenter.arm.com/help/topic/com.arm.doc.dui0056d/DUI0056.pdf中添加」內聯彙編程序之間的差異和armasm「它表示你不能將值存儲到PC。它還指出,'bx'指令不受支持,但我有代碼,目前正在使用它的內聯asm工作(雖然我再次檢查)。 – nonsensickle

+0

我以前的評論是指內聯程序集,就像使用了一個@John Sinclair一樣。這些在單獨的彙編代碼文件中使用是安全的,但是,我在內聯彙編中使用了相同的版本,並且它也工作正常,所以我不確定ARM的建議是什麼。 – nonsensickle