音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網(wǎng)
技術交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術 | 電源技術 | 測控之家 | EMC技術 | ARM技術 | EDA技術 | PCB技術 | 嵌入式系統(tǒng)
驅動編程 | 集成電路 | 器件替換 | 模擬技術 | 新手園地 | 單 片 機 | DSP技術 | MCU技術 | IC 設計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe

WinAvr中如何在flash中為數(shù)據(jù)指定個絕對地址

作者:Anitya 欄目:單片機
WinAvr中如何在FLASH中為數(shù)據(jù)指定個絕對地址
程序中有個數(shù)組,放在FLASH中.定義為
const prog_char data[] = {.......};
我又要確定得指定編譯后data位于FLASH區(qū)0x1000處.
對于data的再次修飾__attribute__((section(".dataarea")))編譯會錯誤.
我查找了__attribute__((__progmem__))定義,可是沒找到.
不知道要實現(xiàn)這樣的要求該如何處理?

2樓: >>參與討論
Anitya
找到了avrn.x文件,可是看不懂:(
 
3樓: >>參與討論
hotpower
我是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
這是生成的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
看了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樓: >>參與討論
宇宙飛船
hotpower 這一貼使得整個AVR 壇子閃閃生輝!
 
7樓: >>參與討論
Anitya
這個是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
忍不住還是要小聲問一句
為什么非要固定放在0x1000地址呢?有什么意義嗎?

9樓: >>參與討論
Anitya
程序要實現(xiàn)Bootloader,
但是bootloader區(qū)又不夠大,因此想把一些不變的數(shù)據(jù)函數(shù)放在非bootloader區(qū),自編程過程中,通過對地址的制定,跳過這些區(qū)域,實現(xiàn)不改寫的目的.

10樓: >>參與討論
zsmbj
啊?你的BootLoader程序有多大?
 
11樓: >>參與討論
Anitya
實現(xiàn)Bootloader功能的函數(shù)不大,不到1K
只是還要做些其他的事情.需要用到比較大的配置數(shù)據(jù),才會出現(xiàn)這樣的要求

上午試著改變了
*(.progmem.gcc*)
*(.progmem*)
的位置,可以使prog_char定義的數(shù)據(jù)定位在_init前或者數(shù)據(jù)初始化后,下午繼續(xù)努力,或許能達到目的.

12樓: >>參與討論
hotpower
條條思路通水潭,方法泥濘自琢磨...
 
13樓: >>參與討論
hudaidai
改變連接文件的辦法是正道
不過僅僅從解決問題的角度出發(fā),我也有一個餿主意:

編譯器缺省使用FLASH應該從低地址到高地址,那么我們可以把這段配置數(shù)據(jù)安排在確定的最高地址若干扇區(qū),具體辦法就是正常編譯生成燒片子文件(hex、s19 or bin),然后利用其它辦法在這個文件的末尾添加上自己的數(shù)據(jù)塊。

所謂“其它辦法”,有的編程器就可以實現(xiàn)文件合并,或者可以自己編寫個PC上簡單的小工具,甚至可以直接用編輯器添加。

14樓: >>參與討論
宇宙飛船
大家沒看見金子嗎?識貨的人也太少了!
 
15樓: >>參與討論
hotpower
非典的方法太多了...
最簡單的方法是將代碼藏于沒用的中斷里...中斷向量永遠是公開的...

16樓: >>參與討論
Anitya
我試了幾次.
WinAVR自動加入編譯的:中斷向量 + 數(shù)據(jù)區(qū)初始化 長度變化不大,加上把
*(.progmem*) 放在call main()之后,可以把數(shù)據(jù)定義在第3頁以后的任何頁上[當然,在函數(shù)前],不過僅限于數(shù)據(jù).因為不滿一頁的數(shù)據(jù)可以填滿它.投機倒把的做法.對于空間浪費了點.

* - 本貼最后修改時間:2004-12-31 10:29:52 修改者:Anitya

17樓: >>參與討論
hotpower
想不通...郁悶之中...
 
參與討論
昵稱:
討論內(nèi)容:
 
 
相關帖子
WinAvr中嵌入?yún)R編如何使用跳轉命令至指定地址?
串口起始位的判別出錯,怎么辦?
M16中讀EEPROM出錯,請高手指教!!
關于數(shù)碼管顯示電磁干擾的問題
avr想愛你怎么這么難!
免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號