Цитата(kurtis @ May 14 2008, 16:55)

а можно по подробнее про это, а то я в документации ничего о секции .xdata/.xbss ???
Я малость отвлёкся...
В документации ничего про них и нет.
Есть про то, как их _добавить_ :-)
Пришлось немного попинать один старый проект - тогда вроде бы всё работало (хотя дело давно было, я уж не помню, может я и вручную что-то допиливал), а сейчас шалить начало.
Переделал немного скрипт, как в темах
http://electronix.ru/forum/lofiversion/index.php/t46152.htmlhttp://electronix.ru/forum/lofiversion/index.php/t44607.htmlСергей Борщ советовал, внёс в него изменения, которые за это время у avr-gcc появились в скриптах по умолчанию (KEEP в основном) - компилируется и по .map да дизассемблеру выглядит правдоподобно, самой платки под рукой нет, проверить не могу.
"Значит вот как дело было, наша славная кобыла" (С) песня "Конный спорт" из цикла "Спортлото"
имела на борту мегу162 и 32К ОЗУ в старшей половине адресного пространства.
Сейчас это собирается WinAVR-20060421, 20070525, 20071221 и выглядит так:
В линкерном скрипте добавлено и изменено по рекомендациям из указанных выше тем
Код
MEMORY
{
text (rx) : ORIGIN = 0, LENGTH = 16K
data (rw!x) : ORIGIN = 0x800100, LENGTH = 1K
eeprom (rw!x) : ORIGIN = 0x810000, LENGTH = 512
/* sections xdata and xbss */
xdata (rw!x) : ORIGIN = 0x808000, LENGTH = 32K
}
и дальше после описания .noinit вставлено
CODE
.data :
{
PROVIDE (__data_start = .);
*(.data)
*(.data*)
*(.rodata) /* We need to include .rodata here if gcc is used */
*(.rodata*) /* with -fdata-sections. */
*(.gnu.linkonce.d*)
. = ALIGN(2);
_edata = .;
PROVIDE (__data_end = .);
} > data AT > text
.bss :
{
PROVIDE (__bss_start = .);
*(.bss)
*(.bss*)
*(COMMON)
PROVIDE (__bss_end = .);
} > data
__data_load_start = LOADADDR(.data);
__data_load_end = __data_load_start + SIZEOF(.data);
/* Global data not cleared after reset. */
.noinit :
{
PROVIDE (__noinit_start = .);
*(.noinit*)
PROVIDE (__noinit_end = .);
_end = .;
} > data
.xdata :
{
PROVIDE (__xdata_start = .);
*(.xdata*)
. = ALIGN(2);
PROVIDE (__xdata_end = .);
} > xdata AT > text
__xdata_load_start = LOADADDR(.xdata);
__xdata_load_end = __xdata_load_start + SIZEOF(.xdata);
.xbss (NOLOAD) :
{
PROVIDE (__xbss_start = .);
*(.xbss)
PROVIDE (__xbss_end = .);
__heap_start = .; /* у меня этого не было, кучей не пользовался */
} > xdata
__heap_end = 0x80FFFF; /* аналогично */
Таким образом просто объявленные переменные и стек размещаются во внутреннем ОЗУ.
Специально помеченные и куча - снаружи.
Код
#define XDATA __attribute__((section(".xdata")))
#define XBSS __attribute__((section(".xbss")))
extern const prog_uint8_t __xdata_load_start, __xdata_load_end;
extern uint8_t __xdata_start, __xdata_end;
...
uint8_t XBSS tx_data_buf[MAX_TX_BUF_SIZE];
uint8_t XDATA test[] = { 1, 3, 5};
...
INIT_CODE(3)
{
// XMEM interface - one sector, fastest access, bus-keepers enabled
MCUCR = MCUCR_MEM_MODE; // also LOW level INT0, INT1
EMCUCR = EMCUCR_MEM_MODE; // also fallng edge INT2
SFIOR = SFIOR_XMEM_MODE;
/* копирование образа .xbss из флеша во внешнее ОЗУ */
uint8_t *px = &__xdata_start;
const prog_uint8_t *pf = &__xdata_load_start;
uint16_t len = &__xdata_end - &__xdata_start;
while(len--) {
*px++ = pgm_read_byte( pf);
++pf;
}
}
INIT_CODE(3) - код, помещаемый в секцию .init3, см хвост темы
http://electronix.ru/forum/lofiversion/index.php/t42970.htmlМожно и зануление .xbss сделать, но это долго и мне было не нужно - там были только массивы буферов, а управляющие структуры к ним
а) внутри
б) всё равно инициализировались вручную
У меня и .xdata не было, это только сейчас добавил для полноты.