1. Си / Говнокод #27302

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    if (LD3_state == 0 || LD2_state == 0 || LD1_state == 0)
    {
        GPIO_SetBits(GPIOB, LED1); //RED ON
        LD_Status = NO_LOCK;
    }
    else
    {
        LD_Status = LOCK_OK;
    }
    
    if (LD4_state == 0 && LD_Status == LOCK_OK)
    {
        GPIO_SetBits(GPIOB, LED1); //RED ON
    }
    else
    {
        GPIO_ResetBits(GPIOB, LED1); //RED OF
    }
    
    if (LD4_state == 0 && LD_Status == LOCK_OK)
    {
        GPIO_ResetBits(GPIOB, LED1); //RED OFF
    }
    
    /* Ну можно же было сделать по-человечески, а? */
    /* Эквивалентный код: */
    
    LD_Status = LD1_state && LD2_state && LD3_state && LD4_state;
    if (LD_Status)
    {
        GPIO_ResetBits(GPIOB, LED1); //RED OFF
    }
    else
    {
        GPIO_SetBits(GPIOB, LED1); //RED ON
    }

    Как же я ненавижу чье-то легаси...

    Запостил: viteo, 18 Марта 2021

    Комментарии (33) RSS

    • Ого, ты там с 29-го декабря трудишься над легаси.

      Как вообще можно было написать такой код, который сверху? Вроде не на «PHP» проект, очевидные вещи-то можно красиво написать...
      Ответить
      • ты не поверишь...
        Ответить
        • Это ты написал этот код год назад? )))
          Ответить
          • Кажется, что железо это вообще такая хрень, где может быть вообще любой код.

            i = 42;
            sleep(12);
            i = 32;
            Ответить
            • Патч Бармина для stm32f1:
              *(uint32_t*)0x40022004 = 0x45670123;
              *(uint32_t*)0x40022004 = 0xCDEF89AB;
              *(uint32_t*)0x40022010 = 0x00000044;
              Ответить
              • если бы я знал, что находится по адресу 0x40022004 , то оценил бы шутку
                Ответить
                • 0x40022004 == FLASH_KEYR

                  Туда надо записать джва меджика чтобы снять блокировку FLASH_CR.

                  0x40022010 == FLASH_CR

                  Регистр управления флешкой.

                  0x00000044 == MER | STRT

                  Mass-erase, start.
                  Ответить
                  • Переведи на писи

                    На ум приходит low level format, который последние 28 лет работает не очень, и затирание флешки с прошивкой материнки, но там проприетарный API небось, цифр мы не знаем
                    Ответить
                    • Ну полное стирание флешки и есть. Примерно как тримнуть весь диск на ПК.
                      Ответить
                    • > затирание флешки с прошивкой материнки

                      Не, не настолько жёстко. Тут всё ещё можно перемычками на плате выбрать загрузку через system rom и залить новую прошивку. Даже если программатора под рукой нету.

                      Ну если перемычки не распаял -- то программатор.
                      Ответить
                      • у хорошей материнки обычно два флеша, их можно перемычкой выбирать, если обновился неудачно
                        Ответить
                        • Да тут тоже так можно. Вешаешь write-protect на часть флешки, вторую половину оставляешь под обновляемую часть.
                          Ответить
                          • Кстати, а у микросхем флеша интерфейсы же стандартные?

                            Я могу купить программатор, скачать .bin файл с сайта вендора, вытащить "биос" (или он не в кроватке?) и залить туда всё без ебли, например?

                            В моем детстве всякие стираемые светом чипы вполне себе перепрошивали в полудомашних условиях
                            Ответить
                            • Которые на материнках стоят? Да, обычный SPI флеш сейчас.

                              Вопрос в том, где ты полную прошивку скачаешь. Разве что с форумов умельцев. В обновлениях часто только куски выкладывают.
                              Ответить
                              • с восьмю ногами который?

                                Раньше биосы были на rom.by
                                Ответить
              • Как хорошо, что подобные операции с памятью в полноценных ОС запрещены законом.
                Ответить
                • Да в общем не запрещены, если ты в страничку попадешь.
                  Ответить
            • Всё правильно. Сначала I = 42, это нужно в одном потоке, т.к. у железки 42 чипа. Потом слип 12 секунд, за это время чипы ворецируются в другом треде... И когда этот тред выходит из слипа, можно сделать I = 32, потому что у программиса 32-х битная система, которая почему-то называется х86.
              Ответить
          • нет, но меня пугает тот факт, что это все таки написано и отправлено релиз. и то, что оно чудом работает в "нормальных условиях".
            этот код - пример того, что получается, если ты единственный специалист на селе.
            Ответить
    • На самом деле, эквивалентный код: GPIO_ResetBits(GPIOB, LED1); //RED OFF

      На 11 и 20 строке условие одинаково. Если оно истинно, то диод сначала включится и сразу же выключится. Если ложно, то он просто выключится.
      Ответить
      • > включится и сразу же выключится

        А потом окажется, что там на плате какой-нибудь сброс схемы триггерился по этому импульсу, а после оптимизации теперь всё поломалось.
        Ответить
        • ха-ха, ну тогда мне кранты)

          на самом деле все это завернуто в while(true) с секундной задержкой, и для оператора (и судя по всему для легаси программиста) это наносекундное моргание было просто незаметно.
          Ответить
      • А что, если по ТЗ нужно было моргнуть диодом? Тогда не эквивалентно.
        Ответить
        • > моргнуть

          Ага, на десяток другой наносекунд. Внимательный оператор легко это заметит.
          Ответить
          • У меня было видео на телефоне, там я снимал экран, чтобы потом покадрово его посмотреть и узнать, почему консольная программа так быстро закрывается.
            Ответить
          • Это если он успеет включиться. Вдруг там дроссель в цепи.
            Ответить
            • А если там ёмкость, то можно и заметить!
              Ответить
            • А вообще, почему все так верят, что это светодиод? Это же легаси код, мало ли что там реально подключено.

              Вдруг это электромагнит подъёмного крана. И если груз перекосило и lock пропал, он просто передёргивает магнитом чтобы поправить груз.
              Ответить
    • железячник писал
      Ответить
      • Хуже кода, который пишет железячник, только железо, которое паяет программист.

        Здесь должна быть ссылка на статью про лифт на ардуине.
        Ответить

    Добавить комментарий