|
Резервирование области памяти праграмм |
|
|
|
Apr 24 2009, 19:56
|
Группа: Новичок
Сообщений: 12
Регистрация: 24-04-09
Из: UA,Харьков
Пользователь №: 48 229

|
Каким образом можно зарезервировать участок памяти в области памяти программ, это нужно не для хранения констант, а область к которой будет производится как чтение так и зпись. Хочу организовать большой массив изменяемых данных для ATTiny2313. Поиск решения проблеммы ведет к секциям WinAVR, но что то не совсем понятно каким образом организовать и каким образом, производить доступ
|
|
|
|
|
Apr 24 2009, 22:05
|
Частый гость
 
Группа: Свой
Сообщений: 172
Регистрация: 5-08-06
Из: Владивосток
Пользователь №: 19 343

|
Для этого нужно переписать скрипт линкера. О том, как это делается, рассказано здесь. Если, конечно, используемый Вами пакет соответствует ветке  . Если лень читать первоисточник, то можно пройтись поиском по веткам, посвященным авр и гну утилам - тема весьма старая, поднималась не раз. Успехов.
|
|
|
|
|
Apr 25 2009, 20:03
|
Группа: Новичок
Сообщений: 12
Регистрация: 24-04-09
Из: UA,Харьков
Пользователь №: 48 229

|
Цитата(Leen @ Apr 25 2009, 01:05)  Для этого нужно переписать скрипт линкера. О том, как это делается, рассказано здесь. Если, конечно, используемый Вами пакет соответствует ветке  . Если лень читать первоисточник, то можно пройтись поиском по веткам, посвященным авр и гну утилам - тема весьма старая, поднималась не раз. Успехов. И все таки, как я понял в скрипте нужно создать собственную секцию, или ограничить область используемой памяти (MEMORY), если не трудно разъясните пожалуйста
|
|
|
|
|
Apr 25 2009, 21:20
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555

|
Цитата(Airy @ Apr 26 2009, 00:03)  И все таки, как я понял в скрипте нужно создать собственную секцию, или ограничить область используемой памяти (MEMORY), если не трудно разъясните пожалуйста Можно и то и то, зависит от того как вы хотите ( как удобнее) использовать эту область! Если там буду хранится например, структуры с параметрами - лучше вынести в секцию. Если просто массив данных и нужен только адрес - то можно и ограничить линкеру эту область. А где вы хотите орагнизовать БОЛЬШОЙ массив данных? в 2313 же 2 кб флеша всего.
|
|
|
|
|
Apr 26 2009, 05:34
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(Airy @ Apr 24 2009, 22:56)  что то не совсем понятно каким образом организовать и каким образом, производить доступ Опишите структуру Код typedef struct { *** Здесь все содержимое блока *** } reserved_block_t; extern PROGMEM reserved_block_t reserved_block; После чего Вам не надо ни секций ни каких-либо усложнений по адресной математике.
|
|
|
|
|
Apr 26 2009, 14:29
|
Группа: Новичок
Сообщений: 12
Регистрация: 24-04-09
Из: UA,Харьков
Пользователь №: 48 229

|
Цитата(KRS @ Apr 26 2009, 00:20)  Можно и то и то, зависит от того как вы хотите ( как удобнее) использовать эту область! Если там буду хранится например, структуры с параметрами - лучше вынести в секцию. Если просто массив данных и нужен только адрес - то можно и ограничить линкеру эту область. А где вы хотите орагнизовать БОЛЬШОЙ массив данных? в 2313 же 2 кб флеша всего. C ограничением области ясно, а вот с секцией не совсем, какое удобство мне принесет секция? В принципе мне то достаточно хранить массив (большой в смысле большой для 2312), в этот массив программа из UART будет записывать данные, а потом при необходимости считывать, это все городится что бы не использовать внешнюю ЕПРОМ, массив будет где то 256 - 512 байт. Подскажите какое удобство даст описание своей секции во флеше? Цитата(_Pasha @ Apr 26 2009, 08:34)  Опишите структуру Код typedef struct { *** Здесь все содержимое блока *** } reserved_block_t; extern PROGMEM reserved_block_t reserved_block; После чего Вам не надо ни секций ни каких-либо усложнений по адресной математике. А каким же образом в эту структуру запись производить???
|
|
|
|
|
Apr 26 2009, 17:47
|
Группа: Новичок
Сообщений: 12
Регистрация: 24-04-09
Из: UA,Харьков
Пользователь №: 48 229

