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

 
 
> Последовательное размещение переменных в памяти (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
Ответов
ReAl
сообщение Jan 5 2013, 20:36
Сообщение #2


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(Boriska @ Jan 5 2013, 21:08) *
Можно ли как нибудь сказать компилятору, что переменные должны располагаться в памяти последовательно?
На уровне компилятора -- поместить их все в одну охватывающую структуру.
Код
struct {
    mainServerTypeDef mainServer;
    devicesBuiltTypeDef devicesBuilt[DEVICES_BUILT_MAX];
    devicesRFTypeDef devicesRF[DEVICES_RF_MAX];
} cfg;

Будут все вместе и в заданном порядке. Неудобство -- придётся обращаться как к полям структуры cfg.

На уровне линкера -- помещать в исходниках все переменные такого рода в специальную секцию, её описать линкеру, он соберёт все в одну кучу.
Как бонус можно располагать переменные в разных файлах, при включении файла в проект его часть подошьётся автоматически.
Но порядок переменных не гарантирован.
Для «одним блоком записть в EEPROM» нужно будет обращаться к определяемым линкером символам начала секции и размера секции.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
Ruslan1
сообщение Jan 5 2013, 21:23
Сообщение #3


Гуру
******

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



И еще не забудьте указать, что структура пакованная, иначе она может иметь вовсе не ту длину, на которую Вы рассчитываете. Что-то типа "pack", но я давно ИАР не использовал, смотрите в актуальной документации.
Но учтите, что с пакованными структурами он дольше работает.
Метод со структурой- самый лучший из возможных. Он универсален и легко подается модификации.
Я в подобную структуру не только в ПЗУ данные собираю, но и ОЗУшные глобальные переменные тоже: очень удобно при отладке и любых разборках-модификациях. То есть каждый модуль объявляет свой тип структуры, а main.h имеет все эти подчиненные структуры как "подструктуры" в структуре GlobalValues, типа такого:

typedef struct
{
modbus_t modbus;
AD7192_t ad7192;
DATA_COLLECT_STR_TYPE DatCollect;
LCD_Global_t lcd;
Buzzer_t buzzer;
}GlobalValues_t;

Go to the top of the page
 
+Quote Post



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

 


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


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