непонимаю в чем проблема - перевод символов

Обсуждаем контроллеры компании Atmel.
Ответить
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

А тут и приплетать ничего не надо. Если в функции нет модификатора const - то она может принимать любые значения (в том числе и флеш). А если есть - то вы внутри ее не можете изменить переменную (нельзя по стандарту), компилятор не позволит (опять-таки он контролирует).
Последний раз редактировалось ИС-пытатель Сб мар 29, 2014 00:46:33, всего редактировалось 2 раза.
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18786
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

ИС-пытатель писал(а):Просто в PC все копируется в ОЗУ потому что та работает быстрее. А здесь смысла нет. Тогда какое тут противоречие? В стандарте прописано, что константы обязательно должны в ОЗУ храниться?
нет, в РС все копируется в ОЗУ потому, что только из ОЗУ код может быть выполнен процессором. и в этом самом ОЗУ только на уровне операционной системы (не всякой!) можно сделать часть ячеек недоступными на запись, т.е. настоящими константами, однако и в этом случае попытка записи в них будет приводить к исключениям, т.е. эффекту ОС.

в стандарте прописано значение ключевого слова const. чувствуете разницу? и еще в стандарте прописано, для каких объектов это ключевое слово применимо - для переменных. чувствуете? этого достаточно. термин "константа" в стандарте так же определен довольно четко, вот пример настоящих констант "по стандарту Си": 12, 'f', "test"

я не говорю, что нарушать стандарты невозможно. на красный свет тоже можно переходить улицу. но если понимать, что именно написано в коде - не будет повода для всяких измышлизмов, а это неизбежно приблизит вас (или кого-либо еще) к уровню ежа, которому все понятно.
Последний раз редактировалось ARV Сб мар 29, 2014 00:07:26, всего редактировалось 2 раза.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18786
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

ИС-пытатель писал(а):Если в функции нет модификатора const - то она может принимать любые значения (в том числе и флеш). А если есть - то вы в нее не можете загрузить переменную (нельзя по стандарту). Т.е. только из флеш можете ее грузануть.
прототип функции я вам привел - вы утверждаете, что в нее нельзя передать в качестве параметра переменную?! с вами все ясно :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев

Сообщение BCluster »

Ну естественно, что он хранит их во flash в любом случае - иначе откуда он их прочтет при старте. Вопрос в копировании (и целесообрасности этого) этих констант из flash в ОЗУ. Для чего, по вашему мнению, нужно это? Еще раз повторюсь - я вижу и понимаю, что avr-gcc это делает. Только вопрос для чего это нужно.
Если мне надо хранить констант больше чем объем ОЗУ я должен буду применять нестандартные модификаторы доступа.

Вопрос почему вы называете ОЗУ единым адресным пространством. Допустим, MSP430 - фон Неймановская архитектура. Я могу получить доступ к любой ячейке, будь то флэш или ОЗУ, не важно. И каждый указатель будет уникален. Т.е. единое адресное пространство это и флэш и ОЗУ вместе.
И исполняется программа непосредственно из флэш памяти, в ОЗУ ничего не загружается.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

Для ARV.
Прошу прощения, перепутал. Это подразумевает, что переданная переменная не должна меняться в функции. А вот здесь уже работает сам компилятор. И больше никто. Так что опять-таки - никаких противоречий. К тому же, Вы сами говорите, что реализовать константу можно разными способами (Ваш пример с областью памяти с ограниченным доступом). Можно организовать и через флеш, а можно и программно (за счет компилятора). Так где в стандарте сказано, что можно использовать только конкретный способ? Вообще мы здесь вроде как собрались человеку помочь, а мы письками меряемся. Может, если Вы такой умный, расскажете ТС в чем проблема?
Последний раз редактировалось ИС-пытатель Сб мар 29, 2014 00:37:28, всего редактировалось 2 раза.
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

BCluster писал(а): Только вопрос для чего это нужно.
Если мне надо хранить констант больше чем объем ОЗУ я должен буду применять нестандартные модификаторы доступа.
На мой взгляд это просто недоделанная реализация компилятора, а не слепое следование стандартам. Ибо никакого противоречия.

Кстати, как ТС расшифровывается? Надеюсь не Тупая Скотина? ))) Не в обиду, конечно, создавшему тему.
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев

Сообщение BCluster »

ИС-пытатель писал(а):Прошу прощения, перепутал. Это подразумевает, что переданная переменная не должна меняться в функции.
тут связи такой как раз нет. Это косвенный эффект. Вопрос с том, что в зависимости от архитектуры, память либо разделена на память программы и данных, либо нет. В первом случае важно, указатель на флэш или на ОЗУ, во втором - адресное пространство едино, соответственно значения не имеет. Это и есть точка совместимости, и, на мой взгляд, причина копирования константных данных в ОЗУ на гарвардских процессорах.
ИС-пытатель писал(а):Кстати, как ТС расшифровывается?
топик стартер :) не переживайте ))))
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

Так даже если области разделены (гарвард), то обе они читаются откуда-то при старте. И один фиг эти константы там прописаны. Так вопрос зачем копировать все в ОЗУ?? Единственное оправдание этому - это то, что на некоторых архитектурах увеличивается скорость обращения к переменным. Но не более того. Либо как вариант - невозможность прочитать flаsh из кода программы. Но это уж слишком.. Достаточно было бы невозможности записать ее.
Собутыльник Кота
Аватара пользователя
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев

Сообщение BCluster »

ИС-пытатель писал(а):то обе они читаются откуда-то при старте
именно при старте, они читаются из флеш в ОЗУ. Ибо это - данные. Никаких причин для этого, кроме повышения скорости обращения к ним - я не вижу. Может наш старший товарищ ARV объяснит в чем еще причина. Следование стандарту весьма абстрактная сущность в данном контексте. Вопрос в том, что считать за память. АРМы считают за память, например, все что есть в МК (ОЗУ и флэш). На ПК память это ОЗУ. Оба фон Нейман.
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

Пусть лучше ТС поможет. ) А мы уж тут с ним разберемся! ))) Вдвоем осилим! ))

Вообще, насколько я понимаю, модификатор Const - не более, чем защита от ошибок. Если эта защита пересекается с какой-то другой функцией (без конфликтов) - то в чем проблема?
Собутыльник Кота
Аватара пользователя
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев

Сообщение BCluster »

весьма интересная беседа, жалко что не по теме.
У меня лично есть пара темных пятен, и я рад подискутировать по этому вопросу
А у товарища ARV есмь серьезный опыт и мозг. Поэтому его слушать полезно.

Насчет ТС - у него проблема в кодировке. Я в молодости когда на кодвижене баловался, имел данное счастье. Благо автор этого компилятора (румын :))) ) придумал прагму, меняющую кодировку выводимых строк
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

Про мозг я не спорю, но тут ARV явно не прав. Я в этом просто уверен на 1000%. Все его доводы про ОЗУ и про стандарт тщетны.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18786
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

ИС-пытатель писал(а):Про мозг я не спорю, но тут ARV явно не прав. Я в этом просто уверен на 1000%. Все его доводы про ОЗУ и про стандарт тщетны.
вы пытаетесь натянуть свое понимание префикса const на реальность, я же не пытаюсь этого делать, а просто говорю, как следует понимать const. а понимать его следует только в том контексте, как он описан в стандарте - чтобы не было каких-то непоняток. как определяет const стандарт - я кратко описал. точка.

теперь о том, как ведет себя компилятор. если забыть про то, что мы с вами знаем о разных местах хранения данных, то кажется, что компилятор имеет полное право разделять данные на меняющиеся и не меняющиеся по своему усмотрению и хранить одни в ОЗУ, а другие в ПЗУ. но это только кажется, потому что благодаря таким вот отступлениям от стандартного понимания const мы имеем проблемы с доступом по указателям. для нестандартных мест хранения данных придумали нестандартный префикс flash - для того, чтобы хотя бы формально стандарт не нарушать.

повторяю: вы путаете наше обычное слово константа (неизменная величина) с ключевым словом языка Си const (который почему-то просто переводите на русский, теряя его смысл). так вот, константа в Си - это действительно неизменяемая величина программы, но const - это квалификатор переменной!!! см. пример:

Код: Выделить всё

int test1 = 12; // здесь test1 - переменная, а 12 - константа
const int test2 = 33; // здесь test2 - неизменяемая переменная, а 33 - константа
char str[] = "test3"; // здесь str - переменная (массив, строка), а "test3" - константа
в доказательство попробуйте изменить константу 12 :) а вот изменить содержимое переменной можно. повторяю, не любой компилятор позволит, но попробуйте:

Код: Выделить всё

char *badptr;
badptr = (void*)&test2;
*badptr = 22; // должно прокатить
повторяю еще раз: не надо наделять стандартные ключевые слова языка какими-то своими смыслами, даже если они кажутся вам абсолютно логичными - это не приведет ни к чему, кроме путаницы и проблем в будущем, не у вас, так у ваших последователей.

что же касается проблемы ТС, то я перестал ковыряться в чужом говнокоде (без обид). мне это неинтересно. если продумать алгоритм его задачи и реализовать его аккуратно, все проблемы пропадут. а так у него "ввод в массив" означает на самом деле "вывод в массив" - даже тут путаница...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев

Сообщение BCluster »

ARV писал(а):теперь о том, как ведет себя компилятор. если забыть про то, что мы с вами знаем о разных местах хранения данных, то кажется, что компилятор имеет полное право разделять данные на меняющиеся и не меняющиеся по своему усмотрению и хранить одни в ОЗУ, а другие в ПЗУ. но это только кажется, потому что благодаря таким вот отступлениям от стандартного понимания const мы имеем проблемы с доступом по указателям
Если ОЗУ и ПЗУ в разных адресных пространствах - согласен. Если в одном - смысла не имеет.
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

Для ARV
Вы оперируете терминами, совершенно не вдумываюясь, на что они опираются. И к тому же, любите придираться к мелочам не несущим полезной нагрузки и ни на что не влияющим.
И "константа" и "модификатор переменной const" - это всего лишь программная реализация (компилятор). То что некоторые компиляторы позволяют изменить переменную с модификатором const - это всего лишь недочет компилятора. С таким же успехом можно написать компилятор, который позволит присвоить числу 12 число 5. И далее в программе если Вы напишете х = 12, переменной х присвоится значение 5. Тогда если рассуждать по Вашему, то получится, что константа 12 (в широком понимании этого слова) вовсе не константа.
Вообще это два разных понятия и сравнивать между собой константу и модификатор - бессмысленно.

А числу 12 Вы не можете присвоить значение потому что это Not Left Value (т.е. не может использоваться с левой стороны от знака равно). Есть даже защита от распространненой ошибки в условиях. Бывают программисты проверяя условие, вместо (a==10) пишут (a=10). Т.е. фактически вместо проверки условия присваивают переменной новое значение. Чтобы этого не происходило рекомендуют проверять так: (10==а) Здесь если пропустить по невнимательности одно равно, то компилятор Вас обматерит и не сгенерит программу. Т.е. опять-таки все упирается в конкретную реализацию компилятора.

К тому же конвертация из void в любой другой тип запрещена по вашему же стандарту. А вот обратная возможна. Так что если у Вас компилятор позволяет конструкцию, которую Вы соорудили - у Вас плохой компилятор, который не соответствует стандарту.
Последний раз редактировалось ИС-пытатель Сб мар 29, 2014 12:09:29, всего редактировалось 2 раза.
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

BCluster писал(а):Если ОЗУ и ПЗУ в разных адресных пространствах - согласен. Если в одном - смысла не имеет.
Опять-таки все от компилятора зависит. Если тот отследит, адрес какого адресного пространства мы присваиваем указателю и правильно сгенерит код - то эта проблема теряет смысл. Доброе утро! )
Собутыльник Кота
Аватара пользователя
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев

Сообщение BCluster »

ИС-пытатель писал(а): Если тот отследит, адрес какого адресного пространства мы присваиваем указателю и правильно сгенерит код
как он отследит? Если, например, есть адрес 0x0010 как в ОЗУ так и в ПЗУ. Откуда компилятор должен узнать к какой памяти мы хотим обратиться?
Доброе утро! )
доброе!
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

BCluster писал(а):как он отследит? Если, например, есть адрес 0x0010 как в ОЗУ так и в ПЗУ. Откуда компилятор должен узнать к какой памяти мы хотим обратиться?
А переменная у Вас при объявленнии в какой памяти проинициализирована? ))
На этапе присваивания указателю адреса переменной компилятор сделает пометку к какой области памяти та относится. И при использовании указателя сориентируется на эту пометку.
Другое дело, если программист присваивает указателю числовое значение. Но тут (раз он настолько в себе уверен) программист сам уже должен отслеживать всяческие операции и корректировать их при помощи модификаторов
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18786
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

ИС-пытатель писал(а):Вы оперируете терминами, совершенно не вдумываюясь, на что они опираются. И к тому же, любите придираться к мелочам не несущим полезной нагрузки и ни на что не влияющим.
во-первых, я оперирую терминами исключительно опираясь на стандарт, и не домысливая за стандарт по-своему. как написано - так и понимаю, так и оперирую. считаю, что подобного подхода вам и не хватает - вы слишком много думаете сами, не опираясь на стандарт.

во-вторых, я не считаю мелочью неверное толкование стандартных вещей, поэтому к ним и "придираюсь". чем меньше фантазий по поводу стандарта, тем меньше ошибок и проблем в коде.
ИС-пытатель писал(а):А переменная у Вас при объявленнии в какой памяти проинициализирована? ))На этапе присваивания указателю адреса переменной компилятор сделает пометку к какой области памяти та относится. И при использовании указателя сориентируется на эту пометку.
это опять ваши фантазии? по-вашему выходит вот что:

Код: Выделить всё

int *ptr;
_flash int f1;
int r1;

ptr = &f1;
int test = *ptr; // сейчас мы прочли из flash
ptr = &r1;
test = *ptr; // а сейчас прочли RAM
бред
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

Именно так. Почему бред? ) Очень даже ничего получается! ) Главное, удобно! )
ARV писал(а): вы слишком много думаете сами
А кто сказал, что думать плохо? )) желаю и Вам начать.
Ответить

Вернуться в «AVR»