Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: MSP430F5510 (IAR)
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
usercod
Добрый день!

Имеется структура и массив. Нужно чтобы в RAM эти данные располагались одно за другим. Т.е. следующий адрес, после последнего слова структуры, это начало массива.

Как сделать?
MrYuran
Цитата(usercod @ Jan 26 2012, 11:25) *
Добрый день!

Имеется структура и массив. Нужно чтобы в RAM эти данные располагались одно за другим. Т.е. следующий адрес, после последнего слова структуры, это начало массива.

Как сделать?

Так и сделать.
Объявить друг за другом.
Можно жестко привязать к адресу через @addr (но не нужно)
Можно применить подходящую #pragma (location?)

А зачем это нужно?
rezident
Цитата(usercod @ Jan 26 2012, 12:25) *
Как сделать?
Объединить структуру и массив в другую (еще одну) структуру, не забывая о выравнивании.
usercod
Цитата
А зачем это нужно?


Так было сделано ранее и старший программист требует повторить. Смысл такой. Структура - это блок основных данных, а массив - дополнительные, расширенные данные. Мастер по I2C может считать основные данные, но при необходимости вместе с основными взять и расширенные.
Тогда в прерывании по I2C получается очень удобно: считываю данные по адресу, данные отправляю, а адрес инкрементирую и т.д. В этом случае контроллеру все равно сколько байт с него будут брать. После наска или стопа адрес опять на начало.

Вот нашел на http://e2e.ti.com метод

// locations in information memory segments
#define DATA1 (*(unsigned int*)0x1040)
и далее объявляем массив или структуру с таким именем.

И еще попутные вопросы.

1.В каком месте расположена куча?
2.Как поменять расположение кучи?
3.файл с расширением xcl - единственное место, где можно посмотреть распределение памяти и повлиять на это?





Цитата
Объединить структуру и массив в другую (еще одну) структуру, не забывая о выравнивании.


Согласен, можно.
Все же хотелось бы знать, как управлять компилятором и расположить структуру и массив последовательно, используя определенные адреса.
MrYuran
Лучше используйте сплошной массив для обоих блоков, а дефайнами или енумами задавайте индекс нужного элемента (поля).
Просто я лично уже не раз накалывался на чудеса выравнивания при отображении протокола обмена на структуру. Особенно на 16р архитектуре.
Для своих целей используйте что хотите. А первичную обработку буфера лучше производить побайтно. Надежнее будет.
ИМХО.
usercod
Все таки полезно научиться управлять линкером.

Что я делаю не так?

В xcl-файле
Код
-P(DATA)Mydata=3000-3012


В сишнике:
Код
#pragma location = "Mydata"
struct _main_data
{
    unsigned long amount;
    unsigned char n_threshold;
    unsigned char V_threshold;
    unsigned short ADC_V;
    unsigned long time;
}main_data


При компиляции ошибок нет, при этом структура расположена по адресу 0x2400.
rezident
Как говориться RTFM, сударь! wink.gif То бишь читайте EW430_CompilerRefefence.pdf в документации IAR.
Код
#pragma dataseg = __data16 Mydata
__no_init struct _main_data
{
    unsigned long amount;
    unsigned char n_threshold;
    unsigned char V_threshold;
    unsigned short ADC_V;
    unsigned long time;
} main_data;
#pragma dataseg = default

Инициализировать или очищать структуру придется "ручками". Потому, что линкер не может положить ее в тот сегмент, который стартап чистит самостоятельно.
Кстати, править xcl-файл не обязательно. Я забил строку -P(DATA)Mydata=3000-3012 в опциях проекта. Вкладка Options -> Linker -> Extra options. Там установить галку, чтобы активировать поле Command line options. И в это поле скопировать строку для резервирования вашего сегмента.
usercod
Спасибо, все работает.
По поводу RTFM, буду исправляться, то бишь читать. rolleyes.gif

bb-offtopic.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.