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

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

Сообщение BCluster »

Дома буду проверю ) но дело в кодировке, ТС же писал
А команды да) особенно мне нра когда ща один такт две штуки исполняются))
Контактная информация:
Реклама
Встал на лапы
Сообщения: 118
Зарегистрирован: Ср фев 05, 2014 18:54:39

Сообщение jazz393 »

посоветовали сделать так
void getChar(char flash *a)
в пнд проверю
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев

Сообщение BCluster »

http://www.atmel.com/Images/doc1497.pdf
есть такой аппноут на эту тему. Но проблема не в этом 99%. У вас же с латиницей все работает нормально. Почитайте ссылку что я дал про кодировки
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

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

BCluster писал(а):А команды да)
Учитывая то, что там на уровне железа поддерживаются ветвления и таблицы переходов. Да и вообще много вкусностей... Я бы не стал сравнивать это с АВР. ) Это уже на уровне PC. Местами даже круче.
jazz393 писал(а):посоветовали сделать так
void getChar(char flash *a)
Тогда, наверное, вот имели в виду?: void getChar (char *flash a) Хотя это тоже самое, что и const. К тому же, если речь идет о студии - она не знает слова flash. А в CV-AVR все указатели по умолчанию ссылаются на флеш
Реклама
Эиком - электронные компоненты и радиодетали
Собутыльник Кота
Аватара пользователя
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев

Сообщение BCluster »

нет, есть действительно конструкция char flash*
вот результат с атмел студии 6 по ассемблеру

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

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

Странно.. У меня студия вообще на слово flash обижается.. Не знаю я такой переменной говорит, не объявлял ты ее нигде... И как ей втолковать, что не переменная вовсе...

Конструкция такая есть, только flash будет относится месту расположения массива. В принципе, тоже, что и const. А это насколько я понял, он уже пробовал..

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

Сообщение BCluster »

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

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

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

Сообщение BCluster »

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

Сообщение ARV »

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

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

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

Сообщение BCluster »

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

Сообщение ARV »

BCluster писал(а):Однако на практике, чаще всего компилятор константы хранит во flash все таки.
не факт. AVR-GCC этого не делает. по идее это не должен делать любой компилятор, если он стремится следовать стандарту.

иначе как вы объясните конструкцию void foo(const int too)? чем const int too здесь будет отличаться от const int poo; где-нибудь в хидере?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

Сообщение BCluster »

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

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

Пока Вы тут спорили, нашел интересную момент в том документе. Стр 17.
flash char max = 127;
flash char string[] = "This string is stored in flash";
__C_task void main(void)
{
char flash *flashpointer; ; Declare flash pointer
flashpointer = &string[0]; ; Assign pointer to flash location
UDR = *flashpointer; ; Read data from flash and write to UART
}

Обратите внимание, что не смотря на то, что string[] - массив (то бишь указатель на первый элемент) в коде получается адрес этого массива.... Не совсем понятно, почему просто ни присвоить указателю имя массива... Или там заморочка с флешью?

Кстати, док для IARa и я там больше ничего забавного про указатели не нашел
Последний раз редактировалось ИС-пытатель Пт мар 28, 2014 23:27:08, всего редактировалось 1 раз.
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

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

ARV писал(а): иначе как вы объясните конструкцию void foo(const int too)? чем const int too здесь будет отличаться от const int poo; где-нибудь в хидере?
Если у Вас функция получает константу в качестве аргумента, то почему не получить ее из флеш? по-моему эта конструкция не нарушает логичности. )
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18786
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

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

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

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

Сообщение ARV »

BCluster писал(а):Хм, действительно, avr-gcc хранит константы в ОЗУ. IAR для x51 и msp430 хранит константы во flash. Если точнее сказать, то это задача линкера - сегмент констант находится в флеше по дефолту
А разве в стандарте говорится, в какой памяти должны храниться константы?
Если логически рассуждать, какой смысл в хранении констант в ОЗУ, кроме времени доступа?
во-первых, AVR-GCC хранит константы и в ОЗУ, куда они попадают при выполнении startup-кода, и во flash, куда они помещаются линкеромпрограмматором и откуда берутся startup-ом. для интересу можете проанализировать листинг чего-то подобного char str[] = "test"; и вы увидите строку test во flash, а в отладчике затем увидите ее в ОЗУ.

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

для МК, в котором ОЗУ хранит только данные, а код хранится в ПЗУ, нет иного способа разместить константные данные в ОЗУ иначе, как скопировав их из ПЗУ кода. поэтому некоторые диалекты Си имеют опции, которые позволяют сэкономить на этом задвоении, но при этом нарушают стандарт.

ко времени доступа const вообще не имеет никакого отношения
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

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

Ну, так это и ежу понятно. Что это контролируется чисто со стороны компилятора. Просто если это не переменная (точнее переменная, которая не меняется) - нафига ее копировать в ОЗУ? Это уменьшает код и время выполнения. К тому же это справедливо для любой платформы. Потому что хранить константу нигде кроме как в исходном файле (флеш, жесткий диск или что-то еще) не получится. Не из воздуха же они берутся. Просто в PC все копируется в ОЗУ потому что та работает быстрее. А здесь смысла нет. Тогда какое тут противоречие? В стандарте прописано, что константы обязательно должны в ОЗУ храниться?
Последний раз редактировалось ИС-пытатель Пт мар 28, 2014 23:53:09, всего редактировалось 1 раз.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18786
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

void foo(const int poo);

по-вашему все логично, если мы используем функцию так: foo(12); - константа 12 будет взята из flash
а теперь скажите, как приплести сюда flash для использования функции так: int test; foo(test);
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Ответить

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