會員登陸
網站導航
最新下載
- Microchip 2019 ... (Wed, 09-Jan-2019)
- Microchip 2019 ... (Fri, 07-Dec-2018)
- APP-ESS18-2 實... (Thu, 06-Dec-2018)
- 2018MASTERs (Mon, 22-Oct-2018)
- 201811ESS (Mon, 22-Oct-2018)
- MCC Bootloader ... (Tue, 31-Jul-2018)
- Microchip2018微... (Sat, 07-Jul-2018)
- APP-ESS18-1B Po... (Fri, 22-Jun-2018)
- Microchip 2018 ... (Fri, 08-Jun-2018)
- 2018/5 EDF 贈品... (Thu, 10-May-2018)
訪問統計 (自2012/5/3)
|
正在流覽:
1 名訪客
|
關於GOTO指令 在C語言用法 |
|
高級會員 
註冊日期: 2010/08/15 00:05
所屬群組:
註冊會員
文章: 87
等級: 8; EXP: 29 HP : 0 / 182 MP : 29 / 4535
|
請問各位先進,小弟目前在寫Bootloader 會用到GOTO這個指令
我目前了解到的GOTO指令好像都是要確切知道詳細位置才能使用
可是我的這個位置是會變的 所以沒辦法寫固定死
所以我想說可否能用把位置丟到一個變數裡面
然後用GOTO跳到這個變數所寫的位置去
例如
Unsigned long Address;
Address=0x11FFF;
Goto *Address;<==這是亂寫的
大概是這樣的概念
謝謝
2018/04/30 14:10
匿名小鬼 於 2018年04月30日 14:28:04 匿名小鬼 於 2018年04月30日 14:56:46
|
|
|
Re: 關於GOTO指令 在C語言用法 |
|
資深會員 
註冊日期: 2012/05/04 19:18
所屬群組:
註冊會員
文章: 214
等級: 13; EXP: 65 HP : 0 / 316 MP : 71 / 6274
|
goto指令好像只能goto "label",label就是指事前定義好的一個程式區塊的開頭"名稱",是不是有其他做法不確定!
2018/04/30 15:14
|
|
|
Re: 關於GOTO指令 在C語言用法 |
|
資深會員 
註冊日期: 2007/06/05 21:45
所屬群組:
註冊會員
文章: 1018
等級: 28; EXP: 20 HP : 0 / 680 MP : 339 / 23258
|
原則上bootloader是不知道 真正的程式的執行點...
>>可是我的這個位置是會變的 所以沒辦法寫固定死
所以 你的(初始)想法是對,但不太可行,不務實...
想一個問題,你到的機關去洽公辦事... 想一下這個機關有十種業務... 你希望來的人每一個人都要知道去那一個櫃台洽辦... 還是有一個"固定"窗口,經過這個窗口,然後去你要洽辦的櫃台
所以bootloader跟"真正"程式配合,一般實作就是用"固定"窗口
例: bootloader --> goto 0x1000 --> (程式) goto 真正"入口"
註: 0x1000跟bootloader大小有關...
2018/04/30 20:26
|
|
|
Re: 關於GOTO指令 在C語言用法 |
|
資深會員 
註冊日期: 2004/05/19 03:43
來自 台灣
所屬群組:
註冊會員
文章: 1751
等級: 35; EXP: 11 HP : 0 / 852 MP : 583 / 36756
|
你是要嚐新 or 真有需要?
如要嚐新 去做就對了
如真有需要 或者可試試 do case 的做法 ...
.
2018/04/30 21:52
|
|
|
Re: 關於GOTO指令 在C語言用法 |
|
高級會員 
註冊日期: 2010/08/15 00:05
所屬群組:
註冊會員
文章: 87
等級: 8; EXP: 29 HP : 0 / 182 MP : 29 / 4535
|
對,所以我有點困擾XD
主要原因是 我想要更新BOOTLOAD的程式,利用BOOTLOADER 我總共會有兩個Bootloader 一個是最原始的Bootloader 另一個是新Bootloader
因為偶爾會發現新的Bootloader 會有Bug 所以會用舊的Bootloadere 更新 新的Bootloader
但是新的Bootloader 我擺放位置是在最後面的,而且容量會變化
容量一變化 ,擺放位置也會更動
所以我才會有點苦惱
2018/05/02 10:28
|
|
|
Re: 關於GOTO指令 在C語言用法 |
|
版主 
註冊日期: 2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者 註冊會員 MICROCHIP
文章: 14612
等級: 73; EXP: 23 HP : 1083 / 1805 MP : 4870 / 78087
|
這要用嵌入式的組合語言方式來使用這 goto <Address> 的方式。 你是用 C18 還是 XC8 ? 嵌入式語法在其使用手冊都有說明的。
底下為 C18 使用範例:
_asm //begin in-line assembly goto isr_high //go to isr_high function _endasm //end in-line assembly
2018/05/02 14:53
|
|
|
Re: 關於GOTO指令 在C語言用法 |
|
資深會員 
註冊日期: 2009/04/07 13:30
所屬群組:
註冊會員
文章: 174
等級: 12; EXP: 24 HP : 0 / 281 MP : 58 / 8102
|
Microchip 的 16 bit Mcu 中, goto 指令並不存在直接達成你所需功能的格式. 如果你使用的是 XC16 諞譯器, 那麼可以試試以下的程式碼. 或許能夠達成你的需求.
void Do_Goto(unsigned long Goto_Target) { Goto_Target &= 0x7FFFFF; /* Program size limit */ asm(" MOV.D [W14], W0"); asm(" ULNK"); asm(" MOV.W W1, [W15 - 2]"); asm(" MOV.W W0, [W15 - 4]"); asm(" RETURN"); }
2018/05/02 22:54
|
|
|
Re: 關於GOTO指令 在C語言用法 |
|
高級會員 
註冊日期: 2010/08/15 00:05
所屬群組:
註冊會員
文章: 87
等級: 8; EXP: 29 HP : 0 / 182 MP : 29 / 4535
|
結果最後我還是沒弄出來
我是改用指引的方式
將USER APP的Hex以及 Bootloader的Hex檔案 的起始位置(0x00000)的資料讀出 然後分別放在0x200(USER APP) 跟 0x208(Bootloader) 用索引的方式跳
意思是一開始程式執行0x0000行時候會先跳到0x208 然後再由0x208跳到正確的Bootloader位置 當執行完成Bootloader之後再跳到0x200 之後再轉跳到USER APP的位置
這樣我的USER APP 跟Bootloader就隨時都可以更換位置了
2018/05/07 18:08
|
|
|
Re: 關於GOTO指令 在C語言用法 |
|
資深會員 
註冊日期: 2007/06/05 21:45
所屬群組:
註冊會員
文章: 1018
等級: 28; EXP: 20 HP : 0 / 680 MP : 339 / 23258
|
>>我是改用指引的方式
這個就是我說的"固定"窗口...
只是....你的使用方式,感覺怪怪的...
2018/05/07 19:36
|
|
|
Re: 關於GOTO指令 在C語言用法 |
|
高級會員 
註冊日期: 2010/08/15 00:05
所屬群組:
註冊會員
文章: 87
等級: 8; EXP: 29 HP : 0 / 182 MP : 29 / 4535
|
補了一張我的概念圖
附加檔案:
未命名.jpg (37.46 KB)
2018/05/08 11:19
|
|
您無法在此發表文章
您可以在此觀看文章
您無法回覆文章
您無法編輯自己的文章
您無法刪除自己的文章
您無法發起投票調查
您無法在此投票
您無法上傳附加檔案
您無法不經審核直接發表文章
|
搜尋
Microchip連結
網頁捷徑
2019 Winter Elite 報名
教育訓練
其它網站連結
|