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

 
 
> Последовательное размещение переменных в памяти (IAR 6.4)
Boriska
сообщение Jan 5 2013, 19:08
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 28-11-07
Пользователь №: 32 772



Мне нужно записать содержимое нескольких массивов в EEPROM. Есть вариант скопировать сначала все в один буфер, а потом все одним блоком записать в EEPROM, но для этого нужно выделять много оперативки под буфер.
Можно ли как нибудь сказать компилятору, что переменные должны располагаться в памяти последовательно?

Конструкции типа:
#pragma location=0x20000000
__no_init mainServerTypeDef mainServer;
#pragma location=0x20000000+sizeof(mainServer)
__no_init devicesBuiltTypeDef devicesBuilt[DEVICES_BUILT_MAX];
#pragma location=0x20000000+sizeof(mainServer)+sizeof(devicesBuilt)
__no_init devicesRFTypeDef devicesRF[DEVICES_RF_MAX];

не помогают. Копилятор в этой области размещает другие переменные. Можете что-нибудь посоветовать?
Пишу под процессор stm32f207 и 24c128. Компилятор IAR 6.4
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
_Артём_
сообщение Jan 5 2013, 20:11
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Boriska @ Jan 5 2013, 21:08) *
Можно ли как нибудь сказать компилятору, что переменные должны располагаться в памяти последовательно?

Возможно компилятор решил что переменные не нужны.
Попробуйте такой вариант:

Код
#pragma location=0x20000000
__root __no_init mainServerTypeDef         mainServer;
Go to the top of the page
 
+Quote Post
Boriska
сообщение Jan 6 2013, 14:20
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 28-11-07
Пользователь №: 32 772



Цитата(_Артём_ @ Jan 6 2013, 00:11) *
Возможно компилятор решил что переменные не нужны.

Это проверил. Переменные создаются. Вот только компилятор проверяет пересечение переменных, которые идут с директивой location, а остальные пихает, не обращая на занятую область никакого внимания.


Цитата(ReAl @ Jan 6 2013, 00:36) *
На уровне компилятора -- поместить их все в одну охватывающую структуру.

Спасибо за идею. У меня была такая мысль. Не понравилось наличие дополнительного префикса. Ну если говорите, что нужно делать так, придется делать так wink.gif
Цитата(Ruslan1 @ Jan 6 2013, 01:23) *
И еще не забудьте указать, что структура пакованная, иначе она может иметь вовсе не ту длину, на которую Вы рассчитываете. Что-то типа "pack", но я давно ИАР не использовал, смотрите в актуальной документации.

А что такое пакованная? pragma pack - выравнивание?
Сейчас длина именно такая, как я прошу. В каком случае компилятор решит ее уменьшить? Или он может за счет выравнивания каждый раз вставлять разное число "пробелов" между элементами структуры?
Go to the top of the page
 
+Quote Post
Ruslan1
сообщение Jan 6 2013, 14:36
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



Цитата(Boriska @ Jan 6 2013, 16:20) *
А что такое пакованная? pragma pack - выравнивание?
Сейчас длина именно такая, как я прошу. В каком случае компилятор решит ее уменьшить? Или он может за счет выравнивания каждый раз вставлять разное число "пробелов" между элементами структуры?

все уже написано до нас, жалко повторяться.
http://electronix.ru/forum/index.php?showtopic=83920
Go to the top of the page
 
+Quote Post



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

 


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


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