Keil C 8051 ---二個程式結合在一起的燒錄問題 |
答題得分者是:㊣
|
mihopaul
一般會員 發表:25 回覆:59 積分:16 註冊:2002-03-17 發送簡訊給我 |
請教一下各位大大 目前我有二隻獨立 用keil c寫的8051程式,想要燒在同一個Falsh之中
其中一個想從0x0 執行,另一個從0x2000執行,請問我在keil C 的選項
中該如何設定?? 此外如何把這二個HEX 檔變成一個HEX,一次寫入Falsh中呢?? 現在我是設定 options/BL51 locate/code reage ,一個設成0,另一隻程式設成0x2000開始,產生二個hex檔之後,直接copy第二個hex檔的內容到第一個
去(第一個檔的000001FF已先去除了),不過這樣子沒辨法執行。 any comment is welcome,thks for yor see this question
|
㊣
版主 發表:261 回覆:2302 積分:1667 註冊:2005-01-04 發送簡訊給我 |
|
mihopaul
一般會員 發表:25 回覆:59 積分:16 註冊:2002-03-17 發送簡訊給我 |
|
㊣
版主 發表:261 回覆:2302 積分:1667 註冊:2005-01-04 發送簡訊給我 |
|
mihopaul
一般會員 發表:25 回覆:59 積分:16 註冊:2002-03-17 發送簡訊給我 |
|
阿信
版主 發表:111 回覆:983 積分:813 註冊:2005-03-10 發送簡訊給我 |
你需要再寫另一小段程式
當作主程式
把這兩個獨立的程式都當副程式 主程式從0x0000開始
第一支從0x0100開始
第二支從0x2000開始
共有三支程式 三個HEX檔 主程式要有一個判斷依據
去執行哪一支程式 比如用I/O讀到High是第一支 Low是第二支
再設定旗標紀錄現在跑第一支還是第二支 再來中斷
中斷時判斷旗標是跑第一支還是第二支
比如第一支的外部中斷就跳到0x0104
第一支的外部中斷就跳到0x2004
其它中斷比照辦理 主程式中斷敘述應該長的向下面這樣
if (fg_First) goto 0x0104 else goto 0x2004 -------------------
美好的事物 稍縱即逝
|
mihopaul
一般會員 發表:25 回覆:59 積分:16 註冊:2002-03-17 發送簡訊給我 |
|
㊣
版主 發表:261 回覆:2302 積分:1667 註冊:2005-01-04 發送簡訊給我 |
|
wenjen88
一般會員 發表:3 回覆:4 積分:1 註冊:2004-11-03 發送簡訊給我 |
|
阿信
版主 發表:111 回覆:983 積分:813 註冊:2005-03-10 發送簡訊給我 |
第一 你已經能指定燒錄位址了
翻譯成組合語言第一行會是
LJMP C:2xxx (2xxx某個位址)
然後中間都空白沒有程式
一直到0x2000
繼續放程式
兩個程式的HEX檔都會有這樣的第一行 第二 HEX檔還有程式碼以外的資訊
程式碼以外的資訊只要一份
HEX檔中 不會記錄沒有程式的記憶體位址
也不會有要燒寫的位址從0x2000開始
所以0~0x1FFF要先去除的問題 第三 一定要有第三個程式來當主程式
並有旗標紀錄現在執行哪一個程式
(一開始旗標為0 主程式判斷旗標為0
去執行A程式 A程式執行完 把旗標設為1
跳回主程式
主程式判斷到旗標被設為1 改去執行B程式)
及中斷一定要動手腳
依旗標紀錄決定跑哪一個程式的中斷 -------------------
美好的事物 稍縱即逝
|
mihopaul
一般會員 發表:25 回覆:59 積分:16 註冊:2002-03-17 發送簡訊給我 |
|
暗黑破壞神
版主 發表:9 回覆:2301 積分:1627 註冊:2004-10-04 發送簡訊給我 |
|
mihopaul
一般會員 發表:25 回覆:59 積分:16 註冊:2002-03-17 發送簡訊給我 |
|
mihopaul
一般會員 發表:25 回覆:59 積分:16 註冊:2002-03-17 發送簡訊給我 |
|
暗黑破壞神
版主 發表:9 回覆:2301 積分:1627 註冊:2004-10-04 發送簡訊給我 |
|
mihopaul
一般會員 發表:25 回覆:59 積分:16 註冊:2002-03-17 發送簡訊給我 |
|
ALLEN0543
一般會員 發表:0 回覆:1 積分:0 註冊:2006-12-03 發送簡訊給我 |
===================引 用 文 章=================== 謝謝大家的回應,我的問題解決了只要執行下列指令 C:\dev_tool\Keil\C51\BIN>ohx51 update.omf HEX RANGE(0x000d0-0xFFFF) OFFSET(0x2000) 再把其中一個HEX的結束字串去除,接上另一個HEX的內容就可以 回破大我有說過了,我的HW會幫我做這件事。 這個問題我目前也有遇到想請問你的解法。 (1)你目前是將二個程式獨立的complie出來再將第二支程式作上面的指令OFFSET然後再整合嗎?或是你是將二支程式寫成一支? 對於你的整合的細節是如何作的呢?第一支的HEX的結束碼要如何刪?第二支如何加再第一支的上面是用COPY/B的指令嗎? 還是用ULTRA EDIT用COPY的?上面的指令是指燒的位址是嗎?那第一支程式使用C語言要跳至第二支執行的指令是如何下的 可否打出來讓我參考,萬分感激。 (2)二支程式都要宣告ORG起始位址嗎?第一支要宣告ORG 0X0000 第二支要宣告0X2000需要這樣作嗎? (3)第二支程式在呼叫副程式或是呼叫LIBBARY或是呼叫中斷的函式時不會跳至第一支程式嗎?若是在第二支程式下指令將 第一支程式0X0000-0X1FFF的FLASH ERASE還能繼續執行嗎? 務請先進指教萬份感激。 |
mihopaul
一般會員 發表:25 回覆:59 積分:16 註冊:2002-03-17 發送簡訊給我 |
不好意思,問題解決了,就沒上來看其它回應了,不過也過期很久了 XD
基本上 我就是寫二個 正常一般的程式,只不過用 上述的工具,把第二支程式的燒錄位址 定在0x2000 第一支燒錄位置寫在0 , 只要把第一支的HEX檔 中 最後 那個 0x 1FF 結束行拿走,再把第二隻程式的HEX 用文書編輯軟體 合在一起,這樣子就只要給一個HEX,其它人燒錄時比較方便,不用改什麼設定。 正常的時後 都是執行第一支程式,但當收到特別命令時,會去切換硬體的GPIO ,並用WDT reset 系統 這樣子重置後,我的HW就會自動捉取第二支程式來執行 簡單來說,這二個程式,就是在做On board update 的功能而已,一隻是 主程式,一隻是IAP程式 IAP 程式會接收PC端給的資料去更新 主程式,因為我的HW 只有一個falsh 以上報告完畢 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |