Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: void const *argument
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Страницы: 1, 2
Tarbal
Цитата(Сергей Борщ @ Jan 11 2014, 22:33) *
Ваше право. Но убеждать остальных на основании только лишь вашей веры как-то неразумно.


Напротив. Я не убеждаю никого. Меня убеждают на основе веры. Я высказал предположение и привел простую процедуру проверить его. Меня как раз начали убеждать, что неправильно предположил. Я сказал, что не верю на слово, а проверить сам не могу. Заставлять проверить моё предположение я естественно никого не могу. Хотел помочь, но если вам уже всё ясно, то откланиваюсь.
Tarbal
Вот документ.
На странице 5 есть информация о размещении констант в памяти.
http://netstorage.iar.com/SuppDB/Public/SU...memoryusage.pdf

Константы могут находиться в програмной памяти, оперативной памяти и внешней ЕПРОМ.

А здесь на странице 6 утверждают:
CONST Holds variables declared as const
.......
The CONST and CSTR should only be included in the XLINK file if there is an external
PROM in the system.

http://www.atmel.ca/Images/doc1079.pdf

Я уже не помню, а копаться лень. Для доступа ко внешней ЕПРОМ и для доступа ко внутренней ОЗУ используются одинаковые команды на ассемблере? Если разные, то это может объяснить многое в декларации функции с константным параметром.

Примечание: Я прекрасно знаю стандартное объяснение константного указателя как параметра функции, однако это всем известно. Разные способы адресации же это довольно неочевидное свойство.
demiurg_spb
Цитата(Tarbal @ Jan 14 2014, 17:10) *
Вот документ.
А теперь замените iar на avr-gcc...
Tarbal
Цитата(demiurg_spb @ Jan 14 2014, 19:42) *
А теперь замените iar на avr-gcc...


Простите, что вы имели ввиду?
demiurg_spb
Цитата(Tarbal @ Jan 14 2014, 20:09) *
Простите, что вы имели ввиду?
К тому что ваши ссылки, как собственно и измышления, исключительно для IAR. Но ведь есть и другие, более распространённые компиляторы, где const не гарантирует размещения данных в ПЗУ, что никак не противоречит стандарту. Об этом вам Сергей пытался намекнуть...
Сергей Борщ
Цитата(Tarbal @ Jan 14 2014, 15:10) *
Вот документ.
Опустим тот факт, что это документ лохматого года, когда ИАР знал только 6 моделей AVR.
Цитата(Tarbal @ Jan 14 2014, 15:10) *
А здесь на странице 6 утверждают:CONST Holds variables declared as const
Ненаказуемо.
Цитата(Tarbal @ Jan 14 2014, 15:10) *
.......
The CONST and CSTR should only be included in the XLINK file if there is an external
PROM in the system.
Я уже не помню, а копаться лень. Для доступа ко внешней ЕПРОМ и для доступа ко внутренней ОЗУ используются одинаковые команды на ассемблере? Если разные, то это может объяснить многое в декларации функции с константным параметром.
Если повесите свою параллельную ПЗУ на внешнюю шину как память данных - команды будут одинаковые. Но опять же, это не компилятор положит во флеш, а вы запихнете ПЗУ в адресное пространство ОЗУ, этакое чесание левого уха правой ногой. Обе эти памяти будут находиться в одном адресном пространстве.

Обратите внимание на свой же документ:
Цитата
Table comments:
(*) Each combination of processor option and memory model has a default memory type, and also one or more additionally available memory types. All constant and variable data which are put into the segments CCSTR, ECSTR, CSTR, CONST and CSTACK are always implicitly belonging to the default memory type.


Также обратите внимание, что в этой таблице все константы, не имеющие спецификатора flash имеют сноску номер 2, которая гласит:
Цитата
The initialized information is copied from program to data memory at startup. This is done in the ?C_STARTUP function in CSTARTUP.S90. The application accesses the variable in the data space. The used program space is never accessed after startup is fulfilled


Дальше будете спорить?
Tarbal
Цитата(demiurg_spb @ Jan 14 2014, 20:34) *
К тому что ваши ссылки, как собственно и измышления, исключительно для IAR. Но ведь есть и другие, более распространённые компиляторы, где const не гарантирует размещения данных в ПЗУ, что никак не противоречит стандарту. Об этом вам Сергей пытался намекнуть...


Я допускаю, что вы невнимательно читали то что я писал. Опять же ваши замечания о GCC мимо кассы, поскольку стартовый постинг был про Кейл.
О стандарте: Сколько я знаю компиляторов, у каждого есть свои особенности.

Цитата(Сергей Борщ @ Jan 14 2014, 22:09) *
Если повесите свою параллельную ПЗУ на внешнюю шину как память данных - команды будут одинаковые. Но опять же, это не компилятор положит во флеш, а вы запихнете ПЗУ в адресное пространство ОЗУ, этакое чесание левого уха правой ногой. Обе эти памяти будут находиться в одном адресном пространстве.


Я это допускал, поэтому в предпоследнем постинге и написал:
"Я уже не помню, а копаться лень. Для доступа ко внешней ЕПРОМ и для доступа ко внутренней ОЗУ используются одинаковые команды на ассемблере? Если разные, то это может объяснить многое в декларации функции с константным параметром."

