> Часть 1
image

В качестве демонстрации решения, соберем готовое устройство, как пример: набор датчиков в одном корпусе.

Почему в этот ряд статей «приплетена» статья про модем? При тестировании модема были использованы те же решения, про которые пишется сейчас, как то создание устройств из ПП разработанных с целью изготовления модуля с более-менее законченным видом и имеющего в своем составе набор относительно унифицированных плат.

Печатные платы, в отличие от ардуиновских шилдов, делаются под пайку. Т.е. технология слегка отличающиеся от «быстренько воткнул и заработало».

В частности в тестовой версии модема, что собирался для проверки идеи как таковой, были использованы плата процессорная, плата макетная и трех-юнитовый корпус. Как это выглядело можно посмотреть на картинках статьи об испытании модема.

image
Плата макетная для корпуса D3MG

Вернемся к датчикам. Поскребши «по сусекам» на столе оказались:

  • DHT-22 — датчик влажности и температуры, интерфейс Single Wire (не путать с 1-Wire)
  • GY-65 — датчик давления и температуры, интерфейс I2C
  • GY-302 — датчик освещенности, интерфейс I2C
  • GAS Sensor (MQ-135) — датчик на кучу газов, но самое интересное — CO2, аналоговый выход

В общем, всё из набора для ардуинки.

image
Набор датчиков, DHT-22 впаян на плату мезонинную

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

«Слабым звеном» в этом наборе будет GAS Sensor. У него диапазон рабочих температур -10 +45. Остальные компоненты, включая датчики -40 +85. Это температурный пром. диапазон.

Применение компонент для данного температурного диапазона делает несколько дороже стоимость изделия. Если у кого то появится желание, то можно подобрать компоненты совместимые с примененными, но попроще, допустим диапазона температур -10 +70. Так же, для снижения стоимости, печатные платы можно укомплектовывать не полностью. Платы спроектированы на применение в пром. условиях. В домашнем хозяйстве нет таких жестких требований к оборудованию, поэтому такие компоненты как монитор старта, защита CAN, внешний кварц для МК, многоуровневые гальванические развязки можно не устанавливать. Цена изделия будет ниже, но и сфера применения ограничена.

image image
Модуль датчиков в сборе

Применительно к модулю датчиков, с целью посмотреть/оценить/протестировать ПО работы с каждым датчиком по отдельности и всех вместе, как и было упомянуто в предыдущей статье достаточно любой демо-платы с МК STM32F10x «на борту». На какие порты МК какие датчики цеплять — есть описание в архиве с исходниками.

image
Пример вывода датчиков, вывод данных на консоль.

DHT_t — температура, датчик DHT-22
DHT_h — влажность, датчик DHT-22
BMP085_p — давление, датчик BMP085
BMP085_t — температура, датчик BMP085
BHT1750 — освещенность, датчик BHT1750
CO2 — концентрация СО2 (вывод напряжения со входа АЦП, ppm более сложный пересчет)

Собранный модуль можно использовать для «автономной» работы, как тестовый или как мини-погодная станция. При тестировании, информацию с датчиков получаем через USB - UART. Питание модуля внешнее, DC 5V или 24V (мезонинные платы, для различного питания будут отличаться числом компонентов). При варианте работы через USB - UART перемычкой на плате МК можно запитаться от 5V USB.

Но, цель создания модулей по данной технологии это не развлечения с отдельной коробочкой, задача строить системы из подобных модулей, где каждый из модулей выполняет определенную функцию. Например уже созданный модуль датчиков. Для объединения модулей в сеть на плате с МК присутствует CAN интерфейс. Помимо CAN, в качестве эксперимента были построены небольшие беспроводные сети на основе ESP8266 и NRF24L01. Решение с использованием ESP8266 в то же время позволяет модулям самым простым способом подключиться к сети TCP/IP.

Но, вернемся к CAN. Наиболее разумное решение это один мастер, остальные подчиненные. Мастер с определенной частотой рассылает запросы, устройства?модули отвечают. Запрос?ответ асинхронны. Т.е. мастер не ждет, когда придет ответ от подчиненных. Но в то же время, если в заданный промежуток времени ответ от подчиненного модуля не пришел, то с этим модулем явно есть какие то проблемы. В то же время, в силу особенностей реализации CAN, любой модуль в произвольный момент времени может послать сообщение, напр об аварии или критическом событии, не дожидаясь запроса от мастера. Данное сообщение получат как мастер, так и все модули сети CAN.

CAN Bus дает возможность подключать наборы модулей к ПЛК различных производителей, в этом случае требуется написать библиотечные модули, напр. на языке ST, для поддержки промышленным контроллером протокола передачи данных для наших модулей. В этом случае ПЛК будет мастером.

Повторюсь, что в качестве мастера может выступать любой компьютер или микроконтроллер, такие как PC, Raspberry, Arduino, любой из наших модулей.

Например, для построения сети из модулей, на основе предложенной концепции, сделаем модуль USB?UART?CAN. Используем кусок платы, отрезанный от макетной. На этот кусок платы припаиваем плату с микроконтроллером и клеммы.

image
Модуль UART?CAN

image
Готовый модуль USB?UART?CAN

Заливаем в этот модуль прошивку CAN?Gate и можем работать, напр с нашими модулями датчиков по протоколу CAN, получая данные от модулей и управляя модулями. В частности, модуль CAN?Gate позволяет снифферить сеть CAN, посылать команды любым устройствам поддерживающих физическую реализацию данного протокола, не обязательно только нашим модулям. В то же время, как пример, из этого модуля я могу сделать мастера, поместив в него соответствующую управляющую программу. По сути этот модуль становится свободно программируемым ПЛК.

image
Пример сети CAN

Далее, если работать с CAN, то эксперименты с любой демо-платой закончены, ПО будет сильно привязано к разработанному «железу».

Подробнее про CAN, протоколе обмена и с чем их будем «есть» — в следующей части публикаций.

и… в связи с моим «неправильным поведением» местные «жители» заминусовали вусмерть, до невозможности дальнейших публикаций.
Посему статьи, в том числе продолжения буду публиковать на своем сайте.
Кому интересно, иногда заглядывайте…
Поделиться с друзьями
-->

Комментарии (155)


  1. lingvo
    26.02.2017 01:14
    +5

    Но, вернемся к CAN. Наиболее разумное решение это один мастер, остальные подчиненные. Мастер с определенной частотой рассылает запросы, устройства?модули отвечают.

    Неразумное решение — использовать протокол а-ля Modbus в сети CAN. Зачем тогда тот CAN вам нужен? Сделали бы RS485, и получили бы то-же самое за меньшие деньги.
    Вся изюминка CANа в мульти-мастерности и возможности разрешения коллизий на физическо-транспортном уровне. Благодаря этому можно избавиться от периодических запросов и получить гораздо более быструю реакцию при минимальной загрузке шины.


  1. Vasia529
    26.02.2017 07:29
    +2

    1) Выкиньте MQ-135, используйте NDIR-датчик (Nondispersive infrared sensor), например MH-Z19 (или любой другой)
    2) Какую практическую цель преследует измерение уровня концентрации углекислого газа в эл. щитке? Тем более таким хреновым датчиком?


    1. leocat33
      26.02.2017 07:42

      1) Выкиньте MQ-135, используйте NDIR-датчик (Nondispersive infrared sensor), например MH-Z19 (или любой другой)

      Если купиите модуль с Mh-z19, то за ваши деньги любую прихоть:)
      Mh-z19 CO2 датчик винзен датчик газа на Али стоит 1 915,36 руб, MQ135 в РФ 300 р. Показатели MQ в общем то стабильны. Калибровка каждого — да, нужна.
      2) Какую практическую цель преследует измерение уровня концентрации углекислого газа в эл. щитке? Тем более таким хреновым датчиком?

      Нигде и не написано, что монтаж модуля в шкаф. В шкаф в частности — да, но не этот конкретный модуль. В шкаф хорошо пойдет напр. модуль 8 каналов 0-20 мА, модуль 9 каналов 1-Wire, модуль 3 реле 220V 10 A, с датчиками тока по каждому,… Это все уже есть. А данный модуль вполне себе нормально и на стене смотрится. Монтаж либо на двусторонний скотч, либо на кусочек DIN-рейки в размер модуля. Монтаж-демонтаж намного удобнее, чем напр. маршрутизатор DIR-XXX от D-Link.


      1. Vasia529
        26.02.2017 08:16
        +1

        >данный модуль вполне себе нормально и на стене смотрится
        суровенько


        1. leocat33
          26.02.2017 09:04
          -3

          Пробовали такой на стену монтировать? Или так, абы коммент написать?


      1. gbg
        26.02.2017 08:31
        +1

        Dir-XXX имеет отверстия для надежного крепления за два дюбеля. Что гарантирует практическую невозможность отвала и падения на голову.

        Монтаж на «кусочек» чего-либо является кохлозом.

        А скотч отваливается.

        Выложите исходники на github. Чтобы посмотреть, что у вас нет watchdog и нелюбовь к циклам (зато тяга к копипасту), мне пришлось возиться с архиватором.


        1. leocat33
          26.02.2017 08:59

          Как часто модули с DIN-рейки отваливаются? А «кусочек» как раз и имеет 2 отверстия под анкеры/дюбели/шурупы.
          Вообще то watchdog есть, пока отладка — закомментирован. Копипаст чего/кого? Самого себя? Программы пишутся с нуля самостоятельно. Если есть возможность избегать циклы, то так и делаю. Работа в основном на прерываниях. Хотя циклов типа while — хватает. А насчет исходников: моя селедка, куда хочу, туда и повешу…


          1. gbg
            26.02.2017 09:30
            +1

            Посмотрим на ваше измерение силы тока:

            		ADC_RegularChannelConfig( ADC1, 1, 1, ADC_SampleTime_1Cycles5 );	// канал 1
            		ADC_SoftwareStartConvCmd( ADC1, ENABLE );							// включить преобразование
            		while( ADC_GetFlagStatus( ADC1, ADC_FLAG_EOC ) == RESET );			// ждем окончания преобразования
            		adc_v1[i_cur] = ADC_GetConversionValue( ADC1 );						// возвращаем результат
            
            		ADC_RegularChannelConfig( ADC1, 2, 1, ADC_SampleTime_1Cycles5 );	// канал 2
            		ADC_SoftwareStartConvCmd( ADC1, ENABLE );
            		while( ADC_GetFlagStatus( ADC1, ADC_FLAG_EOC ) == RESET );
            		adc_v2[i_cur] = ADC_GetConversionValue( ADC1 );
            
            		ADC_RegularChannelConfig( ADC1, 3, 1, ADC_SampleTime_1Cycles5 );	// канал 3; 5 на TST
            		ADC_SoftwareStartConvCmd( ADC1, ENABLE );
            		while( ADC_GetFlagStatus( ADC1, ADC_FLAG_EOC ) == RESET );
            		adc_v3[i_cur] = ADC_GetConversionValue(ADC1);
            
            	


            Почему вы здесь не применили for? Код оказался бы в три раза компактнее. А лучше бы использовать прерывания, а еще лучше — DMA.


            1. leocat33
              26.02.2017 09:34
              -4

              Есть один простой вопрос, который убил многие интересные начинания: а нафига?
              Код открыт. Что не нравится — меняйте. Можете прислать патч, возможно включу в релиз.
              Просто огульно хаять — …


              1. gbg
                26.02.2017 09:41
                +8

                Я для этого и попросил вас выложить код в систему контроля версий. И это называется не «огульно хаять», а тратить мое личное время на написание вам рекомендаций по повышению качества кода. Если ваша публикация такой цели (получение советов и рекомендаций сообщества относительно ваших изделий)не преследует — я тем более не буду тратить свое время.


                1. leocat33
                  26.02.2017 09:48
                  -11

                  Можно ли изнасиловать женщину на площади?
                  Ответ — нет! Прохожие достанут советами.


                  1. EighthMayer
                    27.02.2017 10:00
                    +2

                    Публикуйтесь тогда в текстовике у себя на рабочем столе.


              1. teleghost
                26.02.2017 15:27
                +2

                leocat33, мне понравилось то, что Вы написали в статье, но я давно заметил, что хороший «электронщик» и хороший кодер — редкое сочетание. То, что Вы оставили в коде — это разбрызганные капли олова и разлитый флюс на конечном изделии. Поэтому либо закрывайте код совсем, либо, наоборот, выкладывайте на площадку с контролем версий и лучше сразу включайте заднюю, не газуйте:)

                Да, полировать глюкало можно до бесконечности, но для того люди и придумали такую дисциплину, как рефакторинг кода, есть определённые основания и правила заниматься наведением порядка. Не могу сказать за «убитые начинания», но продуктов плохим кодом было убито тоже немало, а сколько ещё будет убито — и не сосчитать. Дьявол в деталях, и невнимание к ним — это глюки и уязвимости в IoT, от которых будут массово страдать наши современники и потомки, извините за пафос. Хорошего дня.

                PS тем более, что это всё явно связано с управлением электропитанием


                1. leocat33
                  26.02.2017 16:13

                  Согласен, код не «причесан». Да и цели такой на этом этапе не ставилось. Задача показать, что железо работает. В коде кусков копи-пасте от собственных же разработок и закомментаренных блоков — более чем. Но уж если некоторые и начинают заниматься критиканством, то это в тех местах кода, где вообще нет ничего критического. Например float и большая часть sprintf исключительно для вывода информации UART, причем как тестовой. В реальном устройстве обмен данными по CAN. Консоль только для конфигурации. С конфигурацией, по тексту программы, надеюсь все понятно?
                  Да и в статье пока нигде не упоминается про программирование.


            1. leocat33
              26.02.2017 09:41

              Да, и это не измерение силы тока:) Это измерение НАПРЯЖЕНИЯ на АЦП:) Где то в программе function.c используется? Хвосты, от других программ, валяется себе, никому не мешает:) Этот фрагмент кода — тестовый, и от… 2014 года!
              Респект, как очень внимательному читателю:)


              1. gbg
                26.02.2017 09:48
                +4

                Так зачем вы мусор в проект кладете? Подчеркнуть низкое качество вашей работы?

                Я фрагмент кода назвал по вашему же комментарию:

                // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                // Вычисление действующего значения переменного тока
                // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                


                1. leocat33
                  26.02.2017 10:41
                  -4

                  Поскакавши по верхушкам проекта насколько реальную оценку вы в состоянии дать?
                  Жду патчей!:)


                1. leocat33
                  26.02.2017 10:48
                  -6

                  А «мусор» это проверка на вшивость адекватность восприятия информации и внимательность.


                  1. Ugrum
                    26.02.2017 13:41
                    +1

                    а сердечник трансформатора мы изготавливаем из дерева, чтобы не гудел, всё равно эту дипломную работу никто читать не будет.


                    1. leocat33
                      26.02.2017 14:13

                      Кому что…
                      Не боитесь, что петля гистерезиса на корпус замкнет?


                      1. leocat33
                        26.02.2017 15:33

                        А-а-а! Минусуете! Значит все таки страшно?


                        1. Ugrum
                          26.02.2017 15:50

                          Я? Минусую?
                          Пфф. Не имею ни желания, ни возможности.


            1. olartamonov
              26.02.2017 13:46

              Какой вы терпеливый человек…

              Я вот почитал дискуссию, скачал архив, открыл архив, открыл main.c, прочитал первые строки:

              int main()
              {
              	float		f1, f2;
              


              Уверен, весь остальной код там оптимизирован на таком же уровне.


              1. leocat33
                26.02.2017 14:10
                -2

                Ну — малаца! Первые 3 строчки прочитали. Не каждый осилил main.c открыть… Кто-то начинал смотреть «хлам» да еще с условной компиляцией:)))
                И где вы тут дискусию нашли?!


                1. olartamonov
                  26.02.2017 14:20
                  +3

                  Вы так радуетесь, как будто в этих трёх строчках что-то хорошее написано.

                  У вас, извините, там float на STM32F1. И весь этот float сделан ради возможности сделать sprintf с десятыми долями.

                  Хотите, я вам открою страшную тайну, известную любому нормальному программисту, поднявшемуся выше уровня поделок на ардуине?

                  int x = SOME_VALUE_HERE;
                  char buf[SOME_SIZE_HERE];
                  snprintf(buf, sizeof(buf), "%d.%d", x/10, abs(x%10));
                  


                  1. leocat33
                    26.02.2017 15:22
                    -2

                    И?


                    1. olartamonov
                      26.02.2017 15:25
                      +3

                      Да нет, ничего особенного. Просто ваш float — это сотни байт лишнего кода и падение скорости выполнения на порядок на ровном месте.

                      Но пока у вас ардуиноподобное изделие, в котором всё это крутится в while(1), изящно управляемое конструкцией delay_ms, ничего страшного. Обычный любительский наколенный говнокод.


                      1. leocat33
                        26.02.2017 15:30
                        -3

                        Тот же DS18B20, или Single wire, как для них обеспечить необходимый интервал времени? Ах да, через nop-ы (классика жанра)
                        И, ну да, экономия целых 200 байт! команд. Сейчас программа, со всеми принтф-ами занимает 15к из 64. + 8 байт!!! ОЗУ.
                        И?


                        1. olartamonov
                          26.02.2017 15:35
                          +3

                          Я же говорю, для вашей программы и вашего уровня — всё совершенно нормально. Орлята учатся летать.

                          Просто не надо на одной странице с этим употреблять слова «PLC», «демонстрация решения», «интернет вещей» и тому подобные.

                          Это должно называться «Я решил освоить STM32, подскажите, где у меня ошибки?».


                          1. leocat33
                            26.02.2017 15:39
                            -6

                            вам сюда: Сайт


                            1. olartamonov
                              26.02.2017 15:42
                              +3

                              … сообщил мне человек со стремительно уменьшающейся кармой.

                              Я ведь серьёзно говорю. Ваш код — это очень-очень начальный уровень, плохо написанный, неэффективный. Вам надо учиться нормально писать, для начала.

                              Если же вы вместо этого просто будете бросаться на всех, кто этот код критикует, вы так и будете стряпать кривоватые наколенные поделки, которые будут способны заинтересовать разве что среднего ардуинщика.

                              Вот тот же float. Он у вас употреблён же не потому, что как-то серьёзно упрощает код, улучшает его читаемость, повышает точность вычислений и т.п.

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


                              1. leocat33
                                26.02.2017 15:44
                                -4

                                Во, быстро вы вернулись…


                              1. Falstaff
                                26.02.2017 17:16
                                +2

                                Гхм. Я, пожалуй, рискну и побуду адвокатом дьявола. :) Мне кажется, что «неэффективный» — это далеко не всегда эквивалент «плохо написанный». Да, во встраиваемом ПО эффективность важна, но и там — не всегда и не везде. Питание не батарейное, ресурсов достаточно, задачи научить тонкостям embedded разработки статья, как я понимаю, не ставит.

                                Да, надо знать особенности своей системы и то, как писать эффективный код. Но я сторонник той точки зрения, что не стоит всегда писать эффективно ради эффективности. В первую очередь код должен быть ясным. Например, вверху gbg упомянул for — да, это может сделать код более читаемым. А вот использование целочисленной арифметики вместо float — это как раз ухудшает читаемость, это буквально стояние на голове и пляски вокруг ограничений платформы. Читаемость — это использовать float там, где его идиоматично использовать. В этом коде последствий скорее всего никаких нет с точки зрения решаемой задачи. У всего должна быть причина, в том числе и у неочевидных оптимизаций.


                                1. olartamonov
                                  26.02.2017 17:22
                                  +1

                                  Я в третий раз повторю: если у автора стояла задача «быстро сварганить на коленке из говна и палок», то он с ней прекрасно справился.

                                  Проблема в том, что автор в своих текстах озвучивает совершенно другие задачи и совершенно другими словами.

                                  В качестве демонстрации того, как надо делать, чтобы решить некую более общую задачу, этот код имеет глубоко отрицательную ценность — в нём практически всё сделано так, как делать не надо. Как только автор в этом коде захочет сделать хоть что-то отличное от «по кругу читаем имеющиеся сенсоры» — проще всего будет код выкинуть целиком и написать нормально.

                                  Более того, человек с минимальным опытом написания хоть сколь-нибудь сложных систем так писать просто не будет.


                                  1. Falstaff
                                    26.02.2017 17:34

                                    Я не читал весь код, признаться, поэтому не знаю, какую ценность имеет остальная часть кода. Поэтому я говорю об очень частных вещах, вот именно о заявлении «...float <...> не потому, что улучшает его читаемость...». Таки улучшает, и намного. Коленный рефлекс сразу использовать целочисленные фокусы вместо напрашивающегося float без оглядки на специфику проекта — это, мне кажется, такая профессиональная деформация эмбеддеров (не обижайтесь, я тоже эмбеддер, у меня она тоже есть). Можете пояснить, почему использование плавающей точки означает, что код не написан нормально?


                                    1. olartamonov
                                      26.02.2017 17:39
                                      +1

                                      Потому что этот код жрёт до черта места и процессора.

                                      Батарейное питание, многозадачность, работа из прерываний — во всех случаях, кроме линейной простыни с гигантскими delay_ms, этот код будет работать плохо.

                                      И так у автора написано, похоже, всё. Даже банальное желание снимать показания с датчиков с разной периодичностью приведёт либо к выкидыванию всего этого хлама, либо к эпическим костылям в нём.

                                      И в итоге не очень понятно, зачем повторять уникальные возможности и стиль программирования Arduino на STM32, когда можно было, натурально, взять Arduino и получить ровно то же самое.


                                      1. leocat33
                                        26.02.2017 17:50
                                        -1

                                        И так у автора написано, похоже, всё.

                                        Не читал, но осуждаю
                                        Да угомонитесь вы… Да, все, что сделано не лезет в ваши шаблоны.


                                      1. Falstaff
                                        26.02.2017 18:03
                                        +1

                                        До чёрта — это сколько? И сколько места и процессора вам в данном конкретном случае не хватает, чтобы всё это экономить ценой читаемости кода? Мне всегда казалось, что «до чёрта» — это весьма относительное понятие, сильно зависит от того, сколько у вас есть и сколько ещё вам надо.

                                        В том, как вы говорите «линейная простыня», тоже чувствуется некая неприязнь. Ну да, в более реалистичном случае у вас будут не задержки холостыми циклами, а какой-нибудь vTaskDelay() или ожидание семафора, но в общем случае линейный код — это замечательная вещь, нет ничего плохого в том, чтобы к нему стремиться, если задача позволяет.

                                        Вы почему-то стремитесь примерить этот код к намного более общим случаям — а если понадобится другая периодичность, а если перейдём на крохотную батарейку, а если понадобится ещё токарным станком из этого кода управлять, мало ли. Но суть в том, что здесь вряд ли понадобится. Да, смотреть в будущее нужно и важно, но есть и другая крайность — если в реальный проектах увлекаться «а если», то получается overengineering, плохо поддерживаемый код и сорванные сроки, и всё потому что вы решили сделать всё через DMA, прерывания и целочисленную арифметику, а потом это три месяца героически отлаживали, превращая код в нелинейные макароны и горы остроумно сделанного неопределённого поведения. Это часто необходимо, но если так получилось, что нет — мне кажется, это замечательный повод не идти на жертвы ради неясных целей.


                                        1. olartamonov
                                          26.02.2017 18:09
                                          +1

                                          Вы почему-то стремитесь примерить этот код к намного более общим случаям


                                          Я?

                                          Это я автору в статью написал, что он будет делать универсальный программируемый логический контроллер?


                                          1. Falstaff
                                            26.02.2017 18:16

                                            Ну, да. Единственное применение слово «универсальный» было в предыдущей статье, и то касалось железа. Плюс в следующем же параграфе была приписка: «… не буду рассматривать особенности и тонкости программирования МК. <...> Будут предложены готовые «прошивки» под конкретные задачи.» Вроде бы автор дал понять, что пишет под конкретную задачу и на универсальность прошивки не претендует.


                                            1. olartamonov
                                              26.02.2017 18:17
                                              +3

                                              Вы мне можете объяснить, чем этот цикл статей по своей сути отличается от «как я помигал светодиодом на Arduino»?

                                              Если ничем — то он зачем вообще нужен? Про мигание светодиодом на ардуине написано уже более чем достаточно. Цель цикла какая?


                                              1. leocat33
                                                26.02.2017 18:30
                                                -3

                                                Блин… Дошло до меня, как до жирафа, где там долгий
                                                delay_ms( 5000 ); // Waiting for measure
                                                Таак… Похоже датчики, особенно температурные вы только на картинках видели… Нельзя температурные датчики «дергать» чаще, чем раз в 3 сек. Он просто начинает разогреваться, вычисляя температуру. Да и процесс вычисления занимает 700-800 мс. Плюс инерция самого датчика. Вот и получается 5 сек. А загонять процессор в сон… При общем потреблении всех датчиков более 300мА, смысл? Останавливать датчики нельзя, ибо потом на разогрев 10 мин потребуется. Есть подозрение, что вначале нужно было таки разобраться, с чем мы работаем…


                                                1. olartamonov
                                                  26.02.2017 18:34
                                                  +1

                                                  Нарастает ощущение, что вы просто не понимаете слова, которые я пишу.

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


                                              1. Falstaff
                                                26.02.2017 18:33

                                                Оно чуть более продвинутое, чем мигание светодиодом, но да, с программной точки зрения без особой претензии на что-то отличное от «… как я светодиодом помигал». Я так для себя понял, что цикл в основном о железе, на основе которого другие могут наколхозить своё, и со своей прошивкой.

                                                Вообще, автор скажет точнее. Я-то комментировал на тему того, что садиться разрабатывать каждую прошивку так, как если бы у вас был каждый байт и такт на счету — это тоже не очень хорошая вещь. Не стоит ругать людей за всякий случай, когда они написали читаемый код вместо быстрого.


                                                1. olartamonov
                                                  26.02.2017 18:44
                                                  +1

                                                  Оно чуть более продвинутое, чем мигание светодиодом


                                                  Чем?

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

                                                  А если я в процессе про таймеры вспомню, то функциональность-то ещё и получше выйдет.

                                                  Я-то комментировал на тему того, что садиться разрабатывать каждую прошивку так, как если бы у вас был каждый байт и такт на счету — это тоже не очень хорошая вещь


                                                  Есть такая штука, как набор рефлексов хорошего разработчика. Железячник не будет задумываться, надо ли положить земляной полигон или поставить керамику по обе стороны от LDO — он это просто сделает, здесь не о чем раздумывать. Точно так же хороший программист под микроконтроллеры на тривиальных операциях даже не будет задумываться об использовании float — конечно нет, зачем он тут нужен? Ну и так далее.

                                                  Это шаги, не требующие вообще никаких измеримых затрат. В коде не становится на тыщу строчек больше, его читаемость меняется только для человека, который вчера начал Basic осваивать. Об этом не надо думать, сделать так — рефлекс. Не сделать так — потенциальный способ прострелить себе ногу на следующем же шагу. Зачем своими руками создавать себе пусть даже потенциальные проблемы, ради чего?

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


                                                  1. Falstaff
                                                    26.02.2017 19:26
                                                    +1

                                                    Чем?

                                                    Тем, конечно, что там не светодиоды и кода общения с периферией больше нескольких строк. Я не сомневаюсь, что вы сделаете на ардуино то же самое. Может быть быстрее, если вы уже знакомы с ардуино — не берусь судить. А какой функциональности вам не хватает здесь?

                                                    Есть такая штука, как набор рефлексов хорошего разработчика. <...>… хороший программист под микроконтроллеры на тривиальных операциях даже не будет задумываться об использовании float...


                                                    Почему? Мне действительно интересно. Если разработчик остановится и подумает, то он может вспомнить, что плавающая точка у него где-то в проекте уже используется по объективным причинам (и, значит, место во флэше он уже на это потратил) а эта тривиальная операция не находится на критическом пути выполнения, или что у него Cortex-M4 с аппаратной плавающей точкой, или что-нибудь ещё в этом роде, и что, с другой стороны, коллегам не придётся продираться сквозь целочисленные хаки. Разработчик, рефлекторно пишущий нечитаемый код просто по привычке — это плохой разработчик. Причём не имеет значения, пишет ли он бездумно float, или бездумно отказывается от него. Ключевое слово здесь — «бездумно».

                                                    Возможно, написать snprintf(buf, sizeof(buf), "%d.%d", x/10, abs(x%10)); не требует от вас много больших затрат, но вы не задумались о когнитивных затратах тех, кому этот код потом читать и поддерживать. Им придётся остановиться и задуматься, что же это вы такое остроумное сделали. Да, это займёт у них всего лишь несколько секунд, но таких мест у вас будет много. Зачем создавать им проблемы в виде нечитаемого кода, если проект от этого не выигрывает?


                                                    1. olartamonov
                                                      26.02.2017 19:39

                                                      Тем, конечно, что там не светодиоды и кода общения с периферией больше нескольких строк


                                                      Так кода для этой периферии готового — как говна за баней. И он в общем достаточно тривиальный, более того, как уже отмечалось выше — автор его стащил из пачки разных проектов и свалил в кучу, особо не разбираясь, где что.

                                                      Может быть быстрее, если вы уже знакомы с ардуино — не берусь судить


                                                      Лет десять назад что-то там делал.

                                                      Разработчик, рефлекторно пишущий нечитаемый код просто по привычке


                                                      Послушайте, если для вас этот код нечитаемый, ну или вызывает хотя бы двухсекундную паузу при чтении, есть же PHP там всякие, Javascript вот ещё можно освоить. В C вам рановато немного, зачем вы себя мучаете?

                                                      Им придётся остановиться и задуматься, что же это вы такое остроумное сделали


                                                      Ох ты ж боженьки. На snprintf — задуматься. А когда на следующей странице им встретится какой-нибудь кольцевой буфер, наполненный структурами с массивами указателей, они упадут на бок и засучат ножками, как те козы, у которых при любой опасности припадок случается?


                                                      1. Falstaff
                                                        26.02.2017 21:15

                                                        Хм. Да вот, захотелось помучаться, видите ли… Писал себе на Бейсике, горя не знал, верите. Но душа ищет приключений; понимаю, что не по зубам, IQ низок, никак не могу научиться рефлекторно писать код, всё время думать начинаю… Вообще, давайте не не обсуждать мою скромную персону, а то совсем меня застыдите.

                                                        Так значит, ваши коллеги должны читать два лишних выражения в коде только потому, что они это могут и у них много свободного времени, а вам захотелось отказаться от плавающей точки? Никакой мотивации отказа, обусловленной платформой/задачей/контекстом/требуемыми и доступными ресурсами вы не предлагаете?

                                                        Вы извините, что я ещё раз это спрашиваю, просто я никак не могу понять вашу мотивацию. Рефлекторно делая такую вещь, вы: a) тратите своё время; b) тратите время коллег, которым этот код читать; c) усложняете код, потенциально внося ошибки в целочисленной арифметике. Вы получаете, условно говоря, N килобайт свободной флэш-памяти и экономите M тактов в том месте, где вы написали этот код. Сами по себе эти килобайты и такты ничего вам не дают. Когда вы рефлекторно пишете то, что пишете, вы уже знаете, на что потратите эти килобайты и такты? Как они отразятся на потребительских качествах продукта?


                                                        1. olartamonov
                                                          26.02.2017 21:24
                                                          +1

                                                          Так значит, ваши коллеги должны читать два лишних выражения в коде


                                                          Человек, у которого это вызывает затруднения, не имеет шансов стать моим коллегой. Вот вообще никаких.

                                                          Вы понимаете, что вы мне компостируете мозг вещью, которая для любого профпригодного программиста микроконтроллеров вообще не стоит обсуждения, даже трёх секунд не стоит, а вы пишете по три абзаца текста на каждую итерацию?

                                                          Мы тут с коллегами — настоящими, не вашими воображаемыми — смешной тест для собеседования придумали. Берутся два куска кода, один другому передаёт данные. Между двумя системами, интерфейс неважен, пусть хоть UART. В обоих описана одна и та же структура в полтора десятка членов, она передаётся и принимается одним бинарным куском, тупо побайтово. Одна система — MIPS, gcc. Вторая — x86, Visual C++. Всё описание, функции — всё идентично до последнего пробела.

                                                          Объяснить, почему на выходе вместо данных мусор.

                                                          А вы мне всерьёз пытаетесь сообщить, что snprintf(buf, sizeof(buf), "%d.%d", x/10, abs(x%10)) — это ух какая сложная конструкция, многих в тупик поставит.

                                                          Что особенно ужасно, вы это делаете на примере кода, от вида которого кровь из глаз сочится.

                                                          Вы там драйверы датчиков на I2C видели? Вы что, всерьёз считаете, что психически здоровый человек добровольно согласится ЭТО поддерживать?

                                                          Когда вы рефлекторно пишете то, что пишете, вы уже знаете, на что потратите эти килобайты и такты?


                                                          Весь смысл написания эффективного кода — в том, что вы не знаете, будут ли у вас через полгода лишние килобайты и такты.

                                                          И поэтому не тратите их уже сейчас, чтобы через полгода проджект-менеджер не начал вам делать больно.


                                                          1. Falstaff
                                                            26.02.2017 22:02

                                                            Ну, стоящий код писать не получается, поэтому пишу абзацы, чем богаты… Вопрос не в том, могут ли коллеги понять то, что вы написали. Вопрос в том, что вы не объяснили, зачем им это читать. Никого не поставит в тупик ни мусор в стуктуре (в конце-концов, даже если люди не помнят, что MIPS бывает big endian, они быстро разберутся на месте), ни ваши два выражения, но структуру вам нужно принять по объективным соображениям (и то не факт — могли бы взять protobuffers), то ваш snprintf может оказаться результатом вашей борьбы с призраками.

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

                                                            Весь смысл написания эффективного кода — в том, что вы не знаете, будут ли у вас через полгода лишние килобайты и такты.


                                                            Я возьму на себя смелость сказать что, если вы через полгода запланировали сдачу проекта, то вы обычно уже имеете представление, какая у вас будет в общих чертах функциональность, и где у вас могут случиться затыки. Откуда вы знаете что, если вы погонитесь за скоростью и начнёте переписывать редко исполняющийся алгоритм в целочисленном виде, вы не сорвёте сроки по другим задачам? Откуда знаете, что упрётесь именно в N килобайт и M тактов, и именно эта оптимизация позволит вам уложиться в срок?

                                                            Если я скажу, давайте перепишем всё на ассемблере, так мы ещё больше сэкономим — вы ведь назовёте это абсурдом, нет? Слишком много потратим времени, игра не стоит свеч. Чем тогда другие немотивированные оптимизации отличаются от этой?


                                                            1. olartamonov
                                                              26.02.2017 22:13
                                                              +1

                                                              в конце-концов, даже если люди не помнят, что MIPS бывает big endian, они быстро разберутся на месте


                                                              Половина правильного ответа, думайте дальше.

                                                              Я возьму на себя смелость сказать что, если вы через полгода запланировали сдачу проекта


                                                              И поклялся никогда и нигде написанный для него код больше не использовать.

                                                              то вы обычно уже имеете представление, какая у вас будет в общих чертах функциональность


                                                              Всегда рад познакомиться с человеком, который в начале работы над прошивкой может уверенно сказать, впишется она в 16K RAM / 64K ROM — или надо в устройство контроллер на ступеньку выше закладывать.

                                                              И надо ли во втором случае разницу в стоимости контроллеров, умноженную на размер партии, вычесть из его зарплаты.

                                                              Чем тогда другие немотивированные оптимизации отличаются от этой?


                                                              Я в какой раз повторяю, в пятый, да? Тем, что вы не потратите на них никакого измеримого дополнительного времени.


                                                              1. Falstaff
                                                                26.02.2017 22:51

                                                                Думать — да ну, полно, я же не смогу. :) Вопрос code reuse — это уже отдельный вопрос. Вы всегда точно и достоверно можете сказать, что именно этот код будет использоваться в других проектах, и стоит его оптимизировать? Настолько, что рефлекторно начинаете с оптимизаций? Никто не придёт к менеджеру и не скажет — вот бы включить в план переписывание алгоритма пооптимальнее, вдруг мы его будем использовать где-нибудь ещё.

                                                                Всегда рад познакомиться с человеком, который в начале работы над прошивкой может уверенно сказать, впишется она в 16K RAM / 64K ROM…

                                                                Всегда рад познакомиться с человеком, который уверен, что его рефлексы гарантируют то, что он уложится в эти рамки. :) Откуда уверенность, что в конечном счёте именно плавающая точка вызовет переполнение доступной памяти? (И кстати, за сколько месяцев до производства партии вы хотите закупать контроллеры?)

                                                                Тем, что вы не потратите на них никакого измеримого дополнительного времени.


                                                                Вы ведь понимаете, что, чтобы удержать проект от использования плавающей точки, в большинстве случаев вам придётся менять не одну строку кода? Если ваш рефлекс позволит вам написать ваш snprintf в проекте, где нигде больше float не к месту — да, это быстро. Если у вас есть обработка данных, где float идиоматичен — тогда ваш проект с float и проект без float будут сильно отличаться, и целочисленная реализация займёт вполне измеримое время.


                                                                1. olartamonov
                                                                  26.02.2017 22:53
                                                                  +1

                                                                  и стоит его оптимизировать


                                                                  Надо ли мне в шестой раз повторить, что эта «оптимизация» не стоит ничего, или у вас какой-то специфический случай выборочной слепоты?

                                                                  в большинстве случаев вам придётся менять не одну строку кода


                                                                  Изначально аккуратно написанный код не приходится менять. Менять приходится продукт «я сделяль».


                                                                  1. Falstaff
                                                                    26.02.2017 23:07

                                                                    Надо ли мне в шестой раз повторить, что эта «оптимизация» не стоит ничего, или у вас какой-то специфический случай выборочной слепоты?


                                                                    Которая, реализация алгоритмов в целочисленном виде, чтобы проект не использовал float? Вы всё повторяете, но я, хоть убейте, не вижу вашу аргументацию. Если вы разработали (или откуда-то взяли) алгоритм, использующий float, то вы либо реализуете его как есть (и при этом вам в большинстве случаев становится всё равно, будет ли ваш snprintf выводить float, потому что проект уже потянул soft float), либо вы переписываете алгоритм в целочисленный вид — и вот это уже будет тратой времени, а любая трата времени должна быть обоснована. И даже изначальное проектирование этого алгоритма в целочисленном виде займёт больше времени в том случае, если идеологически он должен работать с плавающей точкой. Вы не уйдёте это этого добавленного времени, вы его всё равно заплатите за выигрыш во флэше и времени выполнения.


                                                                    1. olartamonov
                                                                      26.02.2017 23:24
                                                                      +1

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

                                                                      Что характерно, выше у вас нагляднейший пример, к которому слово «проектирование» даже применять смешно, хотя вы уже полдня и пытаетесь это сделать.


                                                                      1. Falstaff
                                                                        26.02.2017 23:35

                                                                        Отчего же сразу stackoverflow. Например, вы берёте алгоритм из научного исследования, где он приведён в псевдокоде. Или от разработан вашим отделом алгоритмистов, и они его вам дали в Matlab. Он ведь не появляется сразу оптимизированным для embedded, нет?

                                                                        О нагляднейшем примере — не соображу, о чём именно вы говорите. Который?


                                                                        1. olartamonov
                                                                          26.02.2017 23:36
                                                                          +1

                                                                          О нагляднейшем примере — не соображу, о чём именно вы говорите. Который?


                                                                          На который вы в этом треде отвечать начали.

                                                                          Спокойной ночи, мне надоело что-то это «на колу мочало». Рад за вас, если у вас хоть десять процентов реального кода под STM32 составляют алгоритмы, разработанные специальным отделом в матлабе.


                                                                          1. Falstaff
                                                                            26.02.2017 23:41

                                                                            То есть мгновенный и беззатратный процесс превращения из скрипта Matlab или теоретического описания в целочисленную реализацию не опишете? Хм… Хорошо, давайте закруглимся; не обижайтесь, если я где слишком настойчиво спорил. Спокойной ночи.


                                                                            1. olartamonov
                                                                              26.02.2017 23:44
                                                                              +1

                                                                              Отсутствие такого алгоритма, вне всякого сомнения, даёт вам полное и абсолютное моральное право положить болт на любую оптимизацию кода вообще.

                                                                              М-да.


                                                                              1. Falstaff
                                                                                26.02.2017 23:58

                                                                                Нет, конечно. Не знаю, откуда взялась «любая». Просто я сторонник того, чтобы каждую оптимизацию в каждом случае взвешивать — много ли даст и стоит ли жертв. Мне нравится оптимизировать код, но при этом я хочу точно знать, что мне это даст и что я заплачу.

                                                                                P.S.: Да, ваш пример со структурой. Чтобы сказать вам вторую половину, их надо видеть, но я догадываюсь. Они у вас не упакованные, нет?


                                                                                1. olartamonov
                                                                                  27.02.2017 00:00
                                                                                  +1

                                                                                  (в седьмой раз) В обсуждаемом случае у вас взвешивание займёт больше времени, чем сама оптимизация.

                                                                                  Они у вас не упакованные, нет?


                                                                                  Тепло. Не упакованные.


                                                                                  1. Falstaff
                                                                                    27.02.2017 00:04

                                                                                    Значит, выравнивание полей разное. И в обсуждаемом случае оптимизация ничего полезного не даст, а вред от неё будет нанесён. В другом проекте могло бы быть иначе.


                                                                                    1. olartamonov
                                                                                      27.02.2017 00:13
                                                                                      +1

                                                                                      Значит, выравнивание полей разное


                                                                                      Вау! Вау, вау!

                                                                                      а вред от неё будет нанесён.


                                                                                      (зевнув) Непоправимый.


                                                                                      1. Falstaff
                                                                                        27.02.2017 00:16

                                                                                        Увы, поправимый лишь рефакторингом. :) Но не буду больше терзать; спокойной ночи.


                                                                                      1. tronix286
                                                                                        01.03.2017 01:25
                                                                                        -1

                                                                                        Да ладно, это ж стм — где не уверен что буфера хватит для уарта и дма — множь на три, не уверен что затактировал правильно — множь задержки на три. Подключай все либы, тяни флоаты и даблы. За что мне стм нравиться — что потом этот ад как-то еще и работает. Но если не дай бг придется что-то поправить, все может рухнуть и навсегда.


                                                                                        1. tronix286
                                                                                          01.03.2017 10:57
                                                                                          -1

                                                                                          А великий знаток мипсов и биг эндиана даже не подумал, что цикл развернут для скорости. Все же мы знаем что такое команда перехода и что делает стмф1 если префетч не сработал? Шучу конечно, но в каждой шутке.


                                                                                          1. olartamonov
                                                                                            01.03.2017 11:28
                                                                                            +1

                                                                                            что цикл развернут для скорости


                                                                                            while( ADC_GetFlagStatus( ADC1, ADC_FLAG_EOC ) == RESET );


                                                                                            Да, скорость выполнения цикла тут будет очень важна.


                                                                        1. lingvo
                                                                          27.02.2017 09:39
                                                                          +1

                                                                          Чисто для справки — матлаб позволяет генерить автоматически код, оптимизированный под эмбедд. Причем флоат там можно как включить, так и выключить — это отразится только на сгенерированном коде, а не на исходном алгоритме.


                                                                          1. Falstaff
                                                                            27.02.2017 10:54

                                                                            Я помню, что для фильтров это можно было — а для произвольного кода уже тоже? Он учитывает при этом ошибки целочисленного округления, переполнения и прочие подобные вещи? Я просто не следил за этой частью.


                                          1. leocat33
                                            26.02.2017 18:16
                                            -5

                                            Это я автору в статью написал, что он будет делать универсальный программируемый логический контроллер?

                                            Свободнопрограммируемый. Не путайте хер со звездой.


                                        1. leocat33
                                          26.02.2017 18:15
                                          -2

                                          Пытался объяснить… «До черта» это 200 байт на вычисления ряда (работа с float) вместо двух десятков команд целочисленной арифметики. Плюс 8 байт памяти для хранения двух значений float. Хотя памяти 2 * int32_t съест ровно столько же. Сейчас программа «ест» 15 кб из 64 кб «камня». 200 байт — ниочем. Критикан так же предлагает использовать stdio и string. А это сразу 4 кб. В чем выигрыш? Не понятно… Да, я предпочитаю линейную структуру программы. Но это действительно улучшает читабельность и понимание алгоритма.


                  1. Androniy
                    03.03.2017 14:30

                    Вы все правильно говорите, однако «рефлексы» связанные с ограничениями платформ десятилетней давности приводят порой к неочевидным результатам. Завтра вам скажут, что сравнивать величину надо с точностью до сотых/тысячных и вы перепишете все случаи использования переменной x как-то так:

                    snprintf(buf, sizeof(buf), "%d.%d", x/1000, abs(x%1000));
                    

                    Получите пачку проблем с единицами измерений везде, где встречается эта переменная.
                    А потом внезапно окажется, что исходное значение может быть немного больше, чем 2 000 000, и вашего int будет нехватать.
                    У float есть огромные преимущества, ради которых стОит его использовать.


                    1. olartamonov
                      03.03.2017 20:28
                      -1

                      Не надо использовать float. И int не надо.

                      Только double и int64. А то мало ли что вам завтра скажут, особенно про датчик температуры с погрешностью в полградуса.


                      1. leocat33
                        03.03.2017 22:58
                        -1

                        Присоединяюсь к мнению. Но и этого тоже не надо! Только bool! Только хардкоре!


        1. tormozedison
          26.02.2017 10:59

          Смотря какой «кусочек». Если у него запас с обеих сторон, достаточный для установки ограничителей, и они есть, «колхоза» не вижу.


          1. leocat33
            26.02.2017 11:10

            В общем то так и делаю. Запас ровно под корпус + фиксаторы. DIN-рейку не видно вообще. Монтаж намного проще, быстрее и удобнее, чем в упомянутом D-Link. Там еще как следует «прицелиться» нужно с разметкой под шурупы и потом минут пять «попадать» шляпками шурупов в отверстия D-Link-а. Да и из тех, кто "кохлоз" (цитата) использует пока недовольных нет.
            Фиксаторы нравятся от феникса.


      1. lingvo
        26.02.2017 11:09

        Неплохо было бы фото модуля на стенке привести. За одно и подумать можно, как CAN к нему подвести.


        1. leocat33
          27.02.2017 18:26
          -1

          В профиль, или анфас? Отпечатки стоп модуля нужны?


          1. lingvo
            27.02.2017 19:15
            +3

            Вы писали:

            А данный модуль вполне себе нормально и на стене смотрится. Монтаж либо на двусторонний скотч, либо на кусочек DIN-рейки в размер модуля.

            Так приведите доказательство своим словам, вместо того, чтобы язвить. Или опять назовете критиканом, как всех остальных?


            1. leocat33
              27.02.2017 19:22
              -1

              Кому? Вам? Вы в состоянии информацию анализировать? Судя по вашим прошлым постам не очень…
              Да и нафиг электрику самодельный PLC? Он вааще с DIN-рейки постоянно отваливается! На голову.


  1. proton17
    26.02.2017 14:15
    +2

    DHT-22 то еще гуано, да и в МК нужно выделять отдельные ресурсы на работу с его интерфейсом. Лучше вместо BMP085 и DHT-22 взять один BME280 (200р на Али), тут вам и температура и давление и влажность + I2C интерфейс. И точность у него заметно выше. Вот хорошая статейка по сравнению этих, и не только, датчиков. Ну а про CO уже выше сказали, понятно, что MH-Z19 не бюджет, но MQ это скорее индикатор, а не измеритель ИМХО.


    1. leocat33
      26.02.2017 15:26

      По точности оно мало отличается… А по размеру — да, экономия. Да и по цене раза в 2 дешевле выходит. Закажу пару штук, для попробовать.
      Про MQ могу сказать, что каждый — индивидуален, т.е. требует калибровки. Но ведут себя стабильно.
      Гистерезис есть у всех… И у влажности, и у давления и MQ.


  1. ExplodeMan
    26.02.2017 16:20
    -3

    Интересная статья, от меня + к карме


  1. Leerooooy
    26.02.2017 19:52
    +3

    Сначала я думал, что товарищ olartamonov просто решил доебаться придирается, а нет… Ради любопытства глянул код и наверное это одна из самых страшных писанин, что приходилось видеть.

    Опрос датчиков, периферия, интерфейсы и тут невольно появляется вопрос: «А почему же не задействовать RTOS?» Читаемость улучшится, а размер кода (прости господи что назвал это «кодом») уменьшился бы на порядок, а главное — пропали бы костыли, всякие задержки и прочий мусор. Но видимо уровень автора данной статьи не позволяет применять нормальный инструментарий.

    Итог: а зачем вообще написаны эти статьи?


    1. leocat33
      26.02.2017 20:16
      -2

      Не для вас! Гопота матом изъясняющаяся, вам ли критиканом быть?


      1. Leerooooy
        26.02.2017 20:24
        +2

        Нет конечно! Быть критиком для статей подобного уровня — такое же позорище как быть ее автором. Критики вроде нет, лишь констатация факта и 2 вопроса:
        1) почему не RTOS?
        2) зачем эти чудо-статьи?


        1. leocat33
          26.02.2017 20:29

          1. Мат на гитхабе уже разрешен? Это не хамство?
          2. RTOS юзайте сами. В данном устройстве в RTOS нет потребности. НИКАКОЙ. Если для многозадачности в МК и использую ОС реального времени, то это NuttX.
          3. Данные статьи не для вас. А материться идите в сад!


          1. Leerooooy
            26.02.2017 21:57

            1. На гитхабе? А там можно материться? В коммитах что ли? :D
            2. «никакой» — действительно, опрашивать датчики через задержки это труЪ. Какую RTOS использовать вообще пофигу, но даже откинув данный момент — религия таймеры тоже не позволяет юзать?
            3. Это говорит бомбящий клоун, который за одну статью слил все что мог и посылающий нахер других людей? Напоминает обвинения в оккупации со стороны США)


  1. Zuy
    26.02.2017 20:04
    +2

    Прочитав как возбудились товарищи выше, решил глянуть код.Это — шедевр! Автор, никого выше не слушай, ничего не меняй, сохрани свой стиль!
    include ".c" серьёзно?!
    А почему тогда SPL инклудится через
    .h?


    А если серьёзно, то понятно что автор не занимается разработкой профессионально, видимо для него это всего лишь хобби. Решил в первый раз вместо Arduino сделать по-взрослому, но не всё получается.


    1. leocat33
      26.02.2017 20:14

      Попробуйте не добавить к проекту *.c SPL. И что получится?
      Одними хидерами отделаетесь?
      Придется все же или библиотеку подключать или в проект добавлять *.с, или include именно *.с делать.
      Ну вы даете, программер! Не позорьтесь, подобными комментариями!


      1. leocat33
        26.02.2017 20:47

        Минусаторам, фрагмент stm32f10x_adc.c:
        /**
        ******************************************************************************
        * file stm32f10x_adc.c
        * author MCD Application Team
        * version V3.5.0
        * date 11-March-2011
        * brief This file provides all the ADC firmware functions.
        ******************************************************************************
        * attention
        *
        * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
        * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
        * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
        * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
        * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
        * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
        *
        * © COPYRIGHT 2011 STMicroelectronics
        ******************************************************************************
        */

        /* Includes ------------------------------------------------------------------*/
        #include «stm32f10x_adc.h»
        #include «stm32f10x_rcc.h»

        эти инклуды именно для случая
        #include <stm32f10x_adc.c>
        Когда я не использую откомпилированную и собранную библиотеку SPL, и не включаю файл stm32f10x_adc.c в проект «вручную». случай, когда #include *.c не всегда рационален, ибо не все компиляторы компилируют инклуды отдельно, а не помнят, что obj уже есть. Но большинство, флагами настраивается не делать повторную компиляцию внешних *.c, если они не менялись.


      1. leocat33
        26.02.2017 21:04
        -1

        image
        *.c файлы — почти полный аналог #include *.c, с автоматическим применением флагов раздельной компиляции.
        Почти, на самом деле это нечто среднее, между собранной библиотекой и #include *.c в main
        #include *.h нужны как объявления без тела функций.
        Ой — срам… критиканы…


      1. Zuy
        26.02.2017 22:45
        +2

        Хммм, вы наверно не поняли вопроса.
        У вас в main.c SPL через инклуд *.h файлов, а свой собственный код вы подключаете через инклуд *.c.
        Я даже не задаю вопрос зачем вообще инклудить *.c если у вас есть к ним *.h в которых достаточно прописать интерфейсы и инклудить их. Видимо вы считаете это нормальным.
        Но у вас код SPL поставляется в исходниках, почему бы тогда и его не заинклудить прямо в main.c как *.c и не добавлять в проект? Откуда такой радикально разный подход к своему коду и чужому?
        Не считаете ли вы, что один из подходов верный и стоит только его и придерживаться?


        1. leocat33
          26.02.2017 23:19
          -4

          Все три подхода могут быть использованы. Для понимания, как это работает читайте стандарт «С».
          SPL я трогать не стал, по причине «Standart...» Ну раз так хотят, пусть будет стандарт.
          Поначалу я использовал такую же концепцию. Потом сделал #include "*.c" в main, а компилятору приказ — раздельно их компилировать, или компилировать только те *.c, которые изменились. Таким образом меньше телодвижений по добавлению/убиранию блоков (функций) программы. Это сильно заметно при сборке проекта под GCC Linux. *.h остались как «хвосты». Вдруг кто-то захочет, чтобы было как в SPL, и в текущем проекте просто не используются. Вернее есть один файл gbl.h — секция глобальных переменных. Почему у него именно такая структура опишу намного позже, когда буду рассматривать архитектуру и программирование системы.
          Ну и на будущее: не позорьтесь такими комментариями… Не стоит выпячивать как достоинство свое невежество.


          1. olartamonov
            26.02.2017 23:29
            +1

            Боже, какая же у вас невероятная каша в голове.

            Что характерно, настоящий практический смысл в #include «xxxxxxx.c» есть, только вы его не знаете. Он из той самой области оптимизации исполняемого кода, в которой вы как свинья в апельсинах. И к стандартам языка C отношения не имеет.

            И вот уж что, а скорость компиляции на мегапроекте типа вашего вообще никого не волнует, сколько там, секунд пятнадцать на средней дохлости десктопе?

            P.S. Какой конкретно из стандартов C читать надо, кстати? А то я несколько знаю…


            1. leocat33
              26.02.2017 23:31
              -2

              О боже! Шо, опять?!


              1. olartamonov
                26.02.2017 23:35
                +2

                Вы не перестаёте меня поражать сочетанием вашей самоуверенности с глубиной ваших знаний.

                Пишите ещё, я вас умоляю.

                Прекрасное развлечение в процессе отладки DIY PLC для IoT, прошивка которого уже перевалила за 100 кб даже с -Os.


                1. leocat33
                  26.02.2017 23:37
                  -2

                  Н-да… Видать и в самом деле сильно на хвост наступил…
                  В контроллере всего 64к, однако.


                  1. olartamonov
                    26.02.2017 23:45
                    +2

                    Боже упаси, ваш контроллер мне в страшном сне не придёт в голову использовать.


                    1. leocat33
                      26.02.2017 23:48
                      -2

                      Так разъясните, как получившуюся у вас 100к прошивку мне удалось залить в 64к микроконтроллер?! А то действительно у кого то каша в голове…
                      Да и боже упаси вам такой контроллер в руки давать!


                      1. olartamonov
                        26.02.2017 23:57
                        +2

                        Вам удалось куда-то залить нашу прошивку?

                        Несколько сомневаюсь в этом, не помню, чтобы я вам к нашему рабочему репозитарию доступ давал.


                        1. leocat33
                          27.02.2017 00:00
                          -3

                          Да! Прошивка отразилась от Венеры, и угодила без вашего ведома в какой то там контроллер — репозитарий!
                          ( может хватит «дурака включать»? )


                          1. olartamonov
                            27.02.2017 00:12
                            +1

                            Друг мой, у меня десктоп вот так примерно сейчас выглядит, это разве на какие-то ваши поделия похоже?

                            Мы тут — и под «мы» я не имею в виду вас — по ходу дела занимаемся прошивочкой под контроллер с радио, вполне вменяемым сетевым стеком, здоровенным набором драйверов внешних устройств, динамически подключаемых и пользовательских настраиваемых…

                            Вот сегодня поймал одну ошибку в алгоритме повторного обмена сессионными ключами после потери связи с базовой станцией, добавил поддержку модуля, работающего с BME280, на стороне MQTT-транслятора базовой станции, сделал настройку параметров драйверов локально через шелл, а не только через радио с базовки, ну и ещё вежливо интересовался у сотрудника, когда он допилит нормальную конфигурацию радиодиапазонов LoRaWAN, обещанную «на этой неделе».

                            А по ходу этого вы меня своим «я сделяль» немного развлекали.


                            1. leocat33
                              27.02.2017 00:18
                              -1

                              Походу вас развлечение в понедельник ждет. На работе.


                              1. olartamonov
                                27.02.2017 00:20
                                +1

                                Да не, обычные будни начальника.


                                1. leocat33
                                  27.02.2017 00:25
                                  -2

                                  Ню-ню…


                                1. leocat33
                                  27.02.2017 18:37
                                  -2

                                  Ну как «будни»?


                            1. leocat33
                              27.02.2017 06:35
                              -4

                              И это все, на что вы способны?!
                              Гора родила мышь…


          1. Zuy
            26.02.2017 23:54
            +3

            Есть, сэр, пошёл читать стандарт. Вы только не останавливайтесь и пишите еще!


            1. leocat33
              26.02.2017 23:56
              -3

              Ну что-ж: флаг вам в руки, попутного ветра и барабан на шею!


  1. leocat33
    26.02.2017 21:30

    И эти люди критиканы-позорники не разрешают мне ковыряться пальцем в носу!


  1. r00tGER
    27.02.2017 09:24
    +4

    Прочитал обе статьи, заголовки, теги, комменты, заглянул в код…

    Я с вами солидарен, вы очень многим людям и компаниям наступили на хвост. Целые отрасли поставили под угрозу.
    Обязательно творите дальше и не слушайте бредни и критику завистников.
    Но, лучше, никому не показывайте — видите, сколько агрессии.


    1. leocat33
      27.02.2017 13:02
      -3

      А ну да, «жидкоядерное» г. это намного круче! Вот оно, где ноу-хау порылось!!!


      1. r00tGER
        27.02.2017 13:39
        +4

        Что, аж Intel подобные ядра выпускает…

        Аж не верится, что взрослого человека может так сильно батхертить. Ощущение, что вам уже мерещились миллионы на горизонте, а их отобрали.


        1. leocat33
          27.02.2017 14:07
          -2

          Что, аж Intel подобные ядра выпускает…

          Ссылку, плиз! Наверное у вас патент купили?
          Аж не верится, что взрослого человека может так сильно батхертить. Ощущение, что вам уже мерещились миллионы на горизонте, а их отобрали.

          У кого что болит… Ваш комментарий по дедушке Фрейду…


        1. leocat33
          28.02.2017 07:20
          -1

          Ну так, что со ссылками то?


          1. r00tGER
            28.02.2017 08:39
            +1

            С ссылками все в порядке. Вот, например — https://habrahabr.ru/company/intel/blog/282570/ (у них прямо тут, на ГТ, блог, можете сразу им писать).

            Неужели, вы реально сидели и ждали, пока я скину ссылку на то, что элементарно гуглится? Или, это всё дешевая игра на публику?

            Надеюсь, вы понимаете, что я перед вами ничем не обязан. И, не имею ни малейшего интереса продолжать этот нелепый разговор.


            1. leocat33
              28.02.2017 08:42
              -2

              Да нет, просто любопытно. Гугль у меня не забанен. в поиске по жидкому процессору только одно соответствие:
              IBM планирует разработку жидких процессоров — OSzone.net
              www.oszone.net/16652/IBM_liquid_processors
              20 нояб. 2011 г. — Новая идея касается сердца компьютера – центрального процессора. IBM предлагает создать модели с жидкими проводниками.
              Остальное — жидкий стул.


            1. leocat33
              28.02.2017 08:52
              -3

              По предлагаемой ссылке на хабре — ну есть такие корпуса, где «классический» процессор + ПЛИС. Так их не только интел (после покупки Альтера, про что в ссылке и написано) делает. Таких полно. В чем ноу-хау то? От тех же Альтера есть более интересное решение, когда в ПЛИС я могу залить «прошивку» например ARM процессора и параллельно испльзовать возможности ПЛИС.
              Ну а вам — полезный совет, уж коль вы прониклись базовыми знаниями о физической реализации бинарных операций, следующим этапом почитать про ПЛМ (Программируемые логические матрицы). Ну а потом и к ПЛИС можно будет «подобраться».
              И… не стоит обсирать то, в чем вы не в зуб ногой!


  1. sepulkary
    27.02.2017 09:55

    Ну что вы всё ругаетесь? Автор делает классический MVP; потом, может быть, найдет инвестора, и весь проект приобретет более стройные формы…

    leocat33, если делаете печатные платы под корпуса, сажаемые на DIN-рейку, лучше используйте «вывернутые» разъемы типа MSTBO 2,5/ 3-G1R и MSTBO 2,5/ 3-G1L, можно будет избавиться от межплатного разъема и получить бОльшую жесткость конструкции.


    1. leocat33
      27.02.2017 12:06
      -3

      Да. И корпус другой нужно, тоже от феникс. А то взял «от балды» первый попавшийся… А лучше вообще собственного дизайну.
      Так, насчет разъёмов: было перепробовано, в том числе по результатам промышленной эксплуатации, ну минимум десятка два различных вариантов, и именно от феникса. Ну и взял и просто так выбрал именно такие, чтобы жесткость конструкции уменьшить ( Вы о чем? Наверное выполняли прочностные расчёты? И так, для справок, толщина FR4=1.6 mm, попробуйте, сломайте плату такого размера:))) )
      А потом, с целью «бюджетизации» были подобраны китайские аналоги, в частности DEGSON.


    1. leocat33
      27.02.2017 12:39
      -4

      Зашел на ваш сайт, посмотрел код… Шедевр! А тут мой критикуют:)))
      Посмотрел схему: «Мощный бестрансформаторный блок питания»… Н-да… Откуда «содрали»?
      Если и делаете емкостной делитель, то ставне пару емкостей, как по фазе, так и по земле.
      Ну и потребляемая мощность вашего источника, считали? Получается 15 Вт реактивной составляющей. 10 источников — 150 Вт. Будем греть провода в квартире? И отчего только однополупериодный выпрямитель? Для «увеличения прочности»? Вообще, не схема, а бред…
      Делал я подобные вещи, с целью «подешевле», там где не нужна гальваническая развязка… Пробовал на viper без трансформатора, 200 мА, 5V. По итогу стоимость штучного изделия получилась выше серийного 10 Вт-ного от MW. Забросил, дешевле купить гальванически развязанный MW…


      1. leocat33
        27.02.2017 13:51
        -2

        Ах, да, минусуют, забыл видать упомянуть про ЭМП. Первый же выброс свыше 1300-1500V «склеит ласты» вашему источнику…


    1. leocat33
      27.02.2017 13:17
      -2

      Да, и где вы у меня межплатные разъемы нашли?!


    1. leocat33
      27.02.2017 19:59
      -2

      Ну что-ж вы со своего сайта все поудаляли то? Я уже со знакомыми ссылками поделился. Пишут: нет ничего! Посмотрел и правда, всё пропало… А я вам посещаемость стал «накручивать»… Как то не вежливо это.


  1. SNPopov
    27.02.2017 13:35
    +1

    Вопрос автору, DIY PLC — это любительский Programmable Logic Controller?


  1. leocat33
    27.02.2017 13:45
    -1

    Стёб? Или серьезно?


    1. EighthMayer
      27.02.2017 13:52

      Я вот тоже не могу понять. Ну, в смысле, не бывает-же так. Правда?


      1. leocat33
        27.02.2017 14:01
        -2

        — Ну да, бывает.
        — Ну да, не бывает.
        (не нужное зачеркнуть)
        Правда.


    1. SNPopov
      27.02.2017 14:12
      +1

      Не понял. Это вопрос на мой вопрос? Просто хочу понять что такое DIY PLC?


      1. leocat33
        27.02.2017 14:20
        -2

        Почему задал такой вопрос? Так тутошняя «публика» не читая статей, не вникая в суть, даже поверхностно, критиканит «в полный рост»… Вы задали неоднозначно понимаемый вопрос. Поэтому так и спросил…
        В предыдущей статье писал, что смысл у этой аббревиатуры оказался двоякий:

        • Power Line Communication — коммуникация, построенная на линиях электропередачи
        • Programmable Logic Controller — программируемый логический контроллер

        Цель и то, и другое.
        Контроллер разрабатывался именно с целью возможного повторения практически всеми желающими.
        2-х слойные платы, изготовление из того, что массово есть на рынке.


        1. SNPopov
          27.02.2017 15:14
          +2

          Т.е., Вы разрабатываете PLC с коммуникациями по линиям электропередач? Надеюсь, Вы знаете, PLC (контроллеры) это строго определенная архитектура и стандартный (для PLC) набор языков программирования. Судя по всему Вы пытаетесь сделать не PLC, а PAC (Programmable Automation Controller) Для PAC набор возможных аппаратных и программных платформ не стандартизован. Многие фирмы выпускают PAC и на платформе PC и на базе микроконтроллеров. Пожалуй, существует только одно требование к ним — работа под операционной системой реального времени.


          1. leocat33
            27.02.2017 16:41
            -1

            Ответ ниже, написал в общий поток. Может кто-то прочитает полностью:)


          1. leocat33
            27.02.2017 20:16
            -1

            Еще: видел PAC с Windows Embedded Compact 7 «на борту». Честно говоря не готов как то комментировать. Но глюковатость — имеет место быть.


            1. SNPopov
              28.02.2017 18:03
              +1

              Это у Вас просто эмоциональная реакция на слово — Windows. Windows Embedded COMPACT 7 — это операционная система реального времени, предназначенная в том числе и для промышленных контроллеров. Не имеет никакого отношения к Windows 7. Кстати, есть еще и Windows Embedded standard 7. Это компонентная ОС на базе Widows 7. Вы можете собрать свою ОС, содержащую только необходимые в данном проекте компоненты.


              1. leocat33
                03.03.2017 22:51
                -1

                Никаких эмоциональных реакций. Просто при плотной работе Windows Embedded COMPACT 7 с СОМ-портами можно наблюдать знаменитый «экран смерти»… Порты — USB-COM, через HUB несколько штук. Перепробованы разные чипы преобразователей интерфейса. Причем это происходит на дню по нескольку раз. На письма об этой проблеме служба поддержки M$ просто не отвечает. И это система реального времени?!
                ЗЫ на ХР таких проблем не было.


                1. SNPopov
                  04.03.2017 09:28

                  Ну это известная ситуация. Вы используете сторонние драйверы (MS их не поставляет) для специфичного преобразователя COM-USB и терзаете MS — почему не работает? Насколько я знаю, только FTDI поставляет драйверы преобразователя COM-USB для Windows compact 7. Вы к ним обращались?


                  1. leocat33
                    04.03.2017 13:09
                    -1

                    Да. Именно FTDI наиболее устойчиво работают. Обращался. Написали тоже самое: M$ игнорирует тиккеты. Повторю: назависимо от производителя чипов. Заниматься отладкой ядра для Windows Embedded я не умею, но при аналогичной ситуации в стандартной Windows 7, а там вылетает еще чаще, и точки вылета ( произвольные места ядра ) как раз на M$ код приходятся. Что-то связанное асинхронным вв/выв по устройствам. В конце-концов поставил свой контроллер с линуксом. Проблемы закончились. Но, люди, кто эксплуатирует пром решения навряд ли далее будут заказывать оборудование с Win «на борту».


                    1. SNPopov
                      04.03.2017 18:42

                      Преобразователи COM-USB вещь в себе, в этом я с Вами полностью согласен. При нехватке физических СОМ-портов на хосте использую многопортовые серверы СОМ-Ethernet (www.moxa.com).


  1. leocat33
    27.02.2017 15:56
    -1

    Поправка: разработаны, архитектура, модули «расширения», Linux based контроллер.
    Модули PowerLine в стадии адаптации решений / доводки / испытания.
    Модули CAN интерфейса есть, и довольно много… Протестировано. Работает как пром.оборудование. Некоторые образцы эксплуатируются в сложных пром. условиях (высокий уровень ЭМП, агрессивная, но не взрывоопасная среда, ...). Некоторые образцы (из первых) эксплуатируются уже более 7-ми лет. Я бы их поменял, но это вопрос сложный. Там, где они эксплуатируются подход: работает — не трожь!
    Вопрос про управляющий контроллер: сложно сказать, PAC или PLC. Дискутировали на эту тему в СО РАН. К определенному решению пока не пришли. Используется нетривиальная трактовка стандарта IEC 61131. Не касаемо языков программирования, я про архитектуру. Как языки программирования пока используются ISO/IEC 14882:1998 ( ”C” ), ISO/IEC 14882:2003 ( ”C++” ). Вот тут и возникают разнопонимания, PAC или PLC. С и С++ — тоже стандарты IEC… Хотя сама архитектура позволяет вести разработку на языках IEC 61131. В том числе программа (сценарий) может выполняться в режиме интерпретации. На текущий момент самое простое решение этого вопроса — использовать проект Beremiz. Но там на выходе будет промежуточный код C / C++.
    Про реальное время: насколько жесткое? Если задачи жесткого реального времени, то решаемо установкой «примочек» к PLC, различные «инкарнации» Linux RT. Если жестких требований нет ( а в текущей практике не возникло ни разу ), то используя стандартное Linux ядро можно работать с минимальной частотой опроса 1 кГц. С учетом задержек на опрос внешних CAN модулей варируется от 10 до 500 гЦ. Зависит от количества модулей расширения, расстояния CAN, уровня помех,…
    Описать все это «хозяйство» в одной статье невозможно в принципе. Но… во всяком случае — пытаюсь. Пока что вызываю только агрессию со стороны электриков и гоп-программистов… :(
    Сайт только начал «рисовать». Текущая версия — по сути черновик. Но, что то там уже есть. Да и вообще, я не веб-разработчик. Как нарисовал, так нарисовал (не стреляйте в музыканта, он играет как умеет).
    Все «железяки» разрабатывались под возможность повторения в плоть до ЛУТ технологий. Платы моей разработки — 2-х слойные. Но металлизацию отверстий делать все равно придется. Как вариант — заказать готовые платы, например у китайцев. В линукс-контроллере есть SOM внешних разработчиков. Увы, эту «деталь» дома не сделаешь… FBGA, 8 слоев. Все вышеизложенное касаемо пром. решений. Но… Данные идеи/наработки вполне себе позволяют создавать системы домашней автоматизации и IoT. В том числе «сделай сам».
    Вот, очень кратко, примерно так.


  1. leocat33
    27.02.2017 21:33
    -1

    Если кому интересен Linux как система жесткого реального времени, то Ссылка
    Время реакции на процессорах с тактовой 500 мГц 26-28 мкС. Это круче, чем RTOS.


    1. lingvo
      28.02.2017 11:43
      +1

      Я так понимаю, что вы приводите время реакции для прерываний Xenomai(последний тест), которое хоть и является интересной, но не самой важной характеристикой в RTOS.

      Так вот вшивая VxWorks 6.8 на 300Мгц процессоре выдает в данном случае аж 3,54мкс.
      Не говоря уже о двух других тестах с вызовом задач из User и Kernel Space, где Xenomai выдает 105 и 62мкс, а VxWorks из тестов выше 25 и 8 мкс соответственно.

      Вы действительно понимаете то, о чем пишите?


      1. leocat33
        28.02.2017 11:53
        -1

        Да. Прекрасно понимаю. Мало того прекрасно знаю, что такое операционные системы жёсткого реального времени, и какие требования к ним предъявляются. То, что вы сравниваете это сравнение теплого с мягким (не буду выражаться грубо). И начинал я работать с подобными системами аж с RSX-11. Ну и как отвлечение, я не знаю ни одного компьютера, кроме DEC-овских, у которого системный таймер бы щелкал с частотой 1 мГц…


        1. lingvo
          28.02.2017 12:09
          +2

          Начали сравнение вы. Так почему вы пишете, что «Это круче, чем RTOS»? Чем круче? Будьте добры это разъяснить, как и сравнить теплое с мягким — benchmarking RTOS систем никто не отменял. А то получается, что стремительным домкратом орудуете Вы, а не я.


  1. olartamonov
    28.02.2017 10:20
    +4

    Слушайте, я, кажется, впервые вижу дискуссию, в которой у автора поста были бы заминусованы вообще все комментарии.

    Но вообще затравили хлопца, с такой кармой он нам новых откровений не напишет.


    1. leocat33
      28.02.2017 10:43
      -4

      Вашими стараниями! Чего уж прибедняться… А вообще то, адрес (ссылку) куда вам идти я давал.


    1. leocat33
      28.02.2017 11:13
      -2

      Я тоже впервые вижу, где у автора комментариев удаляют целые ветки! не будем показывать пальцем: olartamonov
      Никакой желчи, предельно культурное общение!
      А главное он — насяльника! жульмере-хешельбекельме-понаехалы…


    1. lingvo
      28.02.2017 11:51
      +4

      Это не удивительно.
      Всех, кто его критикует и что-то предлагает, он называет гоп-программистами и критиканами, а статьи его так себе — то ли про Программируемые Логические Контроллеры, то ли про Power Line Communication, то ли вообще про умный дом.
      Я бы лучше вообще не писал, чем писать такие статьи, что, собственно, geektimes-сообщество за него и решило.


      1. leocat33
        28.02.2017 12:07
        -2

        Кучка из mail_Group под предводительством olartamonov и им подражающие это все сообщество?! Говорите уж — наиболее активная в плане обосрать его часть… Конструктивной критики не увидел. ВООБЩЕ
        Воспринимается как низкий уровень профессианализма, компенсированный хамством.
        Можете привести пример у кого бы, кроме olartamonov, модераторы удаляли бы целые ветки комментариев?


        1. olartamonov
          28.02.2017 12:56
          +4

          Кучка из mail_Group под предводительством olartamonov


          модераторы удаляли бы целые ветки комментариев


          Вы совершенно зря пренебрегаете рекомендациями вашего лечащего врача.


          1. leocat33
            28.02.2017 13:59
            -2

            О боже… Когда у вас диарея закончится то? Лечить болезнь нужно, однако. Хроническая форма уже…


            1. olartamonov
              28.02.2017 14:23
              +3

              У меня, собственно, всего два вопроса-то было:

              1) какое отношение я имею к Mail.ru Group?
              2) какую ветку удалили модераторы?

              А то меня оба тезиса в тупик поставили, если честно.

              P.S. Нет, серьёзно, феномен: мне приходит в почту уведомление, я его открываю, нажимаю на ссылку — а по ней комментарий уже заминусован.


              1. leocat33
                28.02.2017 14:39
                -4

                А-а-а… Ну значит у вас появились двойники, тройники и удлинители!


      1. leocat33
        03.03.2017 22:44
        -2

        Мама, он меня сучкой обозвал!!!