Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Scatter файл для Кeil.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
M@RS
В общем проблема как мир старая. Хочу часть флеши SAM7S использовать для хранения настроек. В общем выделяю в конце регион RW_IROM7 и засовываю туда все, что будет в файле flash.c (по идеи в этом файле будет еше функция для записи в флеш сегмента), а пока там есть массив констант. Штудируя форум по примерам в стандартный скаттер добавил свой регион.
Код
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x00100000 0x00040000  { ; load region
  ER_IROM1 0x00100000  0x0003F800{      ; load address = execution address
   *.o (RESET, +First)
   * (+RO)
  }
  RW_IROM7 0x0013F800  0x00000800{      ; load address = execution address
   flash.o(+RO)
  }
  RW_IRAM1 0x00200000 0x00010000  { ; RW data
   * (+RW +ZI)
  }
}

В результате скомпилировал проект, смотрю мап файл. Мои константы лежат в нужном месте.

Код

Execution Region RW_IROM7 (Base: 0x0013f800, Size: 0x00000004, Max: 0x00000800, ABSOLUTE)

    Base Addr    Size         Type   Attr      Idx    E Section Name        Object

    0x0013f800   0x00000003   Data   RO          516    .constdata          flash.o


    Execution Region RW_IRAM1 (Base: 0x00200000, Size: 0x00001320, Max: 0x00010000, ABSOLUTE)


Загоняю в отладчик через JetLink 5 и вижу что по данному адресу во флеши лежат одни FF. Вопрос как-то можно заставить линкер чтобы по этому адресу эти константы были сразу инициализированы?
aaarrr
Цитата(M@RS @ Jun 30 2010, 11:57) *
В общем выделяю в конце регион RW_IROM7 и засовываю туда все, что будет в файле flash.c (по идеи в этом файле будет еше функция для записи в флеш сегмента), а пока там есть массив констант.

Замечательно, только как вы собираетесь потом с этой кашей работать? ИМХО, гораздо удобнее просто скрыть от линкера участок флеш, и работать с ним через структуры и указатели.

Цитата(M@RS @ Jun 30 2010, 11:57) *
Загоняю в отладчик через JetLink 5 и вижу что по данному адресу во флеши лежат одни FF. Вопрос как-то можно заставить линкер чтобы по этому адресу эти константы были сразу инициализированы?

А какие константы объявлены в flash.c? Судя по map-файлу, 3 байта должно быть.
M@RS
Можно и так, но в принципе скажем для отладки было бы неплохо чтобы константы там уже лежали...
А вобще так и будет как вы писали, там вместо массива будут структуры данных. На этом примере пока учусь. В общем хотелось бы их там увидеть во флеши.

Сами константы в файле flash.c.
Код
const unsigned char Mass[3] = {0x00, 0x01, 0x02};
aaarrr
Тогда так:
Код
RW_IROM7 0x0013F800  FIXED 0x00000800

M@RS
Спасибо, сделал но все равно в дебагере по адресу 0x0013f88c лежат одни FF. Может дебагер врет?
После пересоздания проекта константы сместились на новый адрес а линкер добавил код функции записи в флаш. Но пока это не важно.
Код
Execution Region RW_IROM7 (Base: 0x0013f800, Size: 0x00000090, Max: 0x00000800, ABSOLUTE, FIXED)

    Base Addr    Size         Type   Attr      Idx    E Section Name        Object

    0x0013f800   0x0000008c   Code   RO          516    .text               flash.o
    0x0013f88c   0x00000003   Data   RO          517    .constdata          flash.o
aaarrr
Цитата(M@RS @ Jun 30 2010, 13:30) *
Спасибо, сделал но все равно в дебагере по адресу 0x0013f88c лежат одни FF. Может дебагер врет?

А размер бинарника вырос до 0x3f88c+?
M@RS
Бинарник получился всего 64к.
aaarrr
Цитата(M@RS @ Jun 30 2010, 14:31) *
Бинарник получился всего 64к.

Ровно?
M@RS
Ну если винда не врет то:

Размер: 63,9 КБ (65 520 байт)
На диске : 64,0 КБ (65 536 байт)
aaarrr
Подозрительно похоже на ограничение по размеру кода. Полностью map-файл приведите.
M@RS
Вот.
aaarrr
Цитата(aaarrr @ Jun 30 2010, 15:13) *
Подозрительно похоже на ограничение по размеру кода.

Теперь подозрение практически переросло в уверенность.
M@RS
Блин, так вроде лечил Keil, давно правда было может лекарство не подействовало...
Как можно ограничение снять?
M@RS
aaarrr спасибо за помощь. Сегодня с утра на свежую голову обновил версию и "подшаманил" Кеil. Дебаггер показал константы на нужном месте по указному адресу.
Вопрос еще, а можно линкер заставить ложить в мой сегмент только константы, а тело функции в общий для кода и констант?
aaarrr
Цитата(M@RS @ Jul 1 2010, 14:11) *
Вопрос еще, а можно линкер заставить ложить в мой сегмент только константы, а тело функции в общий для кода и констант?

Можно:
Код
*************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x00100000 0x00040000  {; load region
  ER_IROM1 0x00100000  0x0003F800{     ; load address = execution address
   *.o (RESET, +First)
   * (+RO)
  }
  RW_IROM7 0x0013F800  0x00000800{     ; load address = execution address
   flash.o (ro_vars)
  }
  RW_IRAM1 0x00200000 0x00010000  {; RW data
   * (+RW +ZI)
  }
}


Код
#pragma arm section rodata = "ro_vars"
const int bla_bla;
#pragma arm section rodata

M@RS
Спасибо за помощь. Все получилось как хотелось...Буду отлаживать теперь функцию записи во флеш страниц.

Да такой момент...
Раньше на AVR, дублировал критические переменные, от которых зависали работа прибора в EEPROM в трех местах. Как во флеши обстоят дела с хранением (отбрасываем момент когда при записи исчезает питание, это понятно)? Может достаточно двух копий?
aaarrr
Цитата(M@RS @ Jul 1 2010, 14:39) *
Может достаточно двух копий?

Достаточно и одной - не забывайте, что программа живет в той же памяти. Плодить копии имеет смысл только при частом обновлении данных, чтобы сэкономить ресурс флеш.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.