M@RS 0 30 июня, 2010 Опубликовано 30 июня, 2010 · Жалоба В общем проблема как мир старая. Хочу часть флеши 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 69 30 июня, 2010 Опубликовано 30 июня, 2010 · Жалоба В общем выделяю в конце регион RW_IROM7 и засовываю туда все, что будет в файле flash.c (по идеи в этом файле будет еше функция для записи в флеш сегмента), а пока там есть массив констант. Замечательно, только как вы собираетесь потом с этой кашей работать? ИМХО, гораздо удобнее просто скрыть от линкера участок флеш, и работать с ним через структуры и указатели. Загоняю в отладчик через JetLink 5 и вижу что по данному адресу во флеши лежат одни FF. Вопрос как-то можно заставить линкер чтобы по этому адресу эти константы были сразу инициализированы? А какие константы объявлены в flash.c? Судя по map-файлу, 3 байта должно быть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
M@RS 0 30 июня, 2010 Опубликовано 30 июня, 2010 (изменено) · Жалоба Можно и так, но в принципе скажем для отладки было бы неплохо чтобы константы там уже лежали... А вобще так и будет как вы писали, там вместо массива будут структуры данных. На этом примере пока учусь. В общем хотелось бы их там увидеть во флеши. Сами константы в файле flash.c. const unsigned char Mass[3] = {0x00, 0x01, 0x02}; Изменено 30 июня, 2010 пользователем M@RS Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 30 июня, 2010 Опубликовано 30 июня, 2010 · Жалоба Тогда так: RW_IROM7 0x0013F800 FIXED 0x00000800 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
M@RS 0 30 июня, 2010 Опубликовано 30 июня, 2010 (изменено) · Жалоба Спасибо, сделал но все равно в дебагере по адресу 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 Изменено 30 июня, 2010 пользователем M@RS Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 30 июня, 2010 Опубликовано 30 июня, 2010 · Жалоба Спасибо, сделал но все равно в дебагере по адресу 0x0013f88c лежат одни FF. Может дебагер врет? А размер бинарника вырос до 0x3f88c+? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
M@RS 0 30 июня, 2010 Опубликовано 30 июня, 2010 · Жалоба Бинарник получился всего 64к. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 30 июня, 2010 Опубликовано 30 июня, 2010 · Жалоба Бинарник получился всего 64к. Ровно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
M@RS 0 30 июня, 2010 Опубликовано 30 июня, 2010 · Жалоба Ну если винда не врет то: Размер: 63,9 КБ (65 520 байт) На диске : 64,0 КБ (65 536 байт) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 30 июня, 2010 Опубликовано 30 июня, 2010 · Жалоба Подозрительно похоже на ограничение по размеру кода. Полностью map-файл приведите. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
M@RS 0 30 июня, 2010 Опубликовано 30 июня, 2010 · Жалоба Вот. test2.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 30 июня, 2010 Опубликовано 30 июня, 2010 · Жалоба Подозрительно похоже на ограничение по размеру кода. Теперь подозрение практически переросло в уверенность. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
M@RS 0 30 июня, 2010 Опубликовано 30 июня, 2010 (изменено) · Жалоба Блин, так вроде лечил Keil, давно правда было может лекарство не подействовало... Как можно ограничение снять? Изменено 30 июня, 2010 пользователем M@RS Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
M@RS 0 1 июля, 2010 Опубликовано 1 июля, 2010 (изменено) · Жалоба aaarrr спасибо за помощь. Сегодня с утра на свежую голову обновил версию и "подшаманил" Кеil. Дебаггер показал константы на нужном месте по указному адресу. Вопрос еще, а можно линкер заставить ложить в мой сегмент только константы, а тело функции в общий для кода и констант? Изменено 1 июля, 2010 пользователем M@RS Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 1 июля, 2010 Опубликовано 1 июля, 2010 · Жалоба Вопрос еще, а можно линкер заставить ложить в мой сегмент только константы, а тело функции в общий для кода и констант? Можно: ************************************************************* ; *** 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться