線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:9342
推到 Plurk!
推到 Facebook!

Keil C 8051 ---二個程式結合在一起的燒錄問題

答題得分者是:
mihopaul
一般會員


發表:25
回覆:59
積分:16
註冊:2002-03-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-05-12 12:07:40 IP:61.230.xxx.xxx 未訂閱
請教一下各位大大 目前我有二隻獨立 用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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-05-12 12:43:24 IP:211.22.xxx.xxx 未訂閱
建議把兩個程式寫在一起,組譯完成後,再燒錄即可. 或以一程式為主,宣告另一程式為副,把它include進來,用call的. 再經組譯完成後,燒錄即可.
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
mihopaul
一般會員


發表:25
回覆:59
積分:16
註冊:2002-03-17

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-05-12 13:04:27 IP:61.230.xxx.xxx 未訂閱
不好意思,我有些不太了解,因為這二個程式都是獨立的程式,都有自已的 main程式和中斷程式,所以無法結合成一個, 謝謝你的回答

版主


發表:261
回覆:2302
積分:1667
註冊:2005-01-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-05-12 13:20:51 IP:211.22.xxx.xxx 未訂閱
1>只要I/O 與中斷沒有重覆,可以整合在一起. 2>方便的話,煩請把程式po上來給大家參考.
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
mihopaul
一般會員


發表:25
回覆:59
積分:16
註冊:2002-03-17

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-05-12 13:38:23 IP:61.230.xxx.xxx 未訂閱
很遺憾,就是二隻程式使用同一個IO和中斷 程式碼因為是配合硬體在寫的,所以Post上來應該沒有幫助, 而且問題並不在程式碼本身。 不過程式的作法如下 首先硬體會去執行址位0的程式A,在設定好硬體後改從址位0x2000執行,reset,於是硬體重新執行位於位址0x2000的程式B,就是這樣子而已 所以簡單說就是這二個程式都是獨立的,只是被燒在Flash不同的位址. 謝謝回答
阿信
版主


發表:111
回覆:983
積分:813
註冊:2005-03-10

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-05-12 13:49:12 IP:61.66.xxx.xxx 未訂閱
你需要再寫另一小段程式 當作主程式 把這兩個獨立的程式都當副程式 主程式從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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-05-12 14:00:53 IP:61.230.xxx.xxx 未訂閱
謝謝你的回答 不過或許你誤解了意思了。 我想要的是如何把二個獨立的HEX弄成一個,該如何設定Kiel讓他幫我 把A程式設定是燒在0x2000的位址,而B程式燒在B 燒錄器應該可以指定要燒的位址,但我要的是一開始的HEX就指定好要燒的位址 跟程式碼本身沒有關係

版主


發表:261
回覆:2302
積分:1667
註冊:2005-01-04

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-05-12 14:32:16 IP:211.22.xxx.xxx 未訂閱
有困難!! 還是建議你程式直接重寫比較快.
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
wenjen88
一般會員


發表:3
回覆:4
積分:1
註冊:2004-11-03

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-05-12 15:43:14 IP:220.130.xxx.xxx 未訂閱
首先 keil c 是一個 IDE 開發環境 Compiler ,要就用 call 的,在不然就是 include 你要的方法做不到.......... 不過,有另外方法,就是你不用經過 keil c , 改在燒錄器上動手,通常在 download code時,會問你要放在那個區塊, 你可以把你想要的 n 塊程式,放在 n區, 不知道說到這裡,你有沒有了解,很簡單吧, 要怎麼燒 就怎麼燒, 燒到爽!謝謝, 不懂請在來信問我吧:)
阿信
版主


