А команды да) особенно мне нра когда ща один такт две штуки исполняются))
непонимаю в чем проблема - перевод символов
Дома буду проверю ) но дело в кодировке, ТС же писал
А команды да) особенно мне нра когда ща один такт две штуки исполняются))
А команды да) особенно мне нра когда ща один такт две штуки исполняются))
- Реклама
- Сообщения: 118
- Зарегистрирован: Ср фев 05, 2014 18:54:39
посоветовали сделать так
void getChar(char flash *a)
в пнд проверю
void getChar(char flash *a)
в пнд проверю
http://www.atmel.com/Images/doc1497.pdf
есть такой аппноут на эту тему. Но проблема не в этом 99%. У вас же с латиницей все работает нормально. Почитайте ссылку что я дал про кодировки
есть такой аппноут на эту тему. Но проблема не в этом 99%. У вас же с латиницей все работает нормально. Почитайте ссылку что я дал про кодировки
Учитывая то, что там на уровне железа поддерживаются ветвления и таблицы переходов. Да и вообще много вкусностей... Я бы не стал сравнивать это с АВР. ) Это уже на уровне PC. Местами даже круче.BCluster писал(а):А команды да)
Тогда, наверное, вот имели в виду?: void getChar (char *flash a) Хотя это тоже самое, что и const. К тому же, если речь идет о студии - она не знает слова flash. А в CV-AVR все указатели по умолчанию ссылаются на флешjazz393 писал(а):посоветовали сделать так
void getChar(char flash *a)
нет, есть действительно конструкция char flash*
вот результат с атмел студии 6 по ассемблеру

