Перейти к содержанию
    

Резервирование области памяти праграмм

Каким образом можно зарезервировать участок памяти в области памяти программ, это нужно не для хранения констант, а область к которой будет производится как чтение так и зпись. Хочу организовать большой массив изменяемых данных для ATTiny2313. Поиск решения проблеммы ведет к секциям WinAVR, но что то не совсем понятно каким образом организовать и каким образом, производить доступ

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для этого нужно переписать скрипт линкера. О том, как это делается, рассказано здесь. Если, конечно, используемый Вами пакет соответствует ветке :). Если лень читать первоисточник, то можно пройтись поиском по веткам, посвященным авр и гну утилам - тема весьма старая, поднималась не раз. Успехов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для этого нужно переписать скрипт линкера. О том, как это делается, рассказано здесь. Если, конечно, используемый Вами пакет соответствует ветке :). Если лень читать первоисточник, то можно пройтись поиском по веткам, посвященным авр и гну утилам - тема весьма старая, поднималась не раз. Успехов.

 

И все таки, как я понял в скрипте нужно создать собственную секцию, или ограничить область используемой памяти (MEMORY), если не трудно разъясните пожалуйста

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И все таки, как я понял в скрипте нужно создать собственную секцию, или ограничить область используемой памяти (MEMORY), если не трудно разъясните пожалуйста

Можно и то и то, зависит от того как вы хотите ( как удобнее) использовать эту область!

Если там буду хранится например, структуры с параметрами - лучше вынести в секцию.

Если просто массив данных и нужен только адрес - то можно и ограничить линкеру эту область.

 

А где вы хотите орагнизовать БОЛЬШОЙ массив данных? в 2313 же 2 кб флеша всего.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

что то не совсем понятно каким образом организовать и каким образом, производить доступ

 

Опишите структуру

typedef struct
{
*** Здесь все содержимое блока ***
} reserved_block_t;
extern PROGMEM reserved_block_t reserved_block;

После чего Вам не надо ни секций ни каких-либо усложнений по адресной математике.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно и то и то, зависит от того как вы хотите ( как удобнее) использовать эту область!

Если там буду хранится например, структуры с параметрами - лучше вынести в секцию.

Если просто массив данных и нужен только адрес - то можно и ограничить линкеру эту область.

 

А где вы хотите орагнизовать БОЛЬШОЙ массив данных? в 2313 же 2 кб флеша всего.

 

C ограничением области ясно, а вот с секцией не совсем, какое удобство мне принесет секция? В принципе мне то достаточно хранить массив (большой в смысле большой для 2312), в этот массив программа из UART будет записывать данные, а потом при необходимости считывать, это все городится что бы не использовать внешнюю ЕПРОМ, массив будет где то 256 - 512 байт. Подскажите какое удобство даст описание своей секции во флеше?

 

 

Опишите структуру

typedef struct
{
*** Здесь все содержимое блока ***
} reserved_block_t;
extern PROGMEM reserved_block_t reserved_block;

После чего Вам не надо ни секций ни каких-либо усложнений по адресной математике.

А каким же образом в эту структуру запись производить???

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Почитайте про самопрограммирование или бутлоадеры. Там есть запись в область программ.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Почитайте про самопрограммирование или бутлоадеры. Там есть запись в область программ.

Самопрограммирование мне понятно, я уже и функции написал соответствующие. Вопрос заключается в том каким образом выделить участок флеша с известным адресом и выравненный по границе страницы (в 2313 размер страницы 16 байт)

 

Я понял что можно ограничить, в скрипте линкера, максимально доступный флеш, а в оставшейся части разместить свои данные, которые я буду и читать и писать.

 

Но интересно как еще можно это сделать (например секцию свою создать), или как то еще?

 

Нужен конкретный пример или конкретный совет

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нужен конкретный пример или конкретный совет

Конкретно с 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;

Примерно так.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Конкретно с AVR не работал, на сколько я понимаю, у WinAVR есть скрипты линкеры под конкретные микроконтроллеры.

Найдите тот, что для Вашего.

Найдите в нем описание секции .text

Там все есть, в скриптах. Так что искать не надо.

Работа с чтением ПП в файле avr/pgmspace.h

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за ответы , по немногу все проясняется, буду пробовать.

 

 

 

Попутный вопрос. Если написать свой скрипт линкера, где его помещать и как указать линкеру что использовать нужно этот скрипт?

 

И еще, попробовал переименовать папку со скриптами, что бы линкер не нашел файл и сказал какой скрипт ищет, но ни чего не вышло, как узнать какой скрипт линкера по умолчанию?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попутный вопрос. Если написать свой скрипт линкера, где его помещать и как указать линкеру что использовать нужно этот скрипт?
Читать и читать и читать документацию. Скрипт линкеру (ld.exe) указывается через ключ -T. Если линкер вызывается через gcc.exe, то ключи линкеру передаются через ключ -Wl, соответственно получится -Wl,-T,<имя файла>
И еще, попробовал переименовать папку со скриптами, что бы линкер не нашел файл и сказал какой скрипт ищет, но ни чего не вышло, как узнать какой скрипт линкера по умолчанию?
Значит вы переименовали не тут папку.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Значит вы переименовали не тут папку.

WinAvr\avr\lib\ldscripts

Это та папка которую я переименовал, это не правильно?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

WinAvr\avr\lib\ldscripts

Это та папка которую я переименовал, это не правильно?

Правильно. Может у вас несколько WinAVRов стоит?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Правильно. Может у вас несколько WinAVRов стоит?

Значитца так... программу пишу и отлаживаю в AvrStudio, WinAVR стоит один, может это происходит из за AvrStudio, может она свои скрипты какие то назначает?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...