Embox corporate blog
System Programming
C
Comments 18
+6
Я прошу прощения, но protothreads — это жуткое, грязное, страшное извращение, опасное, неудобное и неотлаживаемое, как и вся макросная магия в C, которое нельзя использовать ни в коем случае.
+1
Выглядит убедительней, чем целая статья, если быть честным.
0
В эмбедде вполне себе используют это извращение ( на 8-ми битном камне с 500 байтами ОЗУ мало какая RTOS взлетит).
0
В эмбеддеде на 8-битном камне надо не лениться писать машины состояний на switch. Самому же легче будет, правда.
+1
Отлаживать автомат на пару сотен состояний будет легче? Не сказал бы…
+1
static
char example(struct pt *pt)
{
  switch(pt->lc) { case 0:
 
  while(1) {
    pt->lc = 12; case 12:
    if(!(counter == 1000)) return 0;
    printf("Threshold reached\n");
    counter = 0;
  }
 
  } pt->lc = 0; return 2;
}
Разве конструкция case может разрывать цикл?
+1
Device в Duff's device это все-таки «прием» (как, например, rhetorical device — риторический прием), а не «устройство».
0
Как альтернатива — «метод». Увидев «прием Даффа», мне было бы решительно непонятно, зачем автор хотел бы этого Даффа приесть.
0
Зря вы так. Слово «приём» используется в русском языке слишком часто, чтобы его можно было путать с будущим временем глагола «приедать».
+1
Вот к таким недоразумениям приводят дурацкие инициативы по избавлению от буквы «ё»
0
Машины состоянний, многозадачность на switch (а-ля protothreads), или с помощью проверки флагов очень востребована. Встраиваемые системы, микроконтроллеры, даже оконная функция в виндах это один большой swithc, обрабатывающий события.
Почему же за пол-века эволюции языков программирования ни в одном из них не ввели поддержку машин состояний или легковесных потоков?

p.s.
В ADA есть task (на на МК, по-видимому, не работают)
В C# есть yield
Но это все сделано совсем недавно.
0
В C++ вот-вот добавят co_yield и co_await, причем некоторые компиляторы уже поддерживают их экспериментальную версию.
0
Если там используются необычные компиляторы — то, вероятно, так и есть. А если обычные gcc или clang — то никуда МК не денутся.
0
В си есть setjmp/longjmp, очень во многих языках через них это и сделано.
Only those users with full accounts are able to leave comments.  , please.