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

 
 
 
Reply to this topicStart new topic
> MSP430F5510 (IAR), Расположение данных в ОЗУ по конкретному адресу
usercod
сообщение Jan 26 2012, 07:25
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 62
Регистрация: 8-10-11
Пользователь №: 67 612



Добрый день!

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

Как сделать?
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Jan 26 2012, 07:41
Сообщение #2


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



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

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

Как сделать?

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

А зачем это нужно?


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
rezident
сообщение Jan 26 2012, 08:06
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(usercod @ Jan 26 2012, 12:25) *
Как сделать?
Объединить структуру и массив в другую (еще одну) структуру, не забывая о выравнивании.
Go to the top of the page
 
+Quote Post
usercod
сообщение Jan 26 2012, 08:26
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 62
Регистрация: 8-10-11
Пользователь №: 67 612



Цитата
А зачем это нужно?


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

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

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

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

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





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


Согласен, можно.
Все же хотелось бы знать, как управлять компилятором и расположить структуру и массив последовательно, используя определенные адреса.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Jan 26 2012, 09:06
Сообщение #5


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



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


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
usercod
сообщение Jan 26 2012, 11:44
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 62
Регистрация: 8-10-11
Пользователь №: 67 612



Все таки полезно научиться управлять линкером.

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

В 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.

Сообщение отредактировал usercod - Jan 26 2012, 11:46
Go to the top of the page
 
+Quote Post
rezident
сообщение Jan 26 2012, 13:20
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Как говориться 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. И в это поле скопировать строку для резервирования вашего сегмента.
Go to the top of the page
 
+Quote Post
usercod
сообщение Jan 30 2012, 07:14
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 62
Регистрация: 8-10-11
Пользователь №: 67 612



Спасибо, все работает.
По поводу RTFM, буду исправляться, то бишь читать. rolleyes.gif

bb-offtopic.gif
Go to the top of the page
 
+Quote Post

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

 


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


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