發表:111
回覆:983
積分:813
註冊:2005-03-10

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-05-12 15:59:23 IP:61.66.xxx.xxx 未訂閱
第一 你已經能指定燒錄位址了 翻譯成組合語言第一行會是 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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-05-12 16:17:46 IP:61.230.xxx.xxx 未訂閱
感謝大家的回覆 可能很多人都誤會了,我要的功能簡單的很,就只是當Keil產生HEX檔時 當中指定燒錄的位址從0變成0x2000開始而已 就像W兄說的,燒錄器可以做到這一點,我知道。 原本是一個HEX燒在flash 0x0 ,另一個燒在Flash 0x2000的位置, 但現在我想要弄成一個HEX檔就好了。 能做到改變HEX的燒錄位址,我自已COPY弄成一個檔也可以 我要的跟程式本身無關啦 XD
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-05-12 16:45:41 IP:221.169.xxx.xxx 未訂閱
無解。 記憶體配置。。。。。等等的問題。讓你無法這樣玩。 可能你得用兩顆 51 了。
mihopaul
一般會員


發表:25
回覆:59
積分:16
註冊:2002-03-17

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-05-12 16:54:04 IP:61.230.xxx.xxx 未訂閱
無解。 記憶體配置。。。。。等等的問題。讓你無法這樣玩。 可能你得用兩顆 51 了。 =================================================== 在執行時,只有一個程式被執行而已,當另外要切換到另一個程式, 是要Reset 硬體的 ,對硬體來說這是二個完全獨立的程式,也不會同時 執行,所以應該沒有你所說的問題吧
mihopaul
一般會員


發表:25
回覆:59
積分:16
註冊:2002-03-17

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-05-12 17:00:42 IP:61.230.xxx.xxx 未訂閱
不好意思,我想是我自已不了解,所以害大家誤解了 我只是要把二個程式燒在同一個Falsh中,然後我的HW會依據我的設定 去Flash捉二個程式其中之一來執行,就這樣子而已。 所以我現在想知道Keil產生出來的HEX檔,我該如何改變HEX中的燒錄位址 就這樣子而已。
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#15 引用回覆 回覆 發表時間:2005-05-12 17:11:11 IP:221.169.xxx.xxx 未訂閱
那你要在一開始寫個 bootloader 之類的東西。 不然。按了 reset 誰知道要去執行那一段程式?
mihopaul
一般會員


發表:25
回覆:59
積分:16
註冊:2002-03-17

發送簡訊給我
#16 引用回覆 回覆 發表時間:2005-05-12 18:24:03 IP:61.230.xxx.xxx 未訂閱
謝謝大家的回應,我的問題解決了 只要執行下列指令 C:\dev_tool\Keil\C51\BIN>ohx51 update.omf HEX RANGE(0x0000-0xFFFF) OFFSET(0x2000) 再把其中一個HEX的結束字串去除,接上另一個HEX的內容就可以 回破大 我有說過了,我的HW會幫我做這件事。
ALLEN0543
一般會員


發表:0
回覆:1
積分:0
註冊:2006-12-03

發送簡訊給我
#17 引用回覆 回覆 發表時間:2006-12-03 10:47:52 IP:218.166.xxx.xxx 未訂閱

===================引 用 文 章===================
謝謝大家的回應,我的問題解決了只要執行下列指令 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

發送簡訊給我
#18 引用回覆 回覆 發表時間:2010-05-14 16:41:18 IP:211.75.xxx.xxx 未訂閱
不好意思,問題解決了,就沒上來看其它回應了,不過也過期很久了 XD

基本上 我就是寫二個 正常一般的程式,只不過用 上述的工具,把第二支程式的燒錄位址 定在0x2000
第一支燒錄位置寫在0 , 只要把第一支的HEX檔 中 最後 那個 0x 1FF 結束行拿走,再把第二隻程式的HEX
用文書編輯軟體 合在一起,這樣子就只要給一個HEX,其它人燒錄時比較方便,不用改什麼設定。

正常的時後 都是執行第一支程式,但當收到特別命令時,會去切換硬體的GPIO ,並用WDT reset 系統
這樣子重置後,我的HW就會自動捉取第二支程式來執行

簡單來說,這二個程式,就是在做On board update 的功能而已,一隻是 主程式,一隻是IAP程式
IAP 程式會接收PC端給的資料去更新 主程式,因為我的HW 只有一個falsh

以上報告完畢
系統時間:2024-04-26 8:24:11
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!