Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: запись значений в память по определенному адресу
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
legioner1
Собственно есть такой вопрос, нужно во внешнюю память записывать конфигурациионые значения.
как записать значениt в ячейку с адресом, например 0x8000 0100?
Genadi Zawidowski
Цитата(legioner1 @ May 8 2009, 09:11) *
Собственно есть такой вопрос, нужно во внешнюю память записывать конфигурациионые значения.
как записать значениt в ячейку с адресом, например 0x8000 0100?



Код
* ((unsigned long *) 0x80000100) = value;

Не забывать о выравнивании.

Или описать структуру со множеством нужных полей и обращаться к ней

Код
struct confdata {
unsigned long expirationdate;
unsigned char color;
};

((struct confdata *) 0x80000100)->color = value;
Сергей Борщ
Цитата(Genadi Zawidowski @ May 8 2009, 08:53) *
Код
((struct confdata *) 0x80000100)->color = value;
Или описать extern переменную типа struct confdata, а в скрипте линкера задать ей конкретный адрес. Линкер может следить, чтобы в это место не попали другие переменные. В случае указателя придется думать об этом вручную.
Genadi Zawidowski
Цитата(Сергей Борщ @ May 8 2009, 11:31) *
Или описать extern переменную типа struct confdata, а в скрипте линкера задать ей конкретный адрес. Линкер может следить, чтобы в это место не попали другие переменные. В случае указателя придется думать об этом вручную.

Но сначала нам придется процитировать здесь любимые места из описания того компилятора, которым пользуется топикстартер, чтобы ответить на вопрос - а как "в скрипте линкера задать ей конкретный адрес".
Как я понял, линкеру обычно про external память ничего неизвестно - так что конфликна не будет...
sergeeff
Если просто писать/читать память, то линкеру можно ничего и не говорить. А если надо память резервировать, да еще и не под одну структуру (массив или что еще) - то тогда линкер этому надо обучить.
DpInRock
Цитата
* ((unsigned long *) 0x80000100) = value

А на самом деле вместо unsigned long надо писать тип, который имеет VALUE.
zltigo
Цитата(DpInRock @ May 9 2009, 17:55) *
А на самом деле ...

На самом деле в 99,9999% запись по конкретным адресам RAM совершенно неразумное решение.
sergeeff
Цитата(zltigo @ May 9 2009, 20:25) *
На самом деле в 99,9999% запись по конкретным адресам RAM совершенно неразумное решение.


Увы, автор не поделился своими сокровенными мыслями, зачем ему эту нужно.
DpInRock
Очень бывает нужно. К примеру, когда в даташите находишь адрес регистра, а в соотв. *.inc, который офигенных размеров искать как там обозвали этот регистр - ну долго. Плюешь на все и пишешь от руки. Быстро и удобно.
Кроме того, мода людей присваивать ну очень длинные имена, которые ну никак не помогают - дурь.

Цифра - наше всё. Букву оставим гуманитариям.
aaarrr
Цитата(DpInRock @ May 9 2009, 23:06) *
Очень бывает нужно. К примеру, когда в даташите находишь адрес регистра, а в соотв. *.inc, который офигенных размеров искать как там обозвали этот регистр - ну долго.

Ctrl+F не работает?

Цитата(DpInRock @ May 9 2009, 23:06) *
Кроме того, мода людей присваивать ну очень длинные имена, которые ну никак не помогают - дурь.

Угу, дурь. Но никто не заставляет использовать хидеры производителя. Можно отредактировать или написать свои.

Цитата(DpInRock @ May 9 2009, 23:06) *
Цифра - наше всё. Букву оставим гуманитариям.

Очень неразумный подход.
DpInRock
Цитата
Ctrl+F не работает?

Уже сточилась. Честно.
Цитата
Можно отредактировать или написать свои.

Дешевле их не писать. А когда они готовые - грех не пользоваться. Но почему-то часть имен совпадает с даташитнымми, а часть - ну никак не совпадает. Присобачивают пару буковок и мучаешься гадать что именно искать.
Цитата
Очень неразумный подход.

Если бы все поступали разумно, программисты и прочая были бы не нужны.

Речь идет "о по-быстрому". Исключительно. Когда вот он адрес перед глазами, а превратить его в слово - это надо отыскать хидер, загрузить, отыскать, копи-пасте сделать....
aaarrr
Цитата(DpInRock @ May 9 2009, 23:52) *
Дешевле их не писать. А когда они готовые - грех не пользоваться. Но почему-то часть имен совпадает с даташитнымми, а часть - ну никак не совпадает. Присобачивают пару буковок и мучаешься гадать что именно искать.

