-
- Edit. Пля-я-я! Чуть не застрелился. Всем спасибо. Mazur(446 знак., 15.09.2013 02:24 - 16:34)
- :) Победители: Bill и Скрипач. Я только вчера встретил пример while(x). Mazur(535 знак., 16.09.2013 15:02 - 15:15)
- Попробуй и так уже - не обязательно оптимальный для AVR, но без использования внешних переменных (dsp_buf) в теле функции Vit(416 знак., 16.09.2013 17:33 - 17.09.2013 09:37, ссылка, ссылка)
- Удивляюсь вам. У обычного Си приведение к типу void* происходит автоматически. Для чего вы переопределяете тип указателя явно? - Ксения(16.09.2013 23:03 - 17.09.2013 01:36)
- и для чего же??? - Vit(17.09.2013 01:10)
- От strlen() тут проку мало, т.к. она ищет концевой нуль, а буфере этого нет. - Ксения(16.09.2013 21:26)
- тут она считает длину строки и к буферу не имеет отношения - Vit(16.09.2013 22:48)
- За пример strlen благодарю. А то тут мне уже материться обещали, я и постеснялся спросить :) - Mazur(16.09.2013 21:14)
- Удивляюсь вам. У обычного Си приведение к типу void* происходит автоматически. Для чего вы переопределяете тип указателя явно? - Ксения(16.09.2013 23:03 - 17.09.2013 01:36)
- Кстати, а разница между этими двумя вариантами есть? - Bill(16.09.2013 16:26)
- Нет. - Mazur(16.09.2013 17:11)
- while() здесь победил, поскольку такой код ... ближе всего к ассемблеру! :) Именно так бы мы организовали цикл на ассемблере - на убывании счетчика, а не на его возрастании. Так же был когда-то организован цикл на Fortran'е. А у процессоров x86 Ксения(1127 знак., 16.09.2013 15:50 - 15:58)
- Первое на что я обратил внимание в for, что практически во всех примерах инкремент, а не декремент. Хотя декремент выгоден по тактам. Да и по коду. - Mazur(16.09.2013 21:17)
- Так, опять же, цикл и в случае while можно и на возрастание организовать. - Bill(16.09.2013 16:23)
- Плохой пример. Внутри функции отсутствует проверка на выход за границы диапазона массива. Чревато непредсказуемыми глюками. - rezident(16.09.2013 15:18)
- Да, полезно писать assert(n>=0 && n<SIZE); - fk0(16.09.2013 15:20)
- Уууу. >= даст Вам вечность. А n<SIZE спокойно разрешит выход за диапазон (если начальная x=SIZE-2, а n=3). Но Вы правильно мыслите. Здесь ИМХО уместно применить не какие-то левые x и n, а делать ClrStr(from,to). Тогда и проверять диапазон легче. - Юра(16.09.2013 22:58,
)
- Как в моем примере правильно применить? - Mazur(16.09.2013 15:36)
- Не надо вам assert - это лишний код :) - Ксения(16.09.2013 15:57)
- Уууу. >= даст Вам вечность. А n<SIZE спокойно разрешит выход за диапазон (если начальная x=SIZE-2, а n=3). Но Вы правильно мыслите. Здесь ИМХО уместно применить не какие-то левые x и n, а делать ClrStr(from,to). Тогда и проверять диапазон легче. - Юра(16.09.2013 22:58,
- Да, полезно писать assert(n>=0 && n<SIZE); - fk0(16.09.2013 15:20)
- В большинстве CPU есть DJNZ или аналогичная инструкция (DECFSZ и GOTO у PIC, например). Т.е. эффективен будет такой код: fk0(389 знак., 16.09.2013 15:12)
- Просто Мазуру надо в свойствах компилятора включить генерацию асм-файлов и иногда заглядывать, что у него получается. Сравнить, например, что компилер сгенерит на while b на for. - VAI(16.09.2013 17:41)
- В студии есть дизассемблер. Хотя я видел, выложенные листинги, где асм более нагляден. Есть ли в winavr такое? Mazur(88 знак., 16.09.2013 19:06)
- Я тебе уже говорил, как включить листинг в gcc. Твой winavr -- внутри на самом деле это gcc. - fk0(16.09.2013 19:41)
- Ты про это? Ни хрена не изменилось. - Mazur(16.09.2013 19:54, ссылка)
- Оппа. А твоя строчка не сохранилась. - Mazur(16.09.2013 19:55)
- Включил опцию использовать файл такой-то. Строчка осталась. Но результата не вижу. - Mazur(16.09.2013 20:06)
- Проблема большинства современных "программистов", в том, что они не умеют работать с компьютером. Я поэтому и говорю -- изучай как в unix образца 80-х годов всё делалось. Там можно подсмотреть и понять. Изучать расположение крыжиков в виндовой fk0(338 знак., 16.09.2013 22:39)
- Зря ты так. Крыжики сделали программирование доступным несметной орде
ламеровкреативных индивидов :-) - SciFi(16.09.2013 22:48)- У них программирование заключается в подбирании такой комбинации крыжиков, пока не заработает? - fk0(16.09.2013 22:52)
- Не знаю, не пробовал. Если судить по Мазуру, то именно так :-) - SciFi(16.09.2013 22:58)
- У них программирование заключается в подбирании такой комбинации крыжиков, пока не заработает? - fk0(16.09.2013 22:52)
- А-а-а! Диск отмонтировать забыла!... - Mazur(16.09.2013 22:42)
- PS: GUI нужно запретить. По крайней мере для обучения. - fk0(16.09.2013 22:40)
- Зря ты так. Крыжики сделали программирование доступным несметной орде
- Проблема большинства современных "программистов", в том, что они не умеют работать с компьютером. Я поэтому и говорю -- изучай как в unix образца 80-х годов всё делалось. Там можно подсмотреть и понять. Изучать расположение крыжиков в виндовой fk0(338 знак., 16.09.2013 22:39)
- Включил опцию использовать файл такой-то. Строчка осталась. Но результата не вижу. - Mazur(16.09.2013 20:06)
- Оппа. А твоя строчка не сохранилась. - Mazur(16.09.2013 19:55)
- Ты про это? Ни хрена не изменилось. - Mazur(16.09.2013 19:54, ссылка)
- Чтобы PORTA остался в дизасме? Наверное нет, но есть выходной файл имя_проекта.lss, в котором показано во что каждая строчка компилится. Примерно так выглядит: Apтём(619 знак., 16.09.2013 19:18)
- В дизасме хрен с ним. Скорее всего и не сделать так. А вот если бы листинг так создавался, было бы кошерно. - Mazur(16.09.2013 19:20)
- Ну так создаётся же, или этот не устраивает? Чем? - Apтём(16.09.2013 19:23)
- В дизасме хрен с ним. Скорее всего и не сделать так. А вот если бы листинг так создавался, было бы кошерно. - Mazur(16.09.2013 19:20)
- Я тебе уже говорил, как включить листинг в gcc. Твой winavr -- внутри на самом деле это gcc. - fk0(16.09.2013 19:41)
- В студии есть дизассемблер. Хотя я видел, выложенные листинги, где асм более нагляден. Есть ли в winavr такое? Mazur(88 знак., 16.09.2013 19:06)
- Первый вариант самый оптимальный, независимо от наличия инструкций типа djnz. - Bill(16.09.2013 15:29)
- Просто Мазуру надо в свойствах компилятора включить генерацию асм-файлов и иногда заглядывать, что у него получается. Сравнить, например, что компилер сгенерит на while b на for. - VAI(16.09.2013 17:41)
- То ли еще будет, ой-ёй-ёй... - Bill(16.09.2013 15:07)
- Попробуй и так уже - не обязательно оптимальный для AVR, но без использования внешних переменных (dsp_buf) в теле функции Vit(416 знак., 16.09.2013 17:33 - 17.09.2013 09:37, ссылка, ссылка)
- Переход от ассемблера на C обычно происходит много менее болезненно, чем переход от C на C++. У меня первое время просто корчи были. А Мазура в этой роли просто представить не могу. :) - Ксения(15.09.2013 19:27)
- гы, а зачем объявлять clr_string перед #define ? - zeleny(15.09.2013 15:37)
- переменная y в clr_string() не используется - нафиг её оттуда. Vit(197 знак., 15.09.2013 06:21)
- Ну так там и переменная i тоже не нужна. Bill(136 знак., 16.09.2013 11:23 - 11:33)
- вариантов оптимизации много, но следует учитывать и ситуацию, когда n == 0 =AlexD=(113 знак., 16.09.2013 11:50 - 17.09.2013 06:26)
- Учитывать можно по-разному: assert(n != 0). - SciFi(16.09.2013 13:11)
- Согласен. Случай n = 0 тоже нужно учитывать. - Bill(16.09.2013 13:06)
- не очень понимаю, что там Mazur чистит, но у него x меняется до x + n не всегда от нуля - в том примере от 3-х. - Vit(16.09.2013 11:53)
- Согласен. - Bill(16.09.2013 13:04)
- К примеру: Mazur(351 знак., 16.09.2013 12:05 - 12:10)
- стандартные функции форматирования вывода тебя спасут. Nikolay801_(137 знак., 16.09.2013 12:19 - 12:25)
- Так там и сама функция clr_string не нужна :о) Ибо есть библиотечная. Мазур учится. Скрипач(111 знак., 16.09.2013 11:37)
- Тогда уж лучше так: Bill(80 знак., 16.09.2013 13:17)
- Язык Си он такой :) Скрипач(44 знак., 16.09.2013 13:36)
- Ну да, это самая короткая запись. Только, я думаю, Bill(49 знак., 16.09.2013 13:39)
- Тут другое. Не факт что код будет лучше чем for(u08 i; - Скрипач(16.09.2013 13:43)
- А чем хуже? Сгенерированный код длиннее будет? Так это, по-моему, дело второе. По крайней мере в данном случае. - Bill(16.09.2013 13:49)
- Оптимизация в компиляторах - не эвристика. Стандартный случай имеет больше шансов получить дополнительную машинно-зависимую оптимизацию. - Скрипач(16.09.2013 13:51)
- Все правильно. Тогда стандартный случай будет выглядеть так: Bill(105 знак., 16.09.2013 14:28)
- Цикл от 0 до n с обращением к элементу массива по индексу более стандартен. - Скрипач(16.09.2013 15:08)
- А с этого момента поподробнее. - Bill(16.09.2013 17:36)
- Ничего конкретного, просто общие рассуждения. Скрипач(718 знак., 16.09.2013 19:50 - 19:54)
- А с этого момента поподробнее. - Bill(16.09.2013 17:36)
- Нет. Лучшим случаем для нормального компилятора (а не проф. уровня) будет таки memset, который выоптимизируется в команду а-ля LDIR на Z80, префикс повторения на PIC24 или x86 и т.п. - fk0(16.09.2013 14:37)
- Кстати сказать, блочные команды Z80 довольно медлены, самописные аналоги зачастую быстрее, так что оптимизация она такая штука занятная... - blackprapor(16.09.2013 20:17)
- Что конкретно быстрее? Тысяча LDI, LDI, LDI... вместо одного LDIR? Или push hl, push hl, push hl? Да без стека тяжко. Ещё вариант: LD HL,#xx, LD (#yy),HL. По скорости уже не то, по размеру ещё хуже чем LDI. - fk0(16.09.2013 22:44)
- Да, через стек делалось BlackPrapor(712 знак., 17.09.2013 09:09)
- Что конкретно быстрее? Тысяча LDI, LDI, LDI... вместо одного LDIR? Или push hl, push hl, push hl? Да без стека тяжко. Ещё вариант: LD HL,#xx, LD (#yy),HL. По скорости уже не то, по размеру ещё хуже чем LDI. - fk0(16.09.2013 22:44)
- memset - библиотечная функция. Это-во первых. Во-вторых, команды типа ldir довольно специфичны, мне не встречались Bill(116 знак., 16.09.2013 14:47)
- Компилятор может заменять вызов библиотечной функции на inline код. GCC это делает -- факт. Какие там у конкретного CPU команды дело десятое. Просто у многих CPU уровнем по-выше чем пик-контроллеры проф. уровня есть (префикс) команды повторения и fk0(850 знак., 16.09.2013 15:08)
- Так и я о том же. Библиотечная функция должна быть лучше самодельного цикла. Поэтому я в расчет ее не беру. А что касается развертывания цикла, то с этим Bill(169 знак., 16.09.2013 16:19)
- JIT-компиляция! - fk0(16.09.2013 17:25)
- Так и я о том же. Библиотечная функция должна быть лучше самодельного цикла. Поэтому я в расчет ее не беру. А что касается развертывания цикла, то с этим Bill(169 знак., 16.09.2013 16:19)
- 1) не имеет значения. 2) не имеет значения. 3) не имеет значения. - SciFi(16.09.2013 14:57)
- И почему? - Bill(16.09.2013 15:02)
- Ну это как голодающие дети Африки: кто-то скажет, что они имеют огромное значение, но сначала хочется своих детей накормить :-) - SciFi(16.09.2013 17:28)
- Компилятор для того и придуман. Чтобы это не имело значения. - Скрипач(16.09.2013 15:06)
- нут так, опять же. Компиляторы разные бывают. И потом, библиотечные функции далеко не всегда Bill(162 знак., 16.09.2013 15:14)
- И почему? - Bill(16.09.2013 15:02)
- Компилятор может заменять вызов библиотечной функции на inline код. GCC это делает -- факт. Какие там у конкретного CPU команды дело десятое. Просто у многих CPU уровнем по-выше чем пик-контроллеры проф. уровня есть (префикс) команды повторения и fk0(850 знак., 16.09.2013 15:08)
- Кстати сказать, блочные команды Z80 довольно медлены, самописные аналоги зачастую быстрее, так что оптимизация она такая штука занятная... - blackprapor(16.09.2013 20:17)
- Цикл от 0 до n с обращением к элементу массива по индексу более стандартен. - Скрипач(16.09.2013 15:08)
- Все правильно. Тогда стандартный случай будет выглядеть так: Bill(105 знак., 16.09.2013 14:28)
- Оптимизация в компиляторах - не эвристика. Стандартный случай имеет больше шансов получить дополнительную машинно-зависимую оптимизацию. - Скрипач(16.09.2013 13:51)
- Гы-гы, я вижу, тут многие "в поиске лучшего кода" :-) SciFi(28 знак., 16.09.2013 13:45)
- Конечно. Мне расслабляющий массаж, пожалуйста :о) - Скрипач(16.09.2013 13:49)
- Расслабляющий удар, вы хотели сказать? - blackprapor(16.09.2013 21:27)
- Спасибо, воздержусь :) - Скрипач(16.09.2013 21:48)
- Расслабляющий удар, вы хотели сказать? - blackprapor(16.09.2013 21:27)
- Развлекаемся просто, детство вспомнилось ;-) - =AlexD=(16.09.2013 13:48)
- Конечно. Мне расслабляющий массаж, пожалуйста :о) - Скрипач(16.09.2013 13:49)
- А чем хуже? Сгенерированный код длиннее будет? Так это, по-моему, дело второе. По крайней мере в данном случае. - Bill(16.09.2013 13:49)
- Тут другое. Не факт что код будет лучше чем for(u08 i; - Скрипач(16.09.2013 13:43)
- Ну да, это самая короткая запись. Только, я думаю, Bill(49 знак., 16.09.2013 13:39)
- Язык Си он такой :) Скрипач(44 знак., 16.09.2013 13:36)
- Тогда уж лучше так: Bill(80 знак., 16.09.2013 13:17)
- вариантов оптимизации много, но следует учитывать и ситуацию, когда n == 0 =AlexD=(113 знак., 16.09.2013 11:50 - 17.09.2013 06:26)
- Без y ни в какую не получается. Как можно сделать без y? - Mazur(15.09.2013 08:06)
- как-то так Vit(268 знак., 15.09.2013 08:56)
- Оппа. На (x) сразу не обратил внимания. Я делал без скобок. Спасибо. Получилось. Именно этого последнего штриха мне и не хватало. Так, способ известен. Что скобки дали? В смысле, хотелось бы понять механизм. - Mazur(15.09.2013 10:05 - 10:10)
- в твоём примере должно и без них работать. Vit(333 знак., 15.09.2013 10:21)
- Это называется "кормить тролля". Ну это ведь просто неприлично. Правильный ответ был: "RTFM". Ну или ссылочку на страницу учебника дать. - SciFi(15.09.2013 10:31)
- не учите меня жить(С). я не постеснялся перед тем задать гуглу вопросик "скобки в макросах" и обнаружил отсутствие учебников на первых 2-х страницах. остальное сдобрено дополнительными советами типа "макросы дерьмо, юзайте инлайн-функции". Vit(122 знак., 15.09.2013 10:47)
- Вот! Я нашёл K&R в онлайне с удобными ссылками! Давайте отныне Мазура посылать туда. Если после третьего раза станет очевидно, что он не читает, то можно будет начинать материться -> - SciFi(15.09.2013 14:09, ссылка)
- Добро. - Vit(15.09.2013 14:12)
- Вот! Я нашёл K&R в онлайне с удобными ссылками! Давайте отныне Мазура посылать туда. Если после третьего раза станет очевидно, что он не читает, то можно будет начинать материться -> - SciFi(15.09.2013 14:09, ссылка)
- не учите меня жить(С). я не постеснялся перед тем задать гуглу вопросик "скобки в макросах" и обнаружил отсутствие учебников на первых 2-х страницах. остальное сдобрено дополнительными советами типа "макросы дерьмо, юзайте инлайн-функции". Vit(122 знак., 15.09.2013 10:47)
- Это называется "кормить тролля". Ну это ведь просто неприлично. Правильный ответ был: "RTFM". Ну или ссылочку на страницу учебника дать. - SciFi(15.09.2013 10:31)
- в твоём примере должно и без них работать. Vit(333 знак., 15.09.2013 10:21)
- Именно так и делал. Mazur(215 знак., 15.09.2013 09:45)
- скопируй и проверь - Vit(15.09.2013 10:04)
- Вы все же попробуйте предложенный вариант)) Попытка не пытка. - Юра(15.09.2013 09:58,
)
- Оппа. На (x) сразу не обратил внимания. Я делал без скобок. Спасибо. Получилось. Именно этого последнего штриха мне и не хватало. Так, способ известен. Что скобки дали? В смысле, хотелось бы понять механизм. - Mazur(15.09.2013 10:05 - 10:10)
- как-то так Vit(268 знак., 15.09.2013 08:56)
- Ну так там и переменная i тоже не нужна. Bill(136 знак., 16.09.2013 11:23 - 11:33)
- :) Победители: Bill и Скрипач. Я только вчера встретил пример while(x). Mazur(535 знак., 16.09.2013 15:02 - 15:15)
- Что-то не выходит каменный цветок. Приведенные примеры компилируются в код вычисления. Сразу хочу сказать, не нужно выказывать свое раздражение. Сейчас в данный момент, на данном этапе мне нужно понять как создавать макросы, функции по аналогии с Mazur(1682 знак., 14.09.2013 23:07)
- Это есть рецидив, контрреволюция и надругательство над здравым смыслом. SciFi(42 знак., 14.09.2013 23:09)
- Где рецидив? На хера мне вычисление в коде, если мне нужно загрузить число, вычисленное по формуле? Просто сейчас я не могу найти аналогию параметра @ асма в си. - Mazur(14.09.2013 23:15)
- Все константы которые можно вычислить на этапе компиляции компилятор вычислит сам вас не спрашивая и в код поставит константу. Иногда бывает трудно добиться чтобы компилятор не подставлял константу а вставлял вычисления в код. - 3m(14.09.2013 23:40)
- "На хера мне вычисление в коде, если мне нужно загрузить число, вычисленное по формуле" - этот вопрос вообще не важен на данном этапе обучения программированию. Кроме того, он крайне вреден в контексте освобождения от
наркоасмозависимости. - SciFi(14.09.2013 23:22 - 23:27)
- Где рецидив? На хера мне вычисление в коде, если мне нужно загрузить число, вычисленное по формуле? Просто сейчас я не могу найти аналогию параметра @ асма в си. - Mazur(14.09.2013 23:15)
- Это есть рецидив, контрреволюция и надругательство над здравым смыслом. SciFi(42 знак., 14.09.2013 23:09)
- Написали бы в одну строку и не мучились: inline void clr_string (u08 x, u08 y, u08 a) { memset(dsp_buf + (y-1)*MaxX + (x-1), 0x20, a); } Ксения(292 знак., 14.09.2013 14:50)
- Спасибо. Ваш вариант получился. На самом деле о memset я сразу подумал. Аналогия с функцией очистки всего буфера. Только не знал как использовать в этом случае. Как inline встала как надо. Но главный вопрос остался, как создать макрос. - Mazur(15.09.2013 00:55 - 01:22)
- Вашу проблему с макросом я не поняла, а потому лучше промолчу. - Ксения(15.09.2013 01:40)
- Mazur, вам уже 100500 раз дали совет: читайте учебники! Не нравятся бумажные книги - гуглите! :) - rezident(15.09.2013 01:34, ссылка)
- Если я правильно понял ваши надежды на макросы... rezident(740 знак., 15.09.2013 01:53 - 01:56)
- Не нужно ему это. inline нужно когда функция вызыватся over9000 раз в секунду, чтоб сэкономить на вызове. В остальным случаях нужна -Os оптимизация по размеру скорей и без inline. И редко когда, -O3 и inline. Нужно бросить дурную привычку считать fk0(69 знак., 14.09.2013 15:03)
- Бесполезно. Я уже 100500 раз это ему повторял, а воз и ныне там. А про байты: я думаю, он их считать не переставал :-) Какой будет ступор, когда он узнает, что во многих ситуациях байты размениваются на такты и наоборот :-) - SciFi(14.09.2013 17:50)
- А я думаю, что Мазуру моя идея понравится. - Ксения(14.09.2013 17:23)
- А наркоману колеса нравятся. Мы тут не понравиться пытаемся, а наставить на путь истинный :-) - SciFi(14.09.2013 17:53)
- У Мазура свой путь! :) - Ксения(14.09.2013 18:29)
- "Учение Маркса всесильно, потому что оно верно." (C) ум, честь и совесть нашей эпохи. - fk0(16.09.2013 14:40)
- У Мазура свой путь! :) - Ксения(14.09.2013 18:29)
- А наркоману колеса нравятся. Мы тут не понравиться пытаемся, а наставить на путь истинный :-) - SciFi(14.09.2013 17:53)
- Спасибо. Ваш вариант получился. На самом деле о memset я сразу подумал. Аналогия с функцией очистки всего буфера. Только не знал как использовать в этом случае. Как inline встала как надо. Но главный вопрос остался, как создать макрос. - Mazur(15.09.2013 00:55 - 01:22)
- Общий подход: заменить эти числа макросами, а значения для макросов подсовывать препроцессору amx(186 знак., 14.09.2013 13:02)
- В каких-то случаях макросы действительно удобно в Makefile прописывать (через аргумент при вызовее компилятора), в каких-то всё-таки помещать в какой-то .h файл. Смотря что за макрос. Если, например, это ширина и высота дисплея -- то скорей в .h fk0(215 знак., 14.09.2013 14:06)
- Можно развернутый пример? Объявление, использование. - mazur(14.09.2013 13:06)
- Edit. Пля-я-я! Чуть не застрелился. Всем спасибо. Mazur(446 знак., 15.09.2013 02:24 - 16:34)