Airy 0 24 апреля, 2009 Опубликовано 24 апреля, 2009 · Жалоба Каким образом можно зарезервировать участок памяти в области памяти программ, это нужно не для хранения констант, а область к которой будет производится как чтение так и зпись. Хочу организовать большой массив изменяемых данных для ATTiny2313. Поиск решения проблеммы ведет к секциям WinAVR, но что то не совсем понятно каким образом организовать и каким образом, производить доступ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
leen 0 24 апреля, 2009 Опубликовано 24 апреля, 2009 · Жалоба Для этого нужно переписать скрипт линкера. О том, как это делается, рассказано здесь. Если, конечно, используемый Вами пакет соответствует ветке :). Если лень читать первоисточник, то можно пройтись поиском по веткам, посвященным авр и гну утилам - тема весьма старая, поднималась не раз. Успехов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Airy 0 25 апреля, 2009 Опубликовано 25 апреля, 2009 · Жалоба Для этого нужно переписать скрипт линкера. О том, как это делается, рассказано здесь. Если, конечно, используемый Вами пакет соответствует ветке :). Если лень читать первоисточник, то можно пройтись поиском по веткам, посвященным авр и гну утилам - тема весьма старая, поднималась не раз. Успехов. И все таки, как я понял в скрипте нужно создать собственную секцию, или ограничить область используемой памяти (MEMORY), если не трудно разъясните пожалуйста Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 0 25 апреля, 2009 Опубликовано 25 апреля, 2009 · Жалоба И все таки, как я понял в скрипте нужно создать собственную секцию, или ограничить область используемой памяти (MEMORY), если не трудно разъясните пожалуйста Можно и то и то, зависит от того как вы хотите ( как удобнее) использовать эту область! Если там буду хранится например, структуры с параметрами - лучше вынести в секцию. Если просто массив данных и нужен только адрес - то можно и ограничить линкеру эту область. А где вы хотите орагнизовать БОЛЬШОЙ массив данных? в 2313 же 2 кб флеша всего. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 26 апреля, 2009 Опубликовано 26 апреля, 2009 · Жалоба что то не совсем понятно каким образом организовать и каким образом, производить доступ Опишите структуру typedef struct { *** Здесь все содержимое блока *** } reserved_block_t; extern PROGMEM reserved_block_t reserved_block; После чего Вам не надо ни секций ни каких-либо усложнений по адресной математике. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Airy 0 26 апреля, 2009 Опубликовано 26 апреля, 2009 · Жалоба Можно и то и то, зависит от того как вы хотите ( как удобнее) использовать эту область! Если там буду хранится например, структуры с параметрами - лучше вынести в секцию. Если просто массив данных и нужен только адрес - то можно и ограничить линкеру эту область. А где вы хотите орагнизовать БОЛЬШОЙ массив данных? в 2313 же 2 кб флеша всего. C ограничением области ясно, а вот с секцией не совсем, какое удобство мне принесет секция? В принципе мне то достаточно хранить массив (большой в смысле большой для 2312), в этот массив программа из UART будет записывать данные, а потом при необходимости считывать, это все городится что бы не использовать внешнюю ЕПРОМ, массив будет где то 256 - 512 байт. Подскажите какое удобство даст описание своей секции во флеше? Опишите структуру typedef struct { *** Здесь все содержимое блока *** } reserved_block_t; extern PROGMEM reserved_block_t reserved_block; После чего Вам не надо ни секций ни каких-либо усложнений по адресной математике. А каким же образом в эту структуру запись производить??? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Deka 0 26 апреля, 2009 Опубликовано 26 апреля, 2009 · Жалоба Почитайте про самопрограммирование или бутлоадеры. Там есть запись в область программ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Airy 0 26 апреля, 2009 Опубликовано 26 апреля, 2009 · Жалоба Почитайте про самопрограммирование или бутлоадеры. Там есть запись в область программ. Самопрограммирование мне понятно, я уже и функции написал соответствующие. Вопрос заключается в том каким образом выделить участок флеша с известным адресом и выравненный по границе страницы (в 2313 размер страницы 16 байт) Я понял что можно ограничить, в скрипте линкера, максимально доступный флеш, а в оставшейся части разместить свои данные, которые я буду и читать и писать. Но интересно как еще можно это сделать (например секцию свою создать), или как то еще? Нужен конкретный пример или конкретный совет Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
amw 0 27 апреля, 2009 Опубликовано 27 апреля, 2009 · Жалоба Нужен конкретный пример или конкретный совет Конкретно с 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; Примерно так. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 27 апреля, 2009 Опубликовано 27 апреля, 2009 · Жалоба Конкретно с AVR не работал, на сколько я понимаю, у WinAVR есть скрипты линкеры под конкретные микроконтроллеры. Найдите тот, что для Вашего. Найдите в нем описание секции .text Там все есть, в скриптах. Так что искать не надо. Работа с чтением ПП в файле avr/pgmspace.h Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Airy 0 27 апреля, 2009 Опубликовано 27 апреля, 2009 · Жалоба Спасибо за ответы , по немногу все проясняется, буду пробовать. Попутный вопрос. Если написать свой скрипт линкера, где его помещать и как указать линкеру что использовать нужно этот скрипт? И еще, попробовал переименовать папку со скриптами, что бы линкер не нашел файл и сказал какой скрипт ищет, но ни чего не вышло, как узнать какой скрипт линкера по умолчанию? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 121 27 апреля, 2009 Опубликовано 27 апреля, 2009 · Жалоба Попутный вопрос. Если написать свой скрипт линкера, где его помещать и как указать линкеру что использовать нужно этот скрипт?Читать и читать и читать документацию. Скрипт линкеру (ld.exe) указывается через ключ -T. Если линкер вызывается через gcc.exe, то ключи линкеру передаются через ключ -Wl, соответственно получится -Wl,-T,<имя файла> И еще, попробовал переименовать папку со скриптами, что бы линкер не нашел файл и сказал какой скрипт ищет, но ни чего не вышло, как узнать какой скрипт линкера по умолчанию?Значит вы переименовали не тут папку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Airy 0 27 апреля, 2009 Опубликовано 27 апреля, 2009 · Жалоба Значит вы переименовали не тут папку. WinAvr\avr\lib\ldscripts Это та папка которую я переименовал, это не правильно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 121 27 апреля, 2009 Опубликовано 27 апреля, 2009 · Жалоба WinAvr\avr\lib\ldscripts Это та папка которую я переименовал, это не правильно? Правильно. Может у вас несколько WinAVRов стоит? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Airy 0 27 апреля, 2009 Опубликовано 27 апреля, 2009 · Жалоба Правильно. Может у вас несколько WinAVRов стоит? Значитца так... программу пишу и отлаживаю в AvrStudio, WinAVR стоит один, может это происходит из за AvrStudio, может она свои скрипты какие то назначает? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться