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

 
 
5 страниц V  « < 3 4 5  
Reply to this topicStart new topic
> void const *argument, Что это?
dxp
сообщение Jan 15 2014, 13:49
Сообщение #61


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Очень плотно использовал IAR для AVR в конце девяностых (незабвенная версия 1.40) и до середины нулевых, в т.ч. и лицензионные. Никогда объекты, квалифицированные как const, не попадали там во флешь и не могли попасть ни при каких обстоятельствах (вендор компилятора, версия компилятора, фаза луны и прочее). Этот результат жёстко определяется двумя обстоятельствами: 1. требованиями языков C/C++; 2. Архитектурой МК AVR.

1. Языки C/C++ без расширений не поддерживают никаких адресных пространств, кроме одного, т.е. все объекты программы "живут" в одной и тоже памяти, в едином адресном пространстве. Как физически эта память выполнена - это уже дело пятое, но адресное пространство должно быть одно. Соответственно, константные объекты могут жить только в этой памяти, т.е. в той же самой, что и все остальные объекты. В частности, к ним на равных правах применяются те же правила взятия адресов, адресной арифметики и т.д.

2. Архитектура МК AVR предусматривает раздельные адресные пространства для памяти данных и памяти программ. Память данных - ОЗУ, память программ - ПЗУ (флешь). Для того, чтобы разместить объект во флеши, его приходится совать в память программ, т.е. в другое адресное пространство. Для этого производитель компилятора IAR предусмотрел расширение языка ключевым словом __flash.

Объекты, квалифицированные ключевым словом const, никак не могут попасть в память программ. Если нужно засунуть объект во флешь, то приходится его размещать в памяти программ, но это уже не const объект, а __flash. Вот если бы у МК AVR ещё был сегмент памяти данных, выполненный в виде флеши, то тогда было бы возможно размещать во флеши (именно в этой флеши, а не во флеши памяти программ) константные объекты. Но таких МК, как помню, не было и, вроде, до сих пор нет.

У AVR, кстати, не два, а целых три адресных пространства - ещё есть EEPROM, сюда применимы все вышеприведённые рассуждения.

Таким образом, константные объекты у МК AVR могут жить только в памяти данных и это ОЗУ. Не нужно никаких экспериментов, чтобы прийти к этому выводу. Объекты, размещённые в других адресных пространствах - __flash, __eerpom, живут сами по себе и не могут напрямую использоваться, например, для операций адресной арифметики, производимой над обычными объектами.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 15 2014, 15:23
Сообщение #62


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Tarbal @ Jan 15 2014, 15:13) *
И как это следует из вашей цитаты?
ОЗУ насколько мне известно называется ОЗУ, а не default memory.
default memory - память, в которую попадают "обычные" переменные. Куда они могут попасть кроме как в ОЗУ? Неужели и это надо было разжевать?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Jan 16 2014, 23:40
Сообщение #63


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(dxp @ Jan 15 2014, 17:49) *
Очень плотно использовал IAR для AVR в конце девяностых (незабвенная версия 1.40) и до середины нулевых, в т.ч. и лицензионные. Никогда объекты, квалифицированные как const, не попадали там во флешь и не могли попасть ни при каких обстоятельствах (вендор компилятора, версия компилятора, фаза луны и прочее). Этот результат жёстко определяется двумя обстоятельствами: 1. требованиями языков C/C++; 2. Архитектурой МК AVR.

1. Языки C/C++ без расширений не поддерживают никаких адресных пространств, кроме одного, т.е. все объекты программы "живут" в одной и тоже памяти, в едином адресном пространстве. Как физически эта память выполнена - это уже дело пятое, но адресное пространство должно быть одно. Соответственно, константные объекты могут жить только в этой памяти, т.е. в той же самой, что и все остальные объекты. В частности, к ним на равных правах применяются те же правила взятия адресов, адресной арифметики и т.д.

2. Архитектура МК AVR предусматривает раздельные адресные пространства для памяти данных и памяти программ. Память данных - ОЗУ, память программ - ПЗУ (флешь). Для того, чтобы разместить объект во флеши, его приходится совать в память программ, т.е. в другое адресное пространство. Для этого производитель компилятора IAR предусмотрел расширение языка ключевым словом __flash.

Объекты, квалифицированные ключевым словом const, никак не могут попасть в память программ. Если нужно засунуть объект во флешь, то приходится его размещать в памяти программ, но это уже не const объект, а __flash. Вот если бы у МК AVR ещё был сегмент памяти данных, выполненный в виде флеши, то тогда было бы возможно размещать во флеши (именно в этой флеши, а не во флеши памяти программ) константные объекты. Но таких МК, как помню, не было и, вроде, до сих пор нет.

У AVR, кстати, не два, а целых три адресных пространства - ещё есть EEPROM, сюда применимы все вышеприведённые рассуждения.

Таким образом, константные объекты у МК AVR могут жить только в памяти данных и это ОЗУ. Не нужно никаких экспериментов, чтобы прийти к этому выводу. Объекты, размещённые в других адресных пространствах - __flash, __eerpom, живут сами по себе и не могут напрямую использоваться, например, для операций адресной арифметики, производимой над обычными объектами.


Вы правы. Я подзабыл. Они в ЕЕПРОМ располагались.


Цитата(Сергей Борщ @ Jan 15 2014, 19:23) *
default memory - память, в которую попадают "обычные" переменные. Куда они могут попасть кроме как в ОЗУ? Неужели и это надо было разжевать?


Я не считаю что это очевидно.
Go to the top of the page
 
+Quote Post

5 страниц V  « < 3 4 5
Reply to this topicStart new topic
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0

 


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


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