最近在學習freescale的9s12g的開發,遇到一個程式升級想不明白,想請教下各位大神:
我目前的想法是:
bootloader的代碼單獨放到一個16K的flash區域A,app放另一個16K的flash區域B,啟動時如果需要升級,就將接收到的s19檔案,根據決議出來的記錄的地址,將資料寫到相應的地址上。
目前的困惑是:
1、bootloader和app是分為2個工程,還是一個工程呢?如果是分2個工程,app工程建立后也是需要初始化,然后跳到main函式執行的,那這個跟bootloader工程的main函式不會沖突嗎? 對比bootloader和app工程的s19檔案,有的記錄地址是一樣的,但是代碼內容不一樣,那這種沖突要怎么解決呢?
2、如果將bootloader和app整合在一個工程呢里,升級時,只要決議到的s19檔案的記錄地址是bootloader所在的區域,就不去擦寫,其余的記錄都擦寫,這樣可行嗎? 因為bootloader區域是始終不擦寫的,那bootloader里是否有硬編碼 app工程的跳轉地址呢? 如果有的話,跳轉應該就會有問題了吧?
還請有經驗的大神指點一二。
uj5u.com熱心網友回復:
兩個工程,這樣才能定義不同的起始地址,進入bootloader有升級指令就擦除app那部分的地址,然后寫入資料,完成升級再跳轉到app的起始地址就可以了uj5u.com熱心網友回復:
能否幫忙解釋下,怎么獲取app的起始地址。決議app的s19檔案的時候,能知道哪一條記錄包含了app的起始地址嗎?
uj5u.com熱心網友回復:
app地址都是你自己定義的,bootloader跟app兩個程式要定義不同的起始地址。單片機都大同小異,你用keil編譯的話,就可以在設定那邊設定起始地址,編譯出來的hex檔案就包含了
uj5u.com熱心網友回復:
兩個工程,這樣才能定義不同的起始地址,進入bootloader有升級指令就擦除app那部分的地址,然后寫入資料,完成升級再跳轉到app的起始地址就可以了
能否幫忙解釋下,怎么獲取app的起始地址。決議app的s19檔案的時候,能知道哪一條記錄包含了app的起始地址嗎?
app地址都是你自己定義的,bootloader跟app兩個程式要定義不同的起始地址。單片機都大同小異,你用keil編譯的話,就可以在設定那邊設定起始地址,編譯出來的hex檔案就包含了
我用的是codewarrior,
比如prm檔案里有如下的定義:
ROM_VAR,
STRINGS,
DEFAULT_ROM,
NON_BANKED INTO ROM_F000;
一些prestartup和startup都是裝到ROM_F000的,那就是表示app的起始地址就是這個0xf000了吧?
我去驗證下,非常感謝。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/23823.html
標籤:單片機/工控
上一篇:陀螺儀資料誤差很大,資料經常飄逸
