All streams
Search
Write a publication
Pull to refresh
21
0

Программист

Send message
Не верно, у "++" приоритет выше чем у "<<"
То есть «1<<0»!=«1<<1»
Так, все стоп! Разобрались же уже! )
Ниже читайте.
Вероятно из-за приоритетов. В AVR ASM тоже рекомендуют не использовать breq, а вычленять бит регистра статуса, хотя по времени — одинаково (не помню где читал, но на англицком).
И в этом случае Вы получаете как минимум две операции на загрузку значения из памяти в регистр,
когда из массива регистров, это делается за 1 цикл на значение.
mov R16, R20 (21,22,23,24,25,26,27)

В Вашем случае, компилятор сделает загрузку из памяти во временный регистр, потом копирование в R16. А это еще расходы по коду и скорости.

Да Вы попробуйте, а потом расскажете ))
Я это уже прошел.
Вы невнимательны, массив в регистрах, память не используется.
120 — прирост кода при реализации обработки масок с чтением из массива.
То есть при загонах компилятора с присвоением значений через временные регистры и тп.
Запутался сам :)

в первом варианте:
010, 100,…
во втором:
001,010,100…
Так в том то и дело, что результат отличен от предполагаемого!
для:
++phase; mask=(1<<t); маски будут такими: 001, 010, 011,100

а тут:
 mask=(1<<t);++phase; маски будут такими: 000, 001, 010,011

Вот теперь в точку!
Результат типа int ;)
Подведете итог? Без точек следования, потому что с этим разобрались сразу — логика работает быстрее.
про пример я имел ввиду выражение:
а если принять что всякий не 0 — истина, то последнее выражение может и не дать истины при истинных составляющих.
Ваш код при размещении массива в регистрах (для экономии памяти), для второго режима дал прирост используемой памяти в 120 байт.
Неоднозначность в том, что ожидалось так:
int t = phase;
mask=(1<<t);
++phase;

так что MaximChistov, абсолютно прав.
Так с любым ассемблером.
Я знаком с разными архитектурами под которые писал на ассемблере, но когда проект выходит за рамки нескольких сот байт, Си становится удобней.
А конкретно про эту задачу — да, в академических целях ее можно реализовать полностью на ассемблере и это будет удобней.
Здесь же я преследовал другую идею — получить быстрый ШИМ с заданной конфигурацией, и оставить место для реализации законченного проекта, который замечу, требует много ресурсов. Но это уже не суть данной статьи.

Я надеюсь, что те кому пригодится мой пример в их разработках, выберут для себя нужный режим, удалят комментарии,
правильно оформят нужное условие, и с пользой применят в своих разработках, доведя их до состояния завершенности.
При этом не испытывая трудностей в нехватке памяти и быстродействия.
А благодарностью мне, послужит полученное ими удовольствие.
И вновь:
дают один и тот же результат, на мой взгляд, спорное.

Приведенный Вами пример не соответствует тому примеру на который указал я.
При этом я не сторонник таких трюков, но иногда к ним прибегаю при необходимости.
И присоединяйтесь к обсуждению, оно чуть выше в комментариях :)
Это и означает — точка следования.
Он идентичен в обоих случаях по времени выполнения и размеру.
Загвоздка в том, что результаты обоих сравнений, одного типа.
Но вы уже близко к ответу. :)
Про это и речь, только если Вы внимательно читали мою статью, я как раз говорю наоборот:
Результат будет один и тот же, а вот выполняться второй пример будет ЗНАЧИТЕЛЬНО дольше по времени, и ЗНАЧИТЕЛЬНО раздует код.


Предположу, что Вы допустили опечататку.
И вновь с Вами согласен, но обратите внимание на Ваш код! :)
Согласен с Вами, именно поэтому и говорю — плохой пример ;)
Давайте не будем выдумывать, и рассмотрим такой вариант:
B=0b10;
if ((A==1) && B ) {} else {}
if ((A==1) & B ) {} else {}

думаю так проще для понимания.
Не правильно! Хоть вы и не учли мои требования, я Вам отвечу по поводу Вашего примера:
Результатом выражения в условии будет побитовая операция над результатами функций,
т.е. хоть порядок и не определен, результатом будет сложение, и в случае если результат отвечает моим требованиям (см предыдущий пост), то условие выполнится при любом результате этого сложения отличным от нуля (сложение побитовое конечно).

Когда при использовании ||, значение результата функции die(), для истинности условия не важно, при истинности результата connect().

Приведите хороший пример ;)

Information

Rating
Does not participate
Location
Россия
Registered
Activity