Обновить
-2
0
Павел Зимницкий@pddo

Пользователь

Отправить сообщение

Я понял. Конструктива не будет.
В таком случае, позволю себе ответить за вас. 40+ лет назад считалось нормально писать с goto, вы этому научены с детства, привыкли так писать и не собираетесь менять свои привычки по причине того, что молодое поколение этого не застало.


Также, напоследок, хочу напомнить, что goto — это только частный пример того, о чём говорится в обсуждаемой статье. У каждого кода есть причина по которой он написан именно таким образом, каким написан. Тот факт, что ваш код непонятен другим людям говорит о том, что при его написании для вас более приоритетно было что-то другое. Если это достаточно важно — ок, если нет — вы просто один из тех инженеров, о которых говорит автор. Это можете знать только вы.
На сим, заканчиваю этот разговор. Желаю вам успехов с вашей первой в мире реализацией и благодарю за минусы в карму. Доброй ночи

К сожалению, программирование микроконтроллеров выходит за рамки моих интересов, так что не смогу поучаствовать в вашем проекте.
Здесь же мы обсуждаем использование goto в коде.
Вы описали конкретный алгоритм, давайте по нему пройдемся, и вы скажете что именно в приведенном варианте не работает «от слова совсем»?
1.
Если оба бита шины в 0 — то выйти

if (R4 == 0) break;

2.
Дальше ждем TOUT изменения состояния шины.


while (true)
{
...  // "читаем еще раз ее состояние и пишем в STORE" находится здесь
count = 0;
while (R4 == R3 && count < TOUT)
{
   R4 = READ_BOTH_PINS;
    count++;
}
...
}

3.
Если не изменилась — то выходим.


if (count == TOUT) break;

Отлично, я рад, что мы вернулись к теме обсуждения. Давайте теперь предметно.
Изначальное утверждение, с которого началась эта ветка: читать с break проще, потому что сразу понятно, что эта инструкция находится в цикле и для понимания контекста достаточно посмотреть в начало текущего блока.
Почему, по вашему мнению, с goto проще?

Как вы могли заметить, я признал свою ошибку в другой ветке. sdima1357 указал на неё четко и ясно. Вы же решили меня оскорбить сославшись на абсолютно корректное утверждение. Также прошу заметить, что указанный участок кода не имеет никакого отношения к обсуждаемой теме, так зачем сейчас весь этот разговор?

А я и не утвержал ничего про единицу. Изначально вы обвинили меня в глупости в ответ на
Если видим ноль, то заменяем его на результат функции _getCycleCount8d8.

Если вам есть что сказать по теме обсуждения — welcome, иначе — на том и закончим, я не испытываю удовльствия от беребранок с незнакомцами.
Согласен, момент с записью времени упустил.
Тем не менее, я не ставил перед собой задачи разобраться с тем как работает USB. Мы обсуждали написание кода с goto и без. И если оставить запись в STORE как в оригинальном варианте, тогда останется сравнить два альтернативных варианта ожидания смены значения (хоть я и не уверен, что это хорошая идея мерять время итерациями цикла):
for(int k=0;k<TOUT;k++)
{
	R4   = READ_BOTH_PINS;
	if(R4!=R3)  goto START;
}

		
int count = 0;
while (R4 == R3 && count < TOUT)
{
    R4 = READ_BOTH_PINS;
    count++;
}

if (k == TOUT)
{
    break;
}


И, как по мне, второй вариант проще как раз по той причине, которую озвучил gridem: break позволяет без траты времени на поиск метки понять что происходит.
А вот тут вы глупость написали. Обратите внимание, что в коде стоит побитовое «ИЛИ», а не логическое.

Извините, но «0 | N» всегда N

Я не занимаюсь настолько низкоуровневыми вещами, так что заранее прошу прощения если упускаю какие-то детали (меня смутил момент про тайминги в однопоточном коде) или мои эстетические чувства не совпадают с вашими. Возможно, это связано с тем, что я не видел goto в коде уже лет 15. Тем не мнее, мне было совершенно не понятно что делает ваш код до того, как я взялся его рефакторить.


Сейчас же абсолютно очевидно, что мы просто читаем значения из одного источника и перекладываем их в другой пока не наткнемся на последовательность из TOUT одинаковых ненулевых значений или ноль. При нахождении нуля заменяем его на результат функции _getCycleCount8d8 и завершаем цикл.


Также, теперь стала заметна одна странная вещь. Она присутствует и в вашем и в моём варианте: если мы встречаем последовательность из меньше чем TOUT значений, то первое отличающееся значение не попадает в STORE. Опять же, я могу что-то упускать, но мне это не кажется корректным поведением программы. Такие неочевидные моменты стоит всегда снабжать комментариями, чтобы снизить когнитивную нагрузку на читателя (даже если goto ему привычен и более понятен).


Отредактированый вариант
void sendRecieveNParse()
{
    register uint32_t R3;
    register uint16_t *STORE = received_NRZI_buffer;
    __disable_irq();
    sendOnly();
    register uint32_t R4;

    while (true)
    {
        R4 = READ_BOTH_PINS;
        if (R4 == 0)
        {
            *STORE = _getCycleCount8d8();
            STORE++;
             break;
        }

        *STORE = R4;
        STORE++;
        R3 = R4;

        int count = 0;
        while (R4 == R3 && count < TOUT)
        {
            R4 = READ_BOTH_PINS;
            count++;
        }

        if (count == TOUT)
        {
            break;
        }
    }

    __enable_irq();
    received_NRZI_buffer_bytesCnt = STORE-received_NRZI_buffer;
}
Пользуюсь таким 2 с небольшим недели. Экран точно такой же, как и на последних iPad mini. Углы обзора достаточно широкие. Яркость днем держу на 30-40%, ночью — снижаю практически до нуля.
Есть специальный режим для чтения, но в нем все отдает желтым. Читаю в обычном.
К фронтальной камере особых запросов нет, а вот задняя не очень. Тот же iPad mini 2, у которого 5мп, снимает лучше.
Батареи хватает на полных 2 дня активного использования: серфинг, книги, пара часов видео вечером.
Игры не лагают. Все, что пробовал, шло на максималках без проблем.
Претензии есть только к софту. Много китайского, не используемого, барахла. Иногда тухнет экран без причины. Пару раз вообще не загорался, приходилось перезагружать планшет долгим нажатием питания. В стандартной прошивке (глобальная) присутствует DU Battery Saver, который своими оптимизациями сломал механизм зарядки. Устройство считало, что оно полностью разряженно и не включалось, хотя по факту было 70%. Отвез в сервис, что именно сделали — не сказали, но разбирать пришлось. Маркет и поиск по-умолчанию через настройки не меняются, хотя гугловские присутствуют.
В целом, пока впечатления позитивные.

Информация

В рейтинге
Не участвует
Откуда
Украина
Зарегистрирован
Активность