Хук для говнокодеров
- Войдите на сайт для отправки комментариев
Сб, 17/03/2018 - 13:27
Типовой говнокод на этом ресурсе выглядит примерно так:
void func()
{
digitalWrite(relay1,HIGH);
delay(1000);
digitalWrite(relay1,LOW);
delay(1000);
}
Затем следует вопрос: почему loop() останавливается на 2 сек...
Небольшие изменения этого говнокода превращают его в автомат состояний
#define BEGIN static int $n=0; static unsigned long $d; switch($n){case 0:
#define DELAY(d) $n=__LINE__; $d=Millis(); case __LINE__: if(Millis()-$d<d) return
#define RESUME $n=0
#define END }
void func()
{
BEGIN;
digitalWrite(relay1,HIGH);
DELAY(1000);
digitalWrite(relay1,LOW);
DELAY(1000);
RESUME;
END;
}
Функция перестала быть блокирующей.
Идея не моя. В Visual Studio не работает, в Кейле работает. Проверять здесь влом. Полагаю найдутся желающие проверить...
Типовой говнокод на этом ресурсе выглядит примерно так:
void func() { digitalWrite(relay1,HIGH); delay(1000); digitalWrite(relay1,LOW); delay(1000); }ты не поверишь - этот код выглядит аналогично и на говноресурсе www.arduino.cc
почему ты не спрашиваешь на первоисточнике, а решил трахать мосх ползателям этого форума?
пусть эти макаронники ответят...
Идея не моя. В Visual Studio не работает, в Кейле работает. Проверять здесь влом. Полагаю найдутся желающие проверить...
И мне влом. Тем более что идея дурная. Стоит в коде наставить ифов и форов, а макросы-делеи в них - вся затея развалится. Никакой польза. Ну а для простейшего примера может и заработает.
Вобще не стоит пытатся обмануть природу. Либо выучищ Си/С++, машинки состояний, и неблокирующие функции, либо будиш метатся между многопоточными библиотеками, РТОС, прерываниями обработчика прерываний и макросами автоматически делающими с дерьма конфету пока не скажеш что ардуино отстой. Не стоит соблазнять людей на второй путь.
Типовой говнокод на этом ресурсе выглядит примерно так:
void func() { digitalWrite(relay1,HIGH); delay(1000); digitalWrite(relay1,LOW); delay(1000); }ты не поверишь - этот код выглядит аналогично и на говноресурсе www.arduino.cc
почему ты не спрашиваешь на первоисточнике, а решил трахать мосх ползателям этого форума?
пусть эти макаронники ответят...
Можно, я за них отвечу?
Школьник, которому купили на амперке набор, этот код загрузит и диодом помигает. При этом он поймет каждую строку.
В следующих скетчах он будет осваивать блинк без делэй, опять же с пониманием - если делэй ему мешать начнет.
И только потом начнет опримизировать код, опять же, если появится такая потребность.
Если же ему подсунуть на первое знакомство "#define DELAY(d) $n=__LINE__; $d=Millis(); case __LINE__: if(Millis()-$d<d) return" - он заведомо ни хрена не поймет. Результатом буде убеждение, что этот ваш си - херня какая-то (мягко выражаясь).
Так что итальянцы, имхо, правы.
Можно, я за них отвечу?
нужно у итальянцев спрашивать, а не у меня - внезапно, они против. О_О
Что бы найти замену этому говнокоду , надо использовать метод автомата. http://is.ifmo.ru/ Но там автоматы реализуются на схемотехнике или программах подобным им. А вот хорошо расжеваной литературы понятной всем как строить автоматы с millis() нет.
ПС: разумеется для знающих постоить автомат на millis() не трудно.
Ответ итальянцев:Уно моменто https://www.youtube.com/watch?v=6tUZV3PHSKQ
#define BLABLABLA 1
Хук для говнокодеров
Andy, выстрел мимо цели.
Тру говнокодер, он потому и тру говнокодер, что не нуждается ни в каких хуках. Пусть хуками занимаются высоколобые лохи, а тру говнокодер тиснет где-нибудь говнокод и придёт сюда выносить мозг на тему: "вот я написал код, как сделать, чтобы он корованы грабил?". На любые предложения что-нибудь изучить, будет отвечать цитатой из википедии, что ардуино не для "изучателей", а для "непрофессиональных пользователей", и требовать, что ему "помогли", а иначе: "зачем тогда форум".
Просто ты, как и большинство обитателей этого ресурса...
я же тебя ткнул мордочкой https://www.arduino.cc/reference/en/language/functions/time/delay/ , что не большинство обитателей этого ресурса, а большинство обиталетей планеты Земля.
хватит отмораживаться - вали на первоисточник и рассказывай, какие они тупни.
Либо выучищ Си/С++, машинки состояний, и неблокирующие функции, либо будиш метатся между многопоточными библиотеками, РТОС, прерываниями обработчика прерываний и макросами автоматически делающими с дерьма конфету пока не скажеш что ардуино отстой. Не стоит соблазнять людей на второй путь.
Не понял... где первый, а где второй... в результате то - "ардуино отстой"...
Самая лучшая РТОС - развитая система прерываний... действительно развитая...
Машины состояний - понятно... а как "неблокирующие функции" без прерываний - не представляю...
Машины состояний - понятно... а как "неблокирующие функции" без прерываний - не представляю...
Квантовый компьютер
Не представляет он!
Не представляю... Есть синхронные задачи... есть - асинхронные... Если вы знаете другие - поделитесь...
Ждёмс!
Ну есть еще некритичные задачи. Можно делать, а можно не делать.
Ну есть еще некритичные задачи. Можно делать, а можно не делать.
Например, задача чем-то там поделиться с сс-овцем :)))
Ждёмс!
А ты не жди, а почитай какую-нибудь умную книжку. Хотя ...
Разумеется это задачи для украшения программ. Слабая машина или сейчас процессор на 100% занят, то не делать. А если все равно стоит без дела почему бы что-то не включить. Например скринсейвера
почитай какую-нибудь умную книжку. Хотя ...
Что... даже с книжкой возникли затруднения??? Бла-бла-бла???
И кстати... напомни... Прерывания не юзаются в ардуине из-за ущербности... или они зарезервированы???
Многоядерность мы же не рассматриваем... не???
Что... даже с книжкой возникли затруднения??? Бла-бла-бла???
И кстати... напомни... Прерывания не юзаются в ардуине из-за ущербности... или они зарезервированы???
Многоядерность мы же не рассматриваем... не???
Можно я напомню. Прерывания в ардуине не юзаются по незнанию! В остальных случаях очень даже юзаются.
Говорил же, что вброс дерьма.
И кстати... напомни... Прерывания не юзаются в ардуине из-за ущербности... или они зарезервированы???
Прерывания не юзаются из-за ущерности юзателей, вроде тебя.
Многоядерность мы же не рассматриваем... не???
О! Ты такие слова знаешь! Надо при сулчае у тебя автограф взять.
Писал не приходя в сознание? Ну обрами! Поржем как case обрамленное в do{.....}while(0) скомпилится ;)
Просто ты, как и большинство обитателей этого ресурса, не используешь дефайны сложнее, чем
#define BLABLABLA 1
Просто ты, как и большинство обитателей этого ресурса нихрена не думаеш прежде чем чего написать. Если бы думал - то хотяб поискал мой код прежде чем чего напИсать. Например может такое нашел бы, там прям сверху, не самое конечно наворочаное, но более сложное чем ты осилиш.
http://arduino.ru/forum/proekty/pokhvalimsya-khudozhestvennoi-samodeyatelnostyu-na-ws2812#comment-247918
Что... даже с книжкой возникли затруднения??? Бла-бла-бла???
И кстати... напомни... Прерывания не юзаются в ардуине из-за ущербности... или они зарезервированы???
Многоядерность мы же не рассматриваем... не???
Можно я напомню. Прерывания в ардуине не юзаются по незнанию! В остальных случаях очень даже юзаются.
Ну вобще юзаются всегда. Системой. Сириал, миллис и пр. без прерываний не работают. То. что не всякий в каждом проекте свой обработчик пользует - да, на это есть свои причины. Где ненужно, кто не умеет и т.д. Не трать время, эсэсовец неук на проценте от реализации, про что не начни - он к продажам стм повернет.
Держи, говнокодер
#define DELAY(d) do{$n=__LINE__; $d=Millis(); case __LINE__: if(Millis()-$d<d) return;}while(0)
Ну вобще юзаются всегда. Системой. Сириал, миллис и пр. без прерываний не работают. То. что не всякий в каждом проекте свой обработчик пользует - да, на это есть свои причины. Где ненужно, кто не умеет и т.д.
Тогда... о чём был типа твой корявый спич??? Что юзая прерывания... народ дуплится... что ардуина нафиг не нужна??? Похвально!!!
к продажам стм повернет.
Почему СТМ??? Посмотри на последние МК Микрочипа... и ПИК... и АВР... Посмотри на последние китайские МК типа 8051... Везде вытесняющие прерывания... а у ПИКа ещё и ядронезависимая периферия с логическими ячейками и пр. ... Вписывается это в идеологию ардуины??? Сомневаюсь...
Ассемблерный код и delay(50); Круто. Жги еще.
)))))))))))))))
Без коментов... )))))))))))))
Ассемблерный код и delay(50); Круто. Жги еще.
То что делей в сетапе, и очень на своем месте, тоже замечать не в твоих правилах. Ну вобщем пристрастие к гомнокодерству у тя и тут прступило ;)
)))))))))))))))
Без коментов... )))))))))))))
Врача этому додику! И быстрей.
не понял... ардуино и авр это разное ?
Мля... а я не знал....
То что делей в сетапе, и очень на своем месте, тоже замечать не в твоих правилах. Ну вобщем пристрастие к гомнокодерству
Это и есть говнокодерство... в натуральном виде... О том что АСМ вставки принято обрамлять в инлайн-функции я уже не говорю... как и о говнопереносимости кода при АСМ вставках... ))))))))))))))))
И по поводу делеев... Если это сихронные функции... то пофигу на чём делей... хоть на циклах... там 50 +- лапоть никакой разницы... но тогда нафиг там АСМ... В иных случаях юзают хардварные решения... но тогда без периферии и прерываний (или ДМА) уже не обойтись... Как бы ты должен это знать... типа...
#define DELAY(d) do{$n=__LINE__; $d=Millis(); case __LINE__: if(Millis()-$d<d) return;}while(0)
Гыы.. Ты синтаксис вобще сишный видел? Ты выложеный код компилировал? А вобще код компилировал когдато? Любуйся.
#define BEGIN static int $n=0; static unsigned long $d; switch($n){case 0: #define RESUME $n=0 #define END } #define DELAY(d) do{$n=__LINE__; $d=Millis(); case __LINE__: if(Millis()-$d<d) return;}while(0) void func(){ BEGIN; DELAY(1000); RESUME; END; } void setup(){ } void loop() { func(); }Результат.
О том что АСМ вставки принято обрамлять в инлайн-функции я уже не говорю...
Не говори! Потому как ты всеравно нихера не знаеш когда нужно инлайн, когда нет а когда нужен __attribute__ ((noinline)), который там какраз прописан. Я ж писал - ты неук. Потому не говори!
И по поводу делеев... Если это сихронные функции... то пофигу на чём делей... хоть на циклах... .
Так ты это Andy разжуй! А то этого дауну делей в сетапе, там где какраз нужна пауза для индикации факта старта смущает. Ассемблерная вставка написаная мной правда тоже чето смущает. Наверно потому что он нихера в нем нешарит.
как и о говнопереносимости кода при АСМ вставках... ))))))))))))))))
А покажи мне реализацию работы с WS8212 или подобными на 328 без ассемблера.
Ну вот, а ломался, влом ему...
держи, эти должен схавать
#define BEGIN static int _n=0; static unsigned long _d; switch(_n){case 0:
#define DELAY(d) do{_n=__LINE__; _d=millis(); case __LINE__: if(millis()-_d<d) return;}while(0)
#define RESUME _n=0
#define END }
не понял... ардуино и авр это разное ?
Мля... а я не знал....
ты всеравно нихера не знаеш когда нужно инлайн, когда нет
А мне оно и не нужно... Стандартными фишками пользуюсь... а самогрёбными... это удел таких ограниченных как ты... )))))))))))))))
А то этого дауну делей в сетапе, там где какраз нужна пауза для индикации факта старта смущает. Ассемблерная вставка написаная мной правда тоже чето смущает. Наверно потому что он нихера в нем нешарит.
Да нет... он шарит... что АСМ - это от незнаний... как у тебя... или от неправильного выбора камня... )))))))))))))))
А покажи мне реализацию работы с WS8212 или подобными на 328 без ассемблера.
Смачного!
Ты вобще на какими языкам писать собрался.
Про коня и руки из жопы - это понравилось. Единственно что умно и внятно из всего затяжного диалога сообщества столь интеллектуальных джентльменов... (большинство из которых вообще не понимают предмета о котором спорят).
Ну вот, а ломался, влом ему...
держи, эти должен схавать
#define BEGIN static int _n=0; static unsigned long _d; switch(_n){case 0:
#define DELAY(d) do{_n=__LINE__; _d=millis(); case __LINE__: if(millis()-_d<d) return;}while(0)
#define RESUME _n=0
#define END }
Свои пробы пера сам и отлажывай. Ты облажался с выложеным, я раз проверил и тя убедил - лажа. Исправляеш - ОК. Дальше сам ибись. Могу только для наводки задать вопрос. Что напечатает цикл for(int i=0;i<5;i++) {Serial.println(i);DELAY(100);} если DELAY определена как ты тут написал. Что должно быть при правильном delay(100) я думаю сам загуглить сможеш.
ПС. буш дальше наглеть - я таки прогоню вышезаявленый цикл сам. И выложу результат.
ты всеравно нихера не знаеш когда нужно инлайн, когда нет
А мне оно и не нужно... Стандартными фишками пользуюсь... а самогрёбными... это удел таких ограниченных как ты... )))))))))))))))
А то этого дауну делей в сетапе, там где какраз нужна пауза для индикации факта старта смущает. Ассемблерная вставка написаная мной правда тоже чето смущает. Наверно потому что он нихера в нем нешарит.
Да нет... он шарит... что АСМ - это от незнаний... как у тебя... или от неправильного выбора камня... )))))))))))))))
А покажи мне реализацию работы с WS8212 или подобными на 328 без ассемблера.
не нужно - так не нужно. Нахрена воще сюда приперся. А что оперативы у 030-й не хватит на большее - это да. Я на 328й могу хоть 100500 WS8212 навесить, хватило бы питания.
И выложу результат.
пару лет тому я уже это слышал - было очень страшно.
Ну и так что бы просто валялся здесь еще один мой код :)
#define DOIT(T,DO) {\ static unsigned long past = 0; \ if (millis() - past >= (T)) {\ past = millis();\ DO;}} //------------------------------------------------ void setup() { Serial.begin(9600); } void loop() { DOIT (500, Serial.println("qqqqq") ) DOIT (800, Serial.println("2333") ) }Я на 328й могу хоть 100500 WS8212 навесить, хватило бы питания.
Навесить ты можешь что угодно... особенно лапшу... )))))))))))
Вот только что у тебя из этого получится... это ещё вопрос... большой... ))))))))))))
И выложу результат.
пару лет тому я уже это слышал - было очень страшно.
Так вот после чего у тя приступы истеричного сиеха начались. Извини. Не знал. Больше над инвалидом не буду шутить.
ПС. А подключить к одной 328-й 100500 WS8212 не проблема. Просто не нужно что попало в оперативку совать. Но челу с DMA и в экстазе от аппаратного это нипосильно.
Так вот после чего у тя приступы истеричного сиеха начались.
после этого ты определён как балабол.
подключить к одной 328-й 100500 WS8212 не проблема. Просто не нужно что попало в оперативку совать.
В розетку сразу суй... там тоже дырки есть... )))))))))))))))))))))))))))))
И осмысленную информацию выведешь... и анимацию??? Даффай... даффай!!! ))))))))))
"А посоны то и не знали!"(с)... ))))))))))
Ну и так что бы просто валялся здесь еще один мой код :)
#define DOIT(T,DO) {\ static unsigned long past = 0; \ if (millis() - past >= (T)) {\ past = millis();\ DO;}} //------------------------------------------------ void setup() { Serial.begin(9600); } void loop() { DOIT (500, Serial.println("qqqqq") ) DOIT (800, Serial.println("2333") ) }И та же проблема. for(int i=0;i<5;i++) {DOIT (500, Serial.println(i) );}
???
ПС. Теперь изобретатели вечного двигателя переключились на написание макроса превращающего гомнокод в ПО. Пора мне подумать про смену професии. Теперь програмисты будут невостребованы ;)
подключить к одной 328-й 100500 WS8212 не проблема. Просто не нужно что попало в оперативку совать.
В розетку сразу суй... там тоже дырки есть... )))))))))))))))))))))))))))))
И осмысленную информацию выведешь... и анимацию??? Даффай... даффай!!! ))))))))))
"А посоны то и не знали!"(с)... ))))))))))
Твои пасоны - лохи. LCD 320х240 правильно подключенная к ардуине выводит "осмысленную информацию". Значить и куча WS выведет. Но работать с экраном без буфера - не для твоих посонов. См. возню с буферами для OLED экрана, тут много было тем, может поймеш чё.
LCD 320х240 правильно подключенная к ардуине выводит "осмысленную информацию". Значить и куча WS выведет.
))))))))))))))))))))))))))))))
Этот тормоз во плоти... ты называешь выводом "осмысленной информации"??? Ну-ну... ))))))))))))))))
Твой вывод LCD 320х240 изначально тормозной... убогий... и блокирующий (в тему... кстати)... про тиринг и артефакты можно вообще не говорить... ))))))))))))))))
Перечитал стартовое. О необходимости превращать переменные в статические там ничего нет. Огласи весь список необходимых доработок Если циклы будут вложеные все итераторы глобальными делать? Т.е .локальных вобще небудет 8(( И условия ифов тоже должны одинаково отработать. Что например делать с таким кодом if(a==1) {a=0;DELAY(100);Serial.println("puk!");}? воссстанавливать a==1? ;) . А если код уже c глобальными, например static int i; i++;Serial.println(i);DELAY(100); ? Напрягай фантазию дальше.