Подобные проблемы мне встречались исключительно у Texas Instruments. Не о них речь?
Написать хидер - не бог весть какая работа при минимальной автоматизации процесса.

Цитата(DpInRock @ May 9 2009, 23:52) *
Речь идет "о по-быстрому". Исключительно. Когда вот он адрес перед глазами, а превратить его в слово - это надо отыскать хидер, загрузить, отыскать, копи-пасте сделать....

Беда в том, что сделанное "по-быстрому" таким навсегда и остается.
DpInRock
Чертов даташит от Атмел защищен и из него невозможно скопировать текст. Ваще, ё-мое.
Как раз у Техаса я сам писал хидеры. И горя не знал. Но там меня никто никуда не торопил и рядом сидели монстры Си, которым бы я мог "по-быстрому" задать вопрос.

У меня очень часты задачи не глобального характера, а сиюминутные, умирающие после первого удачного запуска. К примеру, сделать снимок какого-нибудь протокола обмена для дальнейшего разбора. Сделал - и забыл. Ровно на один раз. Неужели программу буквами на клавиатуре писать?
zltigo
Цитата(DpInRock @ May 9 2009, 22:06) *
находишь адрес регистра....

Трм буквы RAM в моем посте видели? Тогда к чему о "регистрах"? И по любому обращение по магическим цифирям и к регистрам есть моветон.
aaarrr
Цитата(DpInRock @ May 10 2009, 00:31) *
Чертов даташит от Атмел защищен и из него невозможно скопировать текст. Ваще, ё-мое.

Что-то я не припомню у них каких-то особо страшных несоответствий в названиях регистров между даташитом и хидерами. Идиотские префиксы не считаются.

Цитата(DpInRock @ May 10 2009, 00:31) *
У меня очень часты задачи не глобального характера, а сиюминутные, умирающие после первого удачного запуска. К примеру, сделать снимок какого-нибудь протокола обмена для дальнейшего разбора. Сделал - и забыл. Ровно на один раз. Неужели программу буквами на клавиатуре писать?

Да. ИМХО, лучше приучить себя всегда и все делать правильно.
DpInRock
А когда регистры пишешь руками, то не грех и в SDRAM-SRAM по-быстрому что-то записать. К примеру, массив чего-нибудь ненужного.
К примеру, никаких отладочных средств нет. Пишешь отладку в память по абсолютному адресу, чтобы знать потом откуда ея прочитать. Внешней программой. Не смотреть же мап каждый раз и не расписывать линкеру на каждый чих указания?
Всего-то 8 цифирок - и все дела.
Главное в деле - понимать, что делаешь. И цель компилятора - помочь программисту написать машинный код. А не наоборот.

--
Кслову . На Юго-Западе Москвы какой-то обалденный пожар. В районе гостиницы Турист на Ленинском. Освещает все в радиусе минимум 2 км.
zltigo
Цитата(DpInRock @ May 9 2009, 23:46) *
Главное в деле - понимать, что делаешь.

Когда я вижу обращения по фиксированным адресам я с помянутой выше вероятностью знаю, что написавший такое НЕ ПОНИМАЕТ, что творит sad.gif.
DpInRock
"Главное - результат".
(Copyright House M.D.)
legioner1
Цитата(Genadi Zawidowski @ May 8 2009, 08:53) *
Код
* ((unsigned long *) 0x80000100) = value;

Не забывать о выравнивании.

Или описать структуру со множеством нужных полей и обращаться к ней

Код
struct confdata {
unsigned long expirationdate;
unsigned char color;
};

((struct confdata *) 0x80000100)->color = value;


Спасибо, исчерпывающий ответ. ваш совет мне помог )

Цитата(sergeeff @ May 9 2009, 21:07) *
Увы, автор не поделился своими сокровенными мыслями, зачем ему эту нужно.


Нужно для того чтобы сохранять различные параметры конфигуриции (скорость, бит четности, длина паузы) во внешней энергонезамисимой памяти, чтобы в любой момент их можно было считать или перезаписать. ещё для сохранения суточной истории по приходящим каждую секунду данным.
Почему именно по конкретным адресам? самое простое решение, которое пришло в голову.
Для таких целей более правильным считается динамическое выделение памяти? с помощью malloc? хорошо, попробую
aaarrr
Цитата(legioner1 @ May 20 2009, 07:06) *
Почему именно по конкретным адресам? самое простое решение, которое пришло в голову.
Для таких целей более правильным считается динамическое выделение памяти? с помощью malloc? хорошо, попробую

Malloc-то тут каким боком? Правильное решение уже давали.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.