1. C# / Говнокод #25712

    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
    37. 37
    38. 38
    39. 39
    40. 40
    /* Infinite loop */
      /* USER CODE BEGIN WHILE */
      while (1)
      {
        Master_Slave_Check();
        if (CtrlBrd_Mode == 1) //MasterMode
        {
          SSPC_Check_Proc();      
          Read_ADC();
          Logic();
          RS_Enable();
          Obmen_RS();
          //CAN_Enable();
          //Obmen_CAN();
          
          //if (SoftFlag.Flag1.bit.History_Wr_Req)
          //{
          //  SoftFlag.Flag1.bit.History_Wr_Req = 0;
          //  Write_History();
          //}
          
          HAL_IWDG_Refresh(&hiwdg);	//Dog reset
          
          Migalka();    //Working LED blink
        }
        else if (CtrlBrd_Mode == 0) //SlaveMode
        {
          Slave_DeInit();
          while(1)
          {
            Master_Slave_Check();
            if (CtrlBrd_Mode == 1)    //если плата снова стала мастером, когда сдох основной мастер,
              HW_RESET();             //делаем аппаратный сброс для перезапуска (нога выставляется в 1, отпирает транзюк VT9, который садит на землю вход управления тракой)
            HAL_IWDG_Refresh(&hiwdg);	//Dog reset
            Migalka();
          }
        }
      }
      /* USER CODE END WHILE */
    }

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

    Запостил: ykypeHHbIu_nemyx, 10 Июля 2019

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

    • Кто-нибудь?...
      Ответить
      • нахуй.
        Ответить
      • пожалуйста
        /* Infinite loop */
          /* USER CODE BEGIN WHILE */
          while (1)
          {
            Master_Slave_Check();
            if ($CtrlBrd_Mode == 1) //MasterMode
            {
              SSPC_Check_Proc();      
              Read_ADC();
              Logic();
              RS_Enable();
              Obmen_RS();
              //CAN_Enable();
              //Obmen_CAN();
              
              //if (SoftFlag.Flag1.bit.History_Wr_Req)
              //{
              //  SoftFlag.Flag1.bit.History_Wr_Req = 0;
              //  Write_History();
              //}
              
              HAL_IWDG_Refresh(&$hiwdg);	//Dog reset
              
              Migalka();    //Working LED blink
            }
            else if ($CtrlBrd_Mode == 0) //SlaveMode
            {
              Slave_DeInit();
              while(1)
              {
                Master_Slave_Check();
                if ($CtrlBrd_Mode == 1)    //если плата снова стала мастером, когда сдох основной мастер,
                  HW_RESET();             //делаем аппаратный сброс для перезапуска (нога выставляется в 1, отпирает транзюк VT9, который садит на землю вход управления тракой)
                HAL_IWDG_Refresh(&$hiwdg);	//Dog reset
                Migalka();
              }
            }
          }
          /* USER CODE END WHILE */
        }
        Ответить
        • А что за поебень скрывается за функциями?
          Ответить
          • Черт его знает, в коде не написано
            Ответить
            • Тогда нельзя так переводить. Если вдруг там был вызов функции из переменной, то перевод будет неправильным.
              Ответить
        • Он пециально писал так, чтобы легко переводить на все языки.
          Ответить
    • А как платы договариваются, кто станет мастером? Постепенно повышают напряжение на выходе, пока другая не начнет глючить?
      Ответить
      • Ждём код Master_Slave_Check().
        Ответить
        • Может, они там фехтуют пенисами, как моллюски-гермафродиты... Не, мне вот это понравилось:
          HW_RESET(); //делаем аппаратный сброс для перезапуска (нога выставляется в 1, отпирает транзюк VT9, который садит на землю вход управления тракой)
          Неужели только так можно перезагрузить контроллер? Вот x86, помнится, перезагружался через контроллер клавиатуры, но тут вроде бы должна быть соответствующая инструкция... ну или через while(1); // Укуси меня собака
          (на x86 WDT не перезагружает процессор, а выдает сигнал на соответствующий выход, и если на плате он не разведен на Reset, то рестарт становится нетривиальной задачей...)
          Ответить
          • Можно выставить SYSRESETREQ в регистре AIRCR. Причём оно даже всю плату к хуям резетнет вместе с собой.
            Ответить
        • void Master_Slave_Check(void)
          {
          if ((Discrete1_State == 1) && ((Discrete2_State == 1) || (Discrete3_State == 1)))
          CtrlBrd_Mode = 1;

          if ((Discrete1_State == 0) && ((Discrete2_State == 1) || (Discrete3_State == 1)))
          CtrlBrd_Mode = 0;

          if ((Discrete1_State == 0) && ((Discrete2_State == 0) || (Discrete3_State == 0)))
          CtrlBrd_Mode = 1;
          }
          //первый вход - просто перемычка, я сам задаю, кто мастер, а кто слэйв. Другие два входа нюхают выходы со второй платы.
          //Не очень надежно, но другого пока не высрал)
          Ответить
          • > не очень надёжно
            Есть шанс, что после включения основной платы она сразу же станет мастером, а резервная плата узнает об этом только на следующей итерации.
            Ответить
          • Перечитал, теперь вообще не понимаю как это работает...

            > перемычка
            1 - основная плата, 0 - резервная?

            > выходы со второй платы
            Единичка выставляется на эти выходы при старте контроллера и никогда не убирается. Ноль - обрыв провода или сдох контроллер?

            Я правильно понял логику?

            З.Ы. Что лежит в CtrlBrd_Mode изначально?
            Ответить
            • Да, все верно. Подумываю заменить непрерывную 1 на стробы. Это пока еще прототип, впереди месяцы отладки...
              Ответить
              • в ктрлбрд лежит 1, но по-моему, без разницы, что там будет в начале т.к. дискрет№_стэйт есть макрос чтения состояния ноги хал_ридпин(гпио№, пин№)
                Ответить
                • Разница есть - без изначальной единички основная плата никогда не станет мастером если не увидит резервную.
                  Ответить
                  • они запускаются одновременно, та, что мастер, считает 1 с перемычки, вторая считает 0.
                    Ответить
                    • Ну вот если слейв дохлый, то мастер не запустится если в CtrlBrd_Mode изначально не 1. Т.е. начальное значение таки важно, а правило 1 никогда не используется :)
                      Ответить
          • > CtrlBrd
            Ккй бгр )))
            Ответить
      • Как геи договариваются, кто станет активом?
        Ответить
        • Зачем заминусовали? Коммент же в тему был...
          Ответить
        • 1) Перемычка может стоять
          2) Приоритет определяется адресом: при передаче адреса происходит одновременный мониторинг шины, несовпадение переданного бита означает присутствие на шине устройства с бóльшим приоритетом.
          3) Сражаются, пока один не отгрызет пенис другого
          4) При возникновении коллизии запускается алгоритм определения (например, CSMA/CD: генерируется сигнал помехи, чтобы партнер тоже перешел в режим определения, затем после [квази]случайной задержки и отсутствии приема происходит повтор передачи)
          Ответить
    • > HAL_IWDG_Refresh(&hiwdg
      >C#
      существует мнение что ты пиздун
      Ответить
      • Там с первых же строк по "while (1)" видно, что это даже близко не C#.
        Ответить
        • Больше всего похоже на код который грузят в адруину
          Ответить
          • Так и есть, только ардуина - это для детишек) на самом деле почти аналог атмеги. А STM и TI - это по хардкору)
            Ответить
            • > аналог
              Дык ардуина - это и есть атмега. Просто распаянная на плату и с готовыми железными и софтовыми модулями.
              Ответить
              • Я против атмеги. Я за логические цепи в факторио.
                Ответить
                • А я за «радиоконструктор», где схему нужно собирать из кубиков с транзисторами:
                  http://rw6ase.narod.ru/00/rk1/mrk2_8.jpg
                  Ответить
                • > логические цепи
                  Под них сложно мозг вывернуть... Но да, большинство практических задач они решают даже без кобенаторов.
                  Ответить
                • > логические цепи
                  Блин, на deathworld marathon пиздец какой-то. Начальные ресурсы прямо в упор к зергушатникам. Полчаса ныкался в ближайшем лесу. Отресёрчил турельки, построил парочку. С радости добавил ещё пару майнеров. Набежало штук 50 местных обитателей, кровь-кишки-гейм-овер. Какие тут логические цепи...
                  Ответить
                • 3 часа на новой мапе. Еле-еле успел огородиться, джва раза терял генераторы. База похожа на ёбаную кастрюлю с лапшой - всё натыкано в спешке и как-попало. По ночам хоть глаз выколи - нет времени расставить лампочки. Кругом хруст бетона, хрипы жуков, вспышки пулемётов. Эволюция местных обитателей дошла до 20%, скоро стены и обычные патроны не смогут их сдерживать... Добро пожаловать в ад.
                  Ответить
        • Кстати да
          У шарпеев строгая тупизация, там надо писить 1 == 1 тогда уже
          Ответить
          • Так можно, да, но в сисярпе так никто делать не будет, потому что while(true).
            А вот наличие указателей не говорит однозначно о том, что это не C#, они ведь там есть (правда, такой код нужно помечать как unsafe).
            Ответить
            • А можно же просто сказать ref и обойтись референсом вместо небезопасного укзаателя?
              Ответить
              • Именно так и нужно делать. Если тебе, конечно, не нужны всякие заебы типа арифметики указателей.
                Ответить
                • ну тоись сишарпер бы все равно написал тут реф а не амперсанд

                  более того: если передается не валуе тайп а обект, то вообще ничево писать не надо, он же и так через ука3атель работает всегда

                  реф для референс тайпа вообще не понятно зачем нужен
                  чтобы изменить сам референс?
                  в шарпе же так можно (в отличе от крестов) или нет?

                  если да, то выходит что ref в шарпе означает поинтер в крестах но безопасный

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

                    void M1(MyRefType obj) => obj = new MyRefType();
                    void M2(ref MyRefType obj) => obj = new MyRefType();


                    Первый метод для вызывающего кода не сделает ничего, а второй заменит объект по передаваемой ссылке на новый.
                    Ответить
                    • странное желание конечно

                      если я так хочу получить аутпут то есть же out
                      Ответить
        • А что, тру != 1 ?
          всегда так писал, проблем не было.
          & - указывает на адрес объекта в памяти МК. Только так можно передавать структуру или массив в функцию и наоборот.
          Вообще, это какие-то HAL-овские заморочки, в кококоторые я до конца не въехал. Начал осваивать данный МК месяц назад, ранее кокококодил под TI TMS320F280x и Миландровские камни.
          Ответить
          • Камни у тебя в почках.
            Ответить
            • пока не было, тьфу-тьфу... а буржуи их вообще силиконом зовут, что не менее доставляет)
              Ответить
          • Где здесь C#, ykypeHHbIu_nemyx!?
            Ответить
          • В c# 1 это инт, а тру это булен

            передавать структуру в функцию в сях действительно лучше по указателю (чо ее копировать тто?) но в c# это и так происходит
            Ответить
            • /*
              * ISO C Standard: 7.16 Boolean type and values <stdbool.h>
              */

              #ifndef _STDBOOL_H
              #define _STDBOOL_H

              #ifndef __cplusplus

              #define bool _Bool
              #define true 1
              #define false 0

              #else /* __cplusplus */

              /* Supporting <stdbool.h> in C++ is a GCC extension. */
              #define _Bool bool
              #define bool bool
              #define false false
              #define true true

              #endif /* __cplusplus */

              /* Signal that all the definitions are present. */
              #define __bool_true_false_are_defined 1

              #endif /* stdbool.h */
              Ответить
              • Чувак, ты знаешь что такое C# и чем он отличается от ISO C?

                Подсказываю: это разные языки, они просто называются похоже
                Ответить
            • > но в c# это и так происходит
              Структура (в отличие от класса) в сисярпе — это вэлью-тайп, она копируется при передаче в функцию. Чтобы передать ее по ссылке, нужно добавить ref (если только метод не async) или по хардкору юзать указатели как в сишечке.
              Ответить
              • а в джаве надо в куче место чтобы два байта переслать (хотя джитможет и починить)
                именно потому за сишарп
                Ответить
        • включена совместимость С99, компилятор не орёт.
          Ответить
          • Причём тут C99, ykypeHHbIu_nemyx?
            Ответить
            • а болт его знает. Если выключить, то будет куча ерроров
              Ответить
              • Болт? Усейн Болт?
                Ответить
                • Был такой браузер для мобильников. Аналог «Оперы Мини» и «UC Web». Выпуск новых версий «Болта» прекращён, потому что на него его же и положили.
                  Ответить
    • ykypeHHbIu_nemyx, тут Louie_Louie интересуется чем ты укурился.
      http://govnokod.ru/25712#comment488653
      Ответить

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