Цитата(Сергей Борщ @ Jan 14 2014, 22:09) *
Обратите внимание на свой же документ:
Table comments:
(*) Each combination of processor option and memory model has a default memory type, and also one or more additionally available memory types. All constant and variable data which are put into the segments CCSTR, ECSTR, CSTR, CONST and CSTACK are always implicitly belonging to the default memory type.

Мне это ничего не говорит в контексте нашей дискуссии.

Цитата(Сергей Борщ @ Jan 14 2014, 22:09) *
Дальше будете спорить?

Я не спорю, а ищу ответы.
andrewlekar
Ну вот я собрал ваш код при помощи IAR AVR 5.3. Вот MAP файл:

Код
  FILE NAME : D:\projects\avr\just_test\Debug\Obj\main.r90
  PROGRAM MODULE, NAME : main

  SEGMENTS IN THE MODULE
  ======================
NEAR_I
  Relative segment, address: DATA 000000A0 - 000000A5 (0x6 bytes), align: 0
  Segment part 7.             Intra module refs:   main
           ENTRY                   ADDRESS         REF BY
           =====                   =======         ======
           str1                    000000A0
    -------------------------------------------------------------------------
NEAR_I
  Relative segment, address: DATA 000000A6 - 000000AB (0x6 bytes), align: 0
  Segment part 10.            Intra module refs:   main
           ENTRY                   ADDRESS         REF BY
           =====                   =======         ======
           str2                    000000A6
    -------------------------------------------------------------------------
NEAR_Z
  Relative segment, address: DATA 000000AC - 000000AD (0x2 bytes), align: 0
  Segment part 12.            Intra module refs:   main
           ENTRY                   ADDRESS         REF BY
           =====                   =======         ======
           ptr                     000000AC
    -------------------------------------------------------------------------
CODE
  Relative segment, address: CODE 00000054 - 000000A3 (0x50 bytes), align: 1
  Segment part 14.
           ENTRY                   ADDRESS         REF BY
           =====                   =======         ======
           main                    00000054        ?cstartup_call_main (?C_STARTUP)
               RSTACK = 00000000 ( 00000002 )
Сергей Борщ
Цитата(Tarbal @ Jan 14 2014, 20:46) *
О стандарте: Сколько я знаю компиляторов, у каждого есть свои особенности.
Да, особенности есть. Но вам уже третью страницу объясняют, что к const это не относится. Требование стандарта к const одно - компилятор должен выдавать ошибку при попытке записи в такую переменную. Все. В остальном эта обычная переменная. Далее ход мыслей у всех компиляторописателей обычно одинаков: разместить переменные с похожими свойствами (обнуляемые, инициализируемые и т.д.) рядом, чтобы при старте (если нужно) подготовить каждую группу к работе одним махом в цикле. Отсюда группирование переменных в сегменты. Никаких требований на размещение во флеш/ОЗУ для const стандарт на компилятор не накладывает, но и не запрещает, если это не мешает выполнению остальных требований стандарта.
В случае разных адресных пространств (AVR) размещение констант в программной памяти (флеше) нарушает требование быть обычной переменной. Поэтому для размещения в других адресных пространствах (одно из которых - память кода) вводятся расширения - ключевые слова типа __flash, __eeprom, idata, xdata, far, huge и подобные. const совершенно перпендикулярен к этому.
Если же архитектура имеет только одно адресное пространство, то появляется возможность работать с константами прямо во флеш не нарушая требования стандарта без всяких дополнительных ключевых слов, сэкономив таким образом ОЗУ и немножко времени на копировании при старте. И тут уже все в руках программиста - использовать такую возможность или нет. const снова никоим образом на это не влияет. Я показывал, что изменением положения одной строки в скрипте линкера можно получить вариант с константами в ОЗУ и константами во флеше. Оба варианта будут работать. И оба не нарушают стандарт.

Цитата(Tarbal @ Jan 14 2014, 20:46) *
Мне это ничего не говорит в контексте нашей дискуссии.
default memory - ОЗУ. Содержимое всех указанных сегментов по умолчанию попадает в адресное прстранство ОЗУ. В том числе и сегмент CONST. Если это вам ни о чем не говорит - я не вижу смысла в дальнейшей дискуссии.
Tarbal
Цитата(andrewlekar @ Jan 15 2014, 08:53) *
Ну вот я собрал ваш код при помощи IAR AVR 5.3. Вот MAP файл:


Спасибо. Убедили. Практика критерий истины sm.gif


Цитата(Сергей Борщ @ Jan 15 2014, 11:37) *
default memory - ОЗУ.


И как это следует из вашей цитаты?
ОЗУ насколько мне известно называется ОЗУ, а не default memory.
Почему не написано ОЗУ если это одно и то же?
С какой стати множить понятия?
dxp
Очень плотно использовал 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, живут сами по себе и не могут напрямую использоваться, например, для операций адресной арифметики, производимой над обычными объектами.
Сергей Борщ
Цитата(Tarbal @ Jan 15 2014, 15:13) *
И как это следует из вашей цитаты?
ОЗУ насколько мне известно называется ОЗУ, а не default memory.
default memory - память, в которую попадают "обычные" переменные. Куда они могут попасть кроме как в ОЗУ? Неужели и это надо было разжевать?
Tarbal
Цитата(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 - память, в которую попадают "обычные" переменные. Куда они могут попасть кроме как в ОЗУ? Неужели и это надо было разжевать?


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