• slider image 71
  • slider image 72
  • slider image 73
:::


Browsing this Thread:   1 Anonymous Users






Bootloader編譯問題
#1
高級會員
高級會員


查看用戶資訊
bootlader的作法,撰寫"bootloader程式"和"主程式",然後合併在一起
我不想透過合併hex方式來完成程式

個人的想法,在程式中
void main(void) __at(0x0020)
void A_sub(void)
void B_sub(void)

void bootloader(void) __at(0xF000)
void boot_read(void)
void boot_write(void)

在編譯後A_sub、B_sub可能跑到0xF000之後
或boot_read、boot_write跑到0x0020之後

有什麼方式可以將boot_read、boot_write編譯在0xF000
還是一定要宣告成
void boot_read(void) __at(0xF050)
void boot_write(void) __at(0xF100)
如果是這樣子的話就很麻煩了
因為我有很多的boot副程式要這樣子定義
而且要考慮每個副程式的大小

發表於: 7/9 10:46
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: Bootloader編譯問題
#2
版主
版主


查看用戶資訊
Bootloader 一般都會與 Reset Vector 位址 0x0000 一起使用。開機重置時 (Reset) 都會先到 0x0000 來執行。如果你的 Bootloader 沒有放在這裡,那要怎樣開機後執行 Bootloader 呢?

函數及變數是可以透過強制定位址 @0xnnnn 的方式來訂定位址的。但這些 Bootloader 所使用到的函數沒有集中與 Bootloader 同在一起的話,是比較不建議這樣的使用,當然所產生的 Bootloader Hex Code 一樣是可以燒錄的。只要確認所執行的 Bootloader 不會將 Application 所使用到記憶體區塊到最底記憶區塊做清除的動作。

一般 Bootloader 都是使用 ISCP 燒錄器是先燒到 PIC 做開機的執行,而應用程式是可以和 Bootloader 整合成一個 Hex 檔ㄧ次就燒錄完成。事後的要更動應用程式時在啟用 Bootloader 來覆蓋舊的應用程式。

使用 Bootloader 是有很多的限制,像 Configuration Bits 的震盪選擇就不可以更動,一些固定的位址也需要特別的設定,如中斷向量位址等。

發表於: 7/10 15:12
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: Bootloader編譯問題
#3
高級會員
高級會員


查看用戶資訊
謝謝Ryang回覆
Bootloader的一般用法我知道,只是我不要把Bootloader放在前面與影響中斷向量位址與設定,
我要規劃Bootloader在程式容量的後半部

當然這需要考慮到如何進入(例UART)與如何防止寫入錯誤變成磚的問題
上述的功能我已經用組合語言寫好了,已試驗成功,可正常執行
只是目前要改成C語言,遇到編譯Bootloader位址的問題

我知道可以用合併的方式來做,只是作法想單純一點,看可不可以一個project就處理掉
我知道可以用強制定位址 @0xnnnn來做,只是副程式很多,要定址比較麻煩
才來尋問各位有沒有不同的看法與方式

發表於: 7/13 9:07
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: Bootloader編譯問題
#4
版主
版主


查看用戶資訊
參照:
Bootloader的一般用法我知道,只是我不要把Bootloader放在前面與影響中斷向量位址與設定,
我要規劃Bootloader在程式容量的後半部


Bootloader 放在最前面是會占掉中斷向量位址的。如果你在 Linker 下設定 Application 的 Code Offset 位址是 0x1000 的話,那基本上 Application 的中斷就設定在 0x1004 的位址,只要在 Bootloader 的程式裡用 code [Section name] = 0x0004 的宣告放入 goto 0x1004 的指令即可。這時發生中斷就會跳到 0x1004 的 ISR 函數執行。ISR 這函數只要宣告成 : void interrupt isr (void) 即可。

參照:
當然這需要考慮到如何進入(例UART)與如何防止寫入錯誤變成磚的問題
上述的功能我已經用組合語言寫好了,已試驗成功,可正常執行
只是目前要改成C語言,遇到編譯Bootloader位址的問題


如過你的 Bootloader 已用組合語言完成了,那會比用 C 來的精簡。其實Bootloader及Application 分開來看會比較單純好設計。建議你把這組語寫的 Bootloader 獨立起來,讓它跟 Application 的 C 程式僅量無瓜葛。

參照:
我知道可以用合併的方式來做,只是作法想單純一點,看可不可以一個project就處理掉
我知道可以用強制定位址 @0xnnnn來做,只是副程式很多,要定址比較麻煩


如果你用強制定位址 @0xnnnn 的方式訂定函數的位址後,那麼在此函數以後的程式都會依序的放在此強定位址的後面,不後亂擺其位址的。

發表於: 7/13 9:57
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: Bootloader編譯問題
#5
高級會員
高級會員


查看用戶資訊
謝謝Ryang提供的資訊
如你所說,將Bootloader與App分開,是比較單純的~
我現在的想法是
Bootloader是一個專案(組合語言)
Application是另一個專案(c語言)
然後在Application專案中編譯前使用"loadabler"-->"Add Loadable Project" 加入Bootloader專案
再進行編譯,這樣子想法對嗎?

發表於: 7/13 10:52
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: Bootloader編譯問題
#6
版主
版主


查看用戶資訊
1. Application 程式適用 C 寫的,所以一定要有完整的 C 啟動程式來做初始化的設定,所以可以是 Application 是一個完整的專案。只要在 Linker 的設定項裡宣告此 Application 的起始位址從哪開始。圖例為設定 Application 從 0x1000 開始編譯。

2. 假設組語的 0x0004 中斷進入點是置放 goto 0x1004 的話,你可以在 0x1004 的位址用嵌入式組語的方式寫入 #asm goto ISR #endasm 區塊式的嵌入式組語或 asm(“goto ISR”) 單行的嵌入式組語,將中斷的執行轉給 ISR()的中斷函數。當然還是要宣告一下 goto ISR 是放在 0x1004 的位址。

Attach file:



jpg  (0.00 KB)


發表於: 7/13 12:36
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: Bootloader編譯問題
#7
高級會員
高級會員


查看用戶資訊
謝謝Ryang~
我依你的建議,Bootloader使用原來的組合語言程式,Application使用C語言
已可以組譯在一起,並正常動作了,太感謝你了

發表於: 7/15 10:31
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部







You can view topic.
不可以 發起新主題
You cannot reply to posts.
You cannot edit your posts.
You cannot delete your posts.
You cannot add new polls.
You cannot vote in polls.
You cannot attach files to posts.
You cannot post without approval.
You cannot use topic type.
You cannot use HTML syntax.
You cannot use signature.
You cannot create PDF files.
You cannot get print page.

[進階搜尋]