| 
  |||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe  | 
  
請教GCC問題 | 
  
| 作者:BitFu 欄目:單片機(jī) | 
在WINAVR里如何定義和初始化EEPROM數(shù)據(jù),使它生成*_E.HEX文件? 還有一個(gè)問題就是,EEPROM操作API的地址參數(shù)直接給數(shù)據(jù)如: EEPROM_read_byte((unsigned CHAR *)1); 就會有警告,為什么? 而若給變量地址 如 : unsigned CHAR EVAL __attribute__((section(".EEPROM"))); EEPROM_read_byte(&EVAL); 就沒有警告但是 這時(shí)&EVAL的值總是大于0X80為什么?  | 
  
| 2樓: | >>參與討論 | 
| 作者: BitFu 于 2003/12/23 18:28:00 發(fā)布:
         自己頂!  | 
  |
| 3樓: | >>參與討論 | 
| 作者: john_lee 于 2003/12/24 15:24:00 發(fā)布:
         回答 定義EEPROM數(shù)據(jù)只能在變量名后加__attribute__((section(".EEPROM"))),就象你寫的那樣,如果要初始化,就和一般的變量定義一樣,賦個(gè)初值就可以了,例如:unsigned CHAR EVAL __attribute__((section(".EEPROM"))) = 20; 要生成含有EEPROM數(shù)據(jù)的hex文件,只要執(zhí)行:“avr-objcopy -O ihex -j .EEPROM INPUTFILE OUTPUTFILE” 但要注意,如果生成的hex文件里有這樣一行“:02000004008179”的話,要把這一行刪掉。 編譯警告應(yīng)該不會有,不知道你遇到的警告是什么? &EVAL的值是肯定>0x80的,而且是>=0x810000的,因?yàn)間cc本身只支持統(tǒng)一的地址空間尋址,不支持象AVR,51等非線性空間的數(shù)據(jù)訪問(代碼地址和數(shù)據(jù)地址有重疊,但空間不同,特別是訪問各個(gè)存儲空間的指令都不同),為了讓gcc支持avr,把gcc移植到AVR的那個(gè)人,將avr的各個(gè)存儲空間重新依次排列: FLASH rom -> 0x000000 REGS & I/O & RAM -> 0x800000 EEPROM -> 0x810000 這樣,所有的地址空間就都是線性的了(地址的有效部分仍然與各實(shí)際空間對應(yīng)),但這樣做僅能解決連接器(ld)定址的問題,還不能解決不同的尋址指令的問題,所以,只有使用宏、內(nèi)嵌匯編指令和函數(shù)的方式來解決(pgm_read_*,EEPROM_read_*之類)。  | 
  |
| 4樓: | >>參與討論 | 
| 作者: tczgg 于 2003/12/24 17:08:00 發(fā)布:
         多謝,又學(xué)了一招  | 
  |
  | 
    
 
  | 
  
| 免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 | 
Copyright © 1998-2006 www.udpf.com.cn 浙ICP證030469號  |