Цитата(Serg79 @ Sep 27 2006, 13:53)

Цитата(otrog @ Sep 27 2006, 13:10)

Для IAR-а делал так:
Код
#define r_mode (* (char *) 0x8000) /* Declare a memory mapped I/O address*/
Попробуйте так:
Код
#define flag (* (char *) 0x0110) /* Declare a memory mapped I/O address*/
Это то же самое что и
Код
#define _MMIO_BYTE(mem_addr) (*(volatile uint8_t *)(mem_addr))
...
А мне надо имеено зарезервировать участок памяти определенного размера и по определенному адрессу. И что бы компилятор не использовал больше этот диапозон памяти под свои нужды.
Может кто знает как сдвинуть ".data" секцию вниз на пример на 8 байтов. Что бы скажем она уже начиналась не с адреса 0х0100 а с 0х0108.
Вообще-то этим занимается не компилятор а компоновщик (linker). Соответственно все эти секции настраиваются в файле .xcl. А затем дефайном на зарезервированный участок.
Код
#define my_sect 0x....
....
char *ptr = (char *)my_sect;
Кстати, вот фрагмент такого файла (для нестандартной mega103):
Код
-D_..X_INTVEC_SIZE=60 /* 24 Interrupt vectors * 4 bytes each */
-D_..X_FLASH_TEND=FF /* End of tiny flash memory */
-D_..X_FLASH_NEND=FFFF /* End of near flash memory */
-D_..X_FLASH_END=1FFFF /* End of flash memory */
/* Internal data memory */
-D_..X_SRAM_BASE=da00 /* Start of ram memory */
-D_..X_SRAM_TEND=daFF /* End of tiny ram memory */
-D_..X_SRAM_END=dfff /* End of ram memory */
/* Internal EEPROM */
-D_..X_EEPROM_END=FFF /* End of eeprom memory */
За счет этих строк компилятор использует ОЗУ, начиная с адреса 0xda00. А вот строки из программы:
включаемый файл:
Код
//memory definition
#define mem_endP0In 0xc000
#define mem_endP0Out 0xc010
программа:
Код
volatile usb_ctrlrequest_t *usb_ctrl_req;
...
usb_ctrl_req=(usb_ctrlrequest_t *)mem_endP0In;
PS. На конкретные значения адресов не удивляйтесь, это не реальный контроллер, а ядро в ASIC-е