|
Цитата(Deka @ Apr 26 2009, 18:14)  Почитайте про самопрограммирование или бутлоадеры. Там есть запись в область программ. Самопрограммирование мне понятно, я уже и функции написал соответствующие. Вопрос заключается в том каким образом выделить участок флеша с известным адресом и выравненный по границе страницы (в 2313 размер страницы 16 байт) Я понял что можно ограничить, в скрипте линкера, максимально доступный флеш, а в оставшейся части разместить свои данные, которые я буду и читать и писать. Но интересно как еще можно это сделать (например секцию свою создать), или как то еще? Нужен конкретный пример или конкретный совет
|
|
|
|
|
Apr 27 2009, 06:42
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
Цитата(Airy @ Apr 26 2009, 20:47)  Нужен конкретный пример или конкретный совет Конкретно с AVR не работал, на сколько я понимаю, у WinAVR есть скрипты линкеры под конкретные микроконтроллеры. Найдите тот, что для Вашего. Найдите в нем описание секции .text Незнаю, как выглядит ее описание в Вашем случае, но это будет что-то похоже на Код .text : { *(.text .stub .text.* .gnu.linkonce.t.*) KEEP (*(.text.*personality*)) } Предположим Вам нужно зарезервировать 512 байт в конце секции. Размер флеша (как я понял 2048К) Код .text : { *(.text .stub .text.* .gnu.linkonce.t.*) KEEP (*(.text.*personality*)) . = 1536; KEEP(*(.my_data*)) } Строка . = 1536 Говорит, что текущий указатель смещается в позицию 1536 байт от начала секции. Строка KEEP(*(.my_data*)) говорит, что дальше следует размещать все переменные, константы, ф-ции и т.п. (в терминах LD - символы) из секции с именем .my_data Размещение структуры в этой секции Код #define MY_ARRAY_SIZE 510 typedef struct { short datasize; char myarray[MY_ARRAY_SIZE]; } __attribute__((section(".my_data"))) My_Struct_t;
My_Struct_t my_struct; Примерно так.
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
|
Apr 27 2009, 08:47
|
Группа: Новичок
Сообщений: 12
Регистрация: 24-04-09
Из: UA,Харьков
Пользователь №: 48 229

|
Спасибо за ответы , по немногу все проясняется, буду пробовать.
Попутный вопрос. Если написать свой скрипт линкера, где его помещать и как указать линкеру что использовать нужно этот скрипт?
И еще, попробовал переименовать папку со скриптами, что бы линкер не нашел файл и сказал какой скрипт ищет, но ни чего не вышло, как узнать какой скрипт линкера по умолчанию?
|
|
|
|
|
Apr 27 2009, 10:05
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Airy @ Apr 27 2009, 11:47)  Попутный вопрос. Если написать свой скрипт линкера, где его помещать и как указать линкеру что использовать нужно этот скрипт? Читать и читать и читать документацию. Скрипт линкеру (ld.exe) указывается через ключ -T. Если линкер вызывается через gcc.exe, то ключи линкеру передаются через ключ -Wl, соответственно получится -Wl,-T,<имя файла> Цитата(Airy @ Apr 27 2009, 11:47)  И еще, попробовал переименовать папку со скриптами, что бы линкер не нашел файл и сказал какой скрипт ищет, но ни чего не вышло, как узнать какой скрипт линкера по умолчанию? Значит вы переименовали не тут папку.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Apr 27 2009, 11:21
|
Группа: Новичок
Сообщений: 12
Регистрация: 24-04-09
Из: UA,Харьков
Пользователь №: 48 229

|
Цитата(Сергей Борщ @ Apr 27 2009, 13:05)  Значит вы переименовали не тут папку. WinAvr\avr\lib\ldscripts Это та папка которую я переименовал, это не правильно?
|
|
|
|
|
Apr 27 2009, 11:58
|
Группа: Новичок
Сообщений: 12
Регистрация: 24-04-09
Из: UA,Харьков
Пользователь №: 48 229

|
Цитата(Сергей Борщ @ Apr 27 2009, 14:37)  Правильно. Может у вас несколько WinAVRов стоит? Значитца так... программу пишу и отлаживаю в AvrStudio, WinAVR стоит один, может это происходит из за AvrStudio, может она свои скрипты какие то назначает?
|
|
|
|
|
Apr 27 2009, 14:14
|
Группа: Новичок
Сообщений: 12
Регистрация: 24-04-09
Из: UA,Харьков
Пользователь №: 48 229

|
Блин!!! Удаляю папку, переименовываю, что угодно с ней делаю, все равно работает и линкует
|
|
|
|
|
Apr 27 2009, 15:42
|
Группа: Новичок
Сообщений: 12
Регистрация: 24-04-09
Из: UA,Харьков
Пользователь №: 48 229

