-
- :) Победители: 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)
- Да, полезно писать 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)