вот результат с атмел студии 6 по ассемблеру
- Вложения
-
- aa.png
- (178.83 КБ) 574 скачивания
- Реклама
Странно.. У меня студия вообще на слово flash обижается.. Не знаю я такой переменной говорит, не объявлял ты ее нигде... И как ей втолковать, что не переменная вовсе...
Конструкция такая есть, только flash будет относится месту расположения массива. В принципе, тоже, что и const. А это насколько я понял, он уже пробовал..
А студия да.. вроде как адреса загружает... Хотя странно, что адрес с 0x0060.. Обычно адреса ОЗУ с 0x200 начинаются. Регистровый файл и все такое.. Или там имеется в виду флеш?
Конструкция такая есть, только flash будет относится месту расположения массива. В принципе, тоже, что и const. А это насколько я понял, он уже пробовал..
А студия да.. вроде как адреса загружает... Хотя странно, что адрес с 0x0060.. Обычно адреса ОЗУ с 0x200 начинаются. Регистровый файл и все такое.. Или там имеется в виду флеш?
const и flash обычно одно и то же, это правда. Мне тоже странной эта конструкция кажется.
Гляньте, если интересно, я выше сслыку на аппноут давал, там этому посвящен раздел
Гляньте, если интересно, я выше сслыку на аппноут давал, там этому посвящен раздел
Ща посмотрю, но обычно мне лень читать "попутную" с основной документацию большую, чем 2-3 страницы. ))
да... У ST вообще документация хромает порой, и размазана по 100500 документов, задалбывает однако
категорически не верно!BCluster писал(а):const и flash обычно одно и то же, это правда.
const - это указание компилятору не допускать изменение переменной, подчеркиваю: переменной. помещение данных не в ОЗУ, а в ПЗУ, если таковое делает компилятор в ответ на const, есть отступление от стандарта.
flash - это вообще не стандартный префикс-квалификатор, и вряд ли о нем стоит говорить. но если и говорить, то именно как сигнал компилятору размещать данные во flash-ПЗУ, а не в ОЗУ.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
ARV, вы правы.
Однако на практике, чаще всего компилятор константы хранит во flash все таки.
Однако на практике, чаще всего компилятор константы хранит во flash все таки.
не факт. AVR-GCC этого не делает. по идее это не должен делать любой компилятор, если он стремится следовать стандарту.BCluster писал(а):Однако на практике, чаще всего компилятор константы хранит во flash все таки.
иначе как вы объясните конструкцию void foo(const int too)? чем const int too здесь будет отличаться от const int poo; где-нибудь в хидере?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Хм, действительно, avr-gcc хранит константы в ОЗУ. IAR для x51 и msp430 хранит константы во flash. Если точнее сказать, то это задача линкера - сегмент констант находится в флеше по дефолту
А разве в стандарте говорится, в какой памяти должны храниться константы?
Если логически рассуждать, какой смысл в хранении констант в ОЗУ, кроме времени доступа?
А разве в стандарте говорится, в какой памяти должны храниться константы?
Если логически рассуждать, какой смысл в хранении констант в ОЗУ, кроме времени доступа?
Пока Вы тут спорили, нашел интересную момент в том документе. Стр 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 и я там больше ничего забавного про указатели не нашел
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 раз.
Если у Вас функция получает константу в качестве аргумента, то почему не получить ее из флеш? по-моему эта конструкция не нарушает логичности. )ARV писал(а): иначе как вы объясните конструкцию void foo(const int too)? чем const int too здесь будет отличаться от const int poo; где-нибудь в хидере?
читайте стандарт языка Си - к чему мне с Вами спорить?ИС-пытатель писал(а):Если у Вас функция получает константу в качестве аргумента, то почему не получить ее из флеш? по-моему эта конструкция не нарушает логичности. )
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Это долго. А вот если бы Вы пояснили в кратце, что Вы имели в виду - был бы очень признателен
во-первых, AVR-GCC хранит константы и в ОЗУ, куда они попадают при выполнении startup-кода, и во flash, куда они помещаются линкеромпрограмматором и откуда берутся startup-ом. для интересу можете проанализировать листинг чего-то подобного char str[] = "test"; и вы увидите строку test во flash, а в отладчике затем увидите ее в ОЗУ.BCluster писал(а):Хм, действительно, avr-gcc хранит константы в ОЗУ. IAR для x51 и msp430 хранит константы во flash. Если точнее сказать, то это задача линкера - сегмент констант находится в флеше по дефолту
А разве в стандарте говорится, в какой памяти должны храниться константы?
Если логически рассуждать, какой смысл в хранении констант в ОЗУ, кроме времени доступа?
во-вторых, Си - это платформонезависимый язык, и тот факт, что вы пользуете его для конкретной платформы с гарвардской архитектурой, вовсе не означает, что стандарт Си должен измениться под эту платформу. общепринятая система подразумевает хранение кода и данных в общем адресном пространстве - в ОЗУ. следовательно, просто не существует никакого способа обеспечить неизменность данных, чтобы получить константы. именно по этой причине в стандарте Си прописано, что константа - это всего-лишь переменная, которую компилятор не позволяет изменить. именно компилятор, т.е. проверки на изменение константы делаются на этапе компиляции, но взяв нетипизованный указатель вы легко сможете эту "константу" попортить (правда, некоторые продвинутые компиляторы и этот момент отслеживают, но принципиальная возможность все равно сохраняется)
для МК, в котором ОЗУ хранит только данные, а код хранится в ПЗУ, нет иного способа разместить константные данные в ОЗУ иначе, как скопировав их из ПЗУ кода. поэтому некоторые диалекты Си имеют опции, которые позволяют сэкономить на этом задвоении, но при этом нарушают стандарт.
ко времени доступа const вообще не имеет никакого отношения
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Ну, так это и ежу понятно. Что это контролируется чисто со стороны компилятора. Просто если это не переменная (точнее переменная, которая не меняется) - нафига ее копировать в ОЗУ? Это уменьшает код и время выполнения. К тому же это справедливо для любой платформы. Потому что хранить константу нигде кроме как в исходном файле (флеш, жесткий диск или что-то еще) не получится. Не из воздуха же они берутся. Просто в PC все копируется в ОЗУ потому что та работает быстрее. А здесь смысла нет. Тогда какое тут противоречие? В стандарте прописано, что константы обязательно должны в ОЗУ храниться?
Последний раз редактировалось ИС-пытатель Пт мар 28, 2014 23:53:09, всего редактировалось 1 раз.
поясняю.ИС-пытатель писал(а):Это долго. А вот если бы Вы пояснили в кратце, что Вы имели в виду - был бы очень признателен
void foo(const int poo);
по-вашему все логично, если мы используем функцию так: foo(12); - константа 12 будет взята из flash
а теперь скажите, как приплести сюда flash для использования функции так: int test; foo(test);
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!