|
Цитата(mdmitry @ Apr 27 2009, 17:31)  Попробуйте собрать не из студии, а с помощью make из командной строки. В этом случае Вы получаете полный контроль над сборкой, используя makefile. Только сделайте makefile сами, а не используйте сгенерированный студией. Посмотрите, не насовала ли студия в Ваш каталог с проектом каких-либо файлов для сборки. Уже сделал. Ни фига. Мэйкфайл создал в утилитке к WINAVR с одноименным названием, Из Programmers Notepad запустил сборку, собирал все в отдельном каталоге, в смысле скопировал исходники из папки где со студией работал в другую, эффект тот же, переиминовывай удаляй скрипты все до лампочки ... ??? Удалил все файлы со скриптами, результат тот же??? Что делать? В папке с набором скриптов есть скрипты для различных случаев линковки, я так понимаю у меня "normal executables" а контроллер ATTINY2313 принадлежит к avr2 классу попробую изменить этот скрипт. Скопирую его в папку с проектом, переименую и укажу его линкеру явно. Я правильно делаю? Какие предложения еще, господа???
|
|
|
|
|
Apr 28 2009, 11:40
|

Местный
  
Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091

|
Цитата(Airy @ Apr 27 2009, 20:42)  ...переиминовывай удаляй скрипты все до лампочки ... ??? Удалил все файлы со скриптами, результат тот же??? Что делать? Позвольте узнать, а в чем цель всех этих странных действий? Зачем удалять или переименовывать файлы? Поскольку цель неясна, трудно ответить, что делать... Если честно, вопрос напоминает что-то типа: "Стреляю себе в ногу, а мне не больно. Пробовал из пистолета, из автомата, из огнемета - все равно могу ходить. Что делать?".
--------------------
Всего наилучшего, Alex Mogilnikov
|
|
|
|
|
Apr 28 2009, 16:55
|
Группа: Новичок
Сообщений: 12
Регистрация: 24-04-09
Из: UA,Харьков
Пользователь №: 48 229

|
Цитата(alx2 @ Apr 28 2009, 14:40)  Позвольте узнать, а в чем цель всех этих странных действий? Зачем удалять или переименовывать файлы? Поскольку цель неясна, трудно ответить, что делать... Если честно, вопрос напоминает что-то типа: "Стреляю себе в ногу, а мне не больно. Пробовал из пистолета, из автомата, из огнемета - все равно могу ходить. Что делать?".  По моему цель ясна, если прочитать всю ветку. Для тех кто не читал: Необходимо в Атини2313 выделить участок во флеше размером 512 байт, с известным адресом и варавниванием на границу страницы (16 байт), для того что бы прога там могла записывать данные и считывать конечно. Для этого необходимо внести в скрипт изменения. Как узнать какой скрипт линкера? В лоб - изменить имя папки со скриптами линкер ругнется "мол файл такой то отсутствует" посмотрю какой, его и буду менять, конечно же предварительно скопировав и переименовал что бы не путаться. Задача в принципе решена уже, скрипт вытянул, правда какой определил не в лоб, а по лбу :-) добавил секцию и разместил её по нужному адресу, создал массив с атрибутом указывающим хранить его в этой секции. Спасибо всем,и отдельно тем кто отвечал по существу!!!
|
|
|
|
|
Apr 29 2009, 09:32
|

Местный
  
Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091

|
Цитата(Airy @ Apr 28 2009, 21:55)  По моему цель ясна, если прочитать всю ветку. Для тех кто не читал: Необходимо в Атини2313 выделить участок во флеше размером 512 байт, с известным адресом и варавниванием на границу страницы (16 байт), для того что бы прога там могла записывать данные и считывать конечно. Для этого необходимо внести в скрипт изменения. Как узнать какой скрипт линкера? А зачем его узнавать-то? Нужно просто дать линкеру другой (свой собственный) скрипт. Как дать линкеру нужный скрипт, в этой ветке уже писали (для тех кто не читал: с помощью опции -T). А вносить изменения в файлы из состава binutils - очень плохая идея. Хотя бы потому что после любой переустановки binutils измененный файл снова перепишется исходным (дистрибутивным), и внесенные в него изменения пропадут. Право же, мне кажется, Вы тратите свое время на совершенно ненужные вещи.
Сообщение отредактировал alx2 - Apr 29 2009, 09:41
--------------------
Всего наилучшего, Alex Mogilnikov
|
|
|
|
|
Apr 29 2009, 14:31
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
Цитата(SysRq @ Apr 29 2009, 12:55)  Чтобы взять за основу, очевидно Внести изменения, использовать затем. Код avr-ld --verbose > default.lds В начале вывода будет общая инфа. Ее нужно удалить. Собственно скрип начинается со строки Код * Default linker script, for normal executables */ В конце удалить все строки после последней закрывающей скобки PS: Скрипт по умолчанию намертво вкомпилен в ld. Это не файл. Либо Вы укажете свой скрипт опцией -T<file_name> либо будет использоватся дефолтный.
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|