|
|||||||||||
| 技術交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術 | 電源技術 | 測控之家 | EMC技術 | ARM技術 | EDA技術 | PCB技術 | 嵌入式系統(tǒng) 驅動編程 | 集成電路 | 器件替換 | 模擬技術 | 新手園地 | 單 片 機 | DSP技術 | MCU技術 | IC 設計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
WinAvr中如何在flash中為數(shù)據(jù)指定個絕對地址 |
| 作者:Anitya 欄目:單片機 |
程序中有個數(shù)組,放在FLASH中.定義為 const prog_char data[] = {.......}; 我又要確定得指定編譯后data位于FLASH區(qū)0x1000處. 對于data的再次修飾__attribute__((section(".dataarea")))編譯會錯誤. 我查找了__attribute__((__progmem__))定義,可是沒找到. 不知道要實現(xiàn)這樣的要求該如何處理? |
| 2樓: | >>參與討論 |
| 作者: Anitya 于 2004/12/28 16:31:00 發(fā)布:
找到了avrn.x文件,可是看不懂:( |
|
| 3樓: | >>參與討論 |
| 作者: hotpower 于 2004/12/29 1:36:00 發(fā)布:
我是AVR菜鳥我怕誰... 1.建立FLASH數(shù)組data[](自定義在.mydatasection段) const unsigned CHAR data[] __attribute__((section(".mydatasection")))={ 0x10,0x20,0x30 }; 2.改寫makefile(將mydatasection定位在0x001000) 注意: FLASH 地址為0x001000 0x000000+FLASH 地址 ram 地址為0x801000 0x800000+ram 地址 EEPROM 地址為0x811000 0x810000+EEPROM地址 改寫前 # Linker flags. # -Wl,...: tell GCC to pass this to linker. # -Map: create map file # --cref: add cross reference to map file LDFLAGS = -Wl,-Map=$(TARGET).map,--cref LDFLAGS += $(EXTMEMOPTS) LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) 改寫后 # Linker flags. # -Wl,...: tell GCC to pass this to linker. # -Map: create map file # --cref: add cross reference to map file LDFLAGS = -Wl,--section-start=.mydatasection=0x001000,-Map=$(TARGET).map,--cref LDFLAGS += $(EXTMEMOPTS) LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) |
|
| 4樓: | >>參與討論 |
| 作者: hotpower 于 2004/12/29 1:36:00 發(fā)布:
這是生成的HEX文件 注意: 倒數(shù)第2行的 :031000001020308D 03 3個數(shù)據(jù) 1000 地址0x1000 00 數(shù)據(jù)記錄 10 數(shù)據(jù)0x10 20 數(shù)據(jù)0x20 30 數(shù)據(jù)0x30 8D 校驗和 :1000000012C02BC02AC029C028C027C026C025C0C6 :1000100037C023C022C021C020C01FC01EC01DC0C9 :100020001CC01BC01AC011241FBECFE5D4E0DEBF28 :10003000CDBF10E0A0E6B0E0E4E4F1E002C005903E :100040000D92AE37B107D9F710E0AEE7B0E001C0CE :100050001D92A038B107E1F762C0D2CF019782307C :100060009105E4F70895CF93DF93EC01892B29F0F4 :1000700088EE93E0F3DF2197D9F7DF91CF910895D0 :100080001F920F920FB60F9211248F939F9380911E :100090007E0090917F009DBD8CBD85B391E0892746 :1000A00085BB9F918F910F900FBE0F901F90189559 :1000B000CF93DF931FBC82E08EBD80E090E03AD00A :1000C000282F882331F1C0E0D0E0E22FEF7089F0D3 :1000D00089B7846089BFE150FF27EE0FFF1FE05A08 :1000E000FF4F8081918190937F0080937E009DBD22 :1000F0008CBD22952F708AE8289FC0011124B3DFA0 :1001000089B78B7F89BF2196CE0114D0282F8823F1 :10011000E1F688EE93E0A7DFDF91CF910895CFE578 :10012000D4E0DEBFCDBF81E084BB8FEF85BB789488 :10013000BFDFFECFE199FECF9FBB8EBBE09A992730 :040140008DB30895DE :1001440044FCACFC09FD34FD82FDC8FD06FE22FE24 :0E01540056FE85FE9AFEC1FEE4FE03FF11FF7B :031000001020308D :00000001FF |
|
| 5樓: | >>參與討論 |
| 作者: Anitya 于 2004/12/29 8:18:00 發(fā)布:
看了hotpower的帖子我明白了 這樣做我先前也試過.但總是編譯不過.看到貼出來的hex文件終于知道了.這樣可以編譯成功是因為函數(shù)之類的沒有占用到0x1000地址.所以可以通過.如此成功是有先決條件的.若數(shù)據(jù)要從0x0100開始,就會遇上我的問題了---被覆蓋. D:\WinAVR\bin\..\lib\gcc\avr\3.4.1\..\..\..\..\avr\bin\ld.exe: section .text [00000000 -> 00000bdd] overlaps section .l1bootdata [00000100 -> 0000057e] 治標又治本的方法.... |
|
| 6樓: | >>參與討論 |
| 作者: 宇宙飛船 于 2004/12/29 8:32:00 發(fā)布:
hotpower 這一貼使得整個AVR 壇子閃閃生輝! |
|
| 7樓: | >>參與討論 |
| 作者: Anitya 于 2004/12/29 8:55:00 發(fā)布:
這個是avr4類型text區(qū)的分配 .text : { *(.vectors) __ctors_start = . ; *(.ctors) __ctors_end = . ; __dtors_start = . ; *(.dtors) __dtors_end = . ; *(.progmem.gcc*) *(.progmem*) . = ALIGN(2); *(.init0) /* Start here after reset. */ *(.init1) *(.init2) /* Clear __zero_reg__, set up stack pointer. */ *(.init3) *(.init4) /* Initialize data and BSS. */ *(.init5) *(.init6) /* C++ constructors. */ *(.init7) *(.init8) *(.init9) /* Call main(). */ *(.text) . = ALIGN(2); *(.text.*) . = ALIGN(2); *(.fini9) /* _exit() starts here. */ *(.fini8) *(.fini7) *(.fini6) /* C++ destructors. */ *(.fini5) *(.fini4) *(.fini3) *(.fini2) *(.fini1) *(.fini0) /* Infinite loop after program termination. */ _etext = . ; 還不大理解.想知道能不能在 *(.progmem.gcc*) *(.progmem*) . = ALIGN(2); *(.init0) /* Start here after reset. */ 之間加個自定義的區(qū)域,可以的話目的就可以達到了 |
|
| 8樓: | >>參與討論 |
| 作者: hudaidai 于 2004/12/29 8:58:00 發(fā)布:
忍不住還是要小聲問一句 為什么非要固定放在0x1000地址呢?有什么意義嗎? |
|
| 9樓: | >>參與討論 |
| 作者: Anitya 于 2004/12/29 9:20:00 發(fā)布:
程序要實現(xiàn)Bootloader, 但是bootloader區(qū)又不夠大,因此想把一些不變的數(shù)據(jù)函數(shù)放在非bootloader區(qū),自編程過程中,通過對地址的制定,跳過這些區(qū)域,實現(xiàn)不改寫的目的. |
|
| 10樓: | >>參與討論 |
| 作者: zsmbj 于 2004/12/29 12:47:00 發(fā)布:
啊?你的BootLoader程序有多大? |
|
| 11樓: | >>參與討論 |
| 作者: Anitya 于 2004/12/29 14:32:00 發(fā)布:
實現(xiàn)Bootloader功能的函數(shù)不大,不到1K 只是還要做些其他的事情.需要用到比較大的配置數(shù)據(jù),才會出現(xiàn)這樣的要求 上午試著改變了 *(.progmem.gcc*) *(.progmem*) 的位置,可以使prog_char定義的數(shù)據(jù)定位在_init前或者數(shù)據(jù)初始化后,下午繼續(xù)努力,或許能達到目的. |
|
| 12樓: | >>參與討論 |
| 作者: hotpower 于 2004/12/29 23:09:00 發(fā)布:
條條思路通水潭,方法泥濘自琢磨... |
|
| 13樓: | >>參與討論 |
| 作者: hudaidai 于 2004/12/30 9:46:00 發(fā)布:
改變連接文件的辦法是正道 不過僅僅從解決問題的角度出發(fā),我也有一個餿主意: 編譯器缺省使用FLASH應該從低地址到高地址,那么我們可以把這段配置數(shù)據(jù)安排在確定的最高地址若干扇區(qū),具體辦法就是正常編譯生成燒片子文件(hex、s19 or bin),然后利用其它辦法在這個文件的末尾添加上自己的數(shù)據(jù)塊。 所謂“其它辦法”,有的編程器就可以實現(xiàn)文件合并,或者可以自己編寫個PC上簡單的小工具,甚至可以直接用編輯器添加。 |
|
| 14樓: | >>參與討論 |
| 作者: 宇宙飛船 于 2004/12/30 14:27:00 發(fā)布:
大家沒看見金子嗎?識貨的人也太少了! |
|
| 15樓: | >>參與討論 |
| 作者: hotpower 于 2004/12/30 22:40:00 發(fā)布:
非典的方法太多了... 最簡單的方法是將代碼藏于沒用的中斷里...中斷向量永遠是公開的... |
|
| 16樓: | >>參與討論 |
| 作者: Anitya 于 2004/12/31 10:19:00 發(fā)布:
我試了幾次. WinAVR自動加入編譯的:中斷向量 + 數(shù)據(jù)區(qū)初始化 長度變化不大,加上把 *(.progmem*) 放在call main()之后,可以把數(shù)據(jù)定義在第3頁以后的任何頁上[當然,在函數(shù)前],不過僅限于數(shù)據(jù).因為不滿一頁的數(shù)據(jù)可以填滿它.投機倒把的做法.對于空間浪費了點. * - 本貼最后修改時間:2004-12-31 10:29:52 修改者:Anitya |
|
| 17樓: | >>參與討論 |
| 作者: hotpower 于 2004/12/31 18:48:00 發(fā)布:
想不通...郁悶之中... |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |