| Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
Внешняя память
14.07.2010, 11:57
|
|
|
Гражданин KAZUS.RUN
Регистрация: 08.07.2006
Сообщений: 582
Сказал спасибо: 76
Сказали Спасибо 90 раз(а) в 66 сообщении(ях)
|
Внешняя память
Во всех компилерах (ну из тех, что я знаю) для мк есть ключевые слова вроде "flash" или "eeprom" для размещения переменных в соответствующем месте внутренней памяти.
А можно ли самому создать ключевое слово? Для размещения во внешней памяти? Дописать там либриотеку не проблема, вопрос в том чтоб компилятор знал что к чему.
__________________
Sex, Druggs, Rock&Roll
|
|
|
|
14.07.2010, 12:08
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 13.02.2008
Адрес: Днепр. Украина
Сообщений: 3,284
Сказал спасибо: 441
Сказали Спасибо 1,040 раз(а) в 701 сообщении(ях)
|
Re: Внешняя память
В Кейле есть ключевое слово AT, указывающее точный адрес размещения переменной. Соответственно если МК умеет работать с внешней памятью данных, то ИМХО этого может быть и достаточно. Если доступ к внешней памяти реализуется дополнительными аппаратными средствами, то прийдется использовать функции типа read_ext_mem(adr,data) write_ext_mem(adr,data)
__________________
misterdi<@>i.ua
|
|
|
|
14.07.2010, 12:26
|
|
|
Гражданин KAZUS.RUN
Регистрация: 08.07.2006
Сообщений: 582
Сказал спасибо: 76
Сказали Спасибо 90 раз(а) в 66 сообщении(ях)
|
Re: Внешняя память
о том и речь. Возьмем, к примеру, внешнюю еепром по и2с. Писать/читать не проблема, у меня даже класс сответствующий написан.
Но вот хотелось бы, что переменная во внешней памяти определялась не как класс, а как переменная с ключевым словом (к примеру "__ext_eeprom"), и компилятор знал, откуда тянуть библиотечные (самопальные) функции.
|
Сообщение от IAR Help __eeprom keyword
|
...
You can also override the supplied support functions to make the __eeprom memory attribute access an EEPROM or flash memory that is placed externally but not on the normal data bus, for example on an I2C bus.
To do this, you must write a new EEPROM library routines file and include it in your project. The new file must use the same interface as the eeprom.s90 file in the avr\src\lib\ directory (visible register use, the same entry points and the same semantics).
|
Тоесть заменить можна (кстати довольно странным образом написана библиотека - ну и ли я просто раньше такого не видел), но мне и внутренняяя нужна память!
__________________
Sex, Druggs, Rock&Roll
|
|
|
|
14.07.2010, 12:28
|
|
|
Гражданин KAZUS.RUN
Регистрация: 08.07.2006
Сообщений: 582
Сказал спасибо: 76
Сказали Спасибо 90 раз(а) в 66 сообщении(ях)
|
Re: Внешняя память
Ну и еще. По аналогии с внутренней памятью. Как бы сегментировать внешнюю память, чтоб не парится с выделением адресов, а переложить это на компилер.
Кто-то о таких вещах слышал, или я размечтался?
__________________
Sex, Druggs, Rock&Roll
|
|
|
|
15.07.2010, 02:53
|
|
|
Гражданин KAZUS.RUN
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: Внешняя память
На Electronix кто-то (по-моему protoss) "подправлял" компилятор и тот при указании __eeprom подставлял работу с внешней i2c памятью.
Но, вообще-то, компилятор не позволяет определять свои ключевые слова. Хотя, думаю на C++ можно сделать очень похожие вещи.
Что вы понимаете под "сегментировать"?
Если то же, что и я, то ответ - естественно возможно. Это делается в виде указания для линкера. Там вы объявляете внешнюю память и разбиваете её на сегменты. Обзываете сегменты. Ну а дальше размещаете переменные в нужных вам сегментах.
|
|
|
|
15.07.2010, 03:06
|
|
|
Гражданин KAZUS.RUN
Регистрация: 08.07.2006
Сообщений: 883
Сказал спасибо: 119
Сказали Спасибо 1,108 раз(а) в 175 сообщении(ях)
|
Re: Внешняя память
Сообщение от alberio
|
Как бы сегментировать внешнюю память, чтоб не парится с выделением адресов, а переложить это на компилер.
Кто-то о таких вещах слышал, или я размечтался?
|
GCC (WinAvr) это делает на раз. Только будьте готовы к написанию своего линковочного сценария  Это несложно, нужно взять готовый и добавить туда описание своей секции для внешней памяти. Затем все переменные, которые нужно разместить во внешней памяти нужно будет метить атрибутом с именем вашей секции (ключевое слово __attribute__).
|
Код:
|
__attribute__ ((section ("name"))) |
Можно создать макрос, например, extmem, который будет применять соответствующий атрибут к переменной:
|
Код:
|
#define extmem __attribute__((section ("name"))) |
У других компиляторов кроме GCC, думаю, такое почти невозможно.
Нужно учитывать, что этот прием хорошо подходит для памяти, которая отображается в одно из адресных пространств процессора.
Можно, наверное, использовать и более урезанный вариант, чтобы компилятор просто выделял адреса, а все получения/запись значений вы будете делать руками через вызовы функций из либриотеки.
__________________
.

В мире всего два типа людей: те у кого был ZX Spectrum, и те у кого его не было.
Последний раз редактировалось alexgap; 15.07.2010 в 03:13.
|
|
|
|
15.07.2010, 07:49
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 30.06.2005
Сообщений: 3,392
Сказал спасибо: 5
Сказали Спасибо 429 раз(а) в 305 сообщении(ях)
|
Re: Внешняя память
На ARMах я помню подменял обработчик прерывания "Invalid Address" и по прерыванию подставлял нужные данные.
|
|
|
|
15.07.2010, 18:39
|
|
|
Гражданин KAZUS.RUN
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: Внешняя память
Сообщение от alexgap
|
|
У других компиляторов кроме GCC, думаю, такое почти невозможно.
|
В любых вменяемых компиляторах, которые имеют в своём составе линкер это реализуется примерно также как описали вы и я постом выше.
В частности IAR делает это также просто.
Более того, компилятор сам же этим и пользуется. Например квалификатор __no_init - эсть ни что иное, как один из сегментов памяти. То же и с __flash и прочее.
|
|
|
|
15.07.2010, 20:01
|
|
|
Гражданин KAZUS.RUN
Регистрация: 17.07.2006
Адрес: PV.DP.UA
Сообщений: 620
Сказал спасибо: 3
Сказали Спасибо 60 раз(а) в 48 сообщении(ях)
|
Re: Внешняя память
С30 (для PIC24/dsPIC) тоже умеет. В мануале на компилятор это подробно расписано.
__________________
Если ты читаешь это - значит тебе нечем заняться...
|
|
|
|
15.07.2010, 20:41
|
|
|
Гражданин KAZUS.RUN
Регистрация: 08.07.2006
Сообщений: 582
Сказал спасибо: 76
Сказали Спасибо 90 раз(а) в 66 сообщении(ях)
|
Re: Внешняя память
Сообщение от SasaVitebsk
|
|
Например квалификатор __no_init - эсть ни что иное, как один из сегментов памяти. То же и с __flash и прочее.
|
Хорошо. Ну как описать, где это сегмент я хочу видеть? Как обьяснить машине, как писать и читать оттуда?
__________________
Sex, Druggs, Rock&Roll
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
| Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
|
Непрерывная память для PIC-ов
|
zelvans |
Микроконтроллеры, АЦП, память и т.д |
19 |
10.05.2010 13:36 |
|
память SRAM ATmega после reset
|
avrman |
Микроконтроллеры, АЦП, память и т.д |
3 |
10.03.2010 14:32 |
|
Программируем память КМ558РР3 или взять аналог?
|
RALP |
Микроконтроллеры, АЦП, память и т.д |
7 |
26.02.2010 01:29 |
|
Помогите прочитать память
|
Easyrider83 |
Микроконтроллеры, АЦП, память и т.д |
11 |
09.02.2010 01:09 |
|
АТ89С51 прочесть память
|
Sergey8870 |
Микроконтроллеры, АЦП, память и т.д |
4 |
02.02.2010 17:40 |
Часовой пояс GMT +4, время: 17:11.
|
|