реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Резервирование области памяти праграмм
Airy
сообщение Apr 24 2009, 19:56
Сообщение #1





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



Каким образом можно зарезервировать участок памяти в области памяти программ, это нужно не для хранения констант, а область к которой будет производится как чтение так и зпись. Хочу организовать большой массив изменяемых данных для ATTiny2313. Поиск решения проблеммы ведет к секциям WinAVR, но что то не совсем понятно каким образом организовать и каким образом, производить доступ
Go to the top of the page
 
+Quote Post
Leen
сообщение Apr 24 2009, 22:05
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 172
Регистрация: 5-08-06
Из: Владивосток
Пользователь №: 19 343



Для этого нужно переписать скрипт линкера. О том, как это делается, рассказано здесь. Если, конечно, используемый Вами пакет соответствует ветке smile.gif. Если лень читать первоисточник, то можно пройтись поиском по веткам, посвященным авр и гну утилам - тема весьма старая, поднималась не раз. Успехов.
Go to the top of the page
 
+Quote Post
Airy
сообщение Apr 25 2009, 20:03
Сообщение #3





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



Цитата(Leen @ Apr 25 2009, 01:05) *
Для этого нужно переписать скрипт линкера. О том, как это делается, рассказано здесь. Если, конечно, используемый Вами пакет соответствует ветке smile.gif. Если лень читать первоисточник, то можно пройтись поиском по веткам, посвященным авр и гну утилам - тема весьма старая, поднималась не раз. Успехов.


И все таки, как я понял в скрипте нужно создать собственную секцию, или ограничить область используемой памяти (MEMORY), если не трудно разъясните пожалуйста
Go to the top of the page
 
+Quote Post
KRS
сообщение Apr 25 2009, 21:20
Сообщение #4


Профессионал
*****

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



Цитата(Airy @ Apr 26 2009, 00:03) *
И все таки, как я понял в скрипте нужно создать собственную секцию, или ограничить область используемой памяти (MEMORY), если не трудно разъясните пожалуйста

Можно и то и то, зависит от того как вы хотите ( как удобнее) использовать эту область!
Если там буду хранится например, структуры с параметрами - лучше вынести в секцию.
Если просто массив данных и нужен только адрес - то можно и ограничить линкеру эту область.

А где вы хотите орагнизовать БОЛЬШОЙ массив данных? в 2313 же 2 кб флеша всего.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Apr 26 2009, 05:34
Сообщение #5


;
******

Группа: Участник
Сообщений: 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;

После чего Вам не надо ни секций ни каких-либо усложнений по адресной математике.
Go to the top of the page
 
+Quote Post
Airy
сообщение Apr 26 2009, 14:29
Сообщение #6





Группа: Новичок
Сообщений: 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;

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

А каким же образом в эту структуру запись производить???
Go to the top of the page
 
+Quote Post
Deka
сообщение Apr 26 2009, 15:14
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 248
Регистрация: 18-07-06
Из: Сочи
Пользователь №: 18 890



Почитайте про самопрограммирование или бутлоадеры. Там есть запись в область программ.
Go to the top of the page
 
+Quote Post
Airy
сообщение Apr 26 2009, 17:47
Сообщение #8





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



Цитата(Deka @ Apr 26 2009, 18:14) *
Почитайте про самопрограммирование или бутлоадеры. Там есть запись в область программ.

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

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

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

Нужен конкретный пример или конкретный совет
Go to the top of the page
 
+Quote Post
amw
сообщение Apr 27 2009, 06:42
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Apr 27 2009, 07:13
Сообщение #10


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(amw @ Apr 27 2009, 09:42) *
Конкретно с AVR не работал, на сколько я понимаю, у WinAVR есть скрипты линкеры под конкретные микроконтроллеры.
Найдите тот, что для Вашего.
Найдите в нем описание секции .text

Там все есть, в скриптах. Так что искать не надо.
Работа с чтением ПП в файле avr/pgmspace.h
Go to the top of the page
 
+Quote Post
Airy
сообщение Apr 27 2009, 08:47
Сообщение #11





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



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



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

И еще, попробовал переименовать папку со скриптами, что бы линкер не нашел файл и сказал какой скрипт ищет, но ни чего не вышло, как узнать какой скрипт линкера по умолчанию?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 27 2009, 10:05
Сообщение #12


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
Airy
сообщение Apr 27 2009, 11:21
Сообщение #13





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



Цитата(Сергей Борщ @ Apr 27 2009, 13:05) *
Значит вы переименовали не тут папку.

WinAvr\avr\lib\ldscripts
Это та папка которую я переименовал, это не правильно?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 27 2009, 11:37
Сообщение #14


Гуру
******

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



Цитата(Airy @ Apr 27 2009, 14:21) *
WinAvr\avr\lib\ldscripts
Это та папка которую я переименовал, это не правильно?
Правильно. Может у вас несколько WinAVRов стоит?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Airy
сообщение Apr 27 2009, 11:58
Сообщение #15





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



Цитата(Сергей Борщ @ Apr 27 2009, 14:37) *
Правильно. Может у вас несколько WinAVRов стоит?

Значитца так... программу пишу и отлаживаю в AvrStudio, WinAVR стоит один, может это происходит из за AvrStudio, может она свои скрипты какие то назначает?
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 17:13
Рейтинг@Mail.ru


Страница сгенерированна за 0.01483 секунд с 7
ELECTRONIX ©2004-2016