Цитата(_Pasha @ Sep 13 2009, 10:01)

Еще одна ТАСКАЛКА (от слова task) получилась.
Как Вам такой гибрид, уважаемый ReAl ?
PS к тому же system() можно спрятать внутри любой реентерабельной функции, а точки входа - низзя.
Да, system() некоторые вещи сделает красивее, но при этом если несколько задач из списка позовут system() (да ещё и из функции - а иначе кайфу в вызове system() никакого по сравнению с просто установокй метки и возвратом) - стек как-то глубоко пойдёт, надо помнить о возможности.
В этом смысле вместо
Код
STD_TASK(wait2)
{
ENTRY(step1)
{
if(TCNT1 != 0xff00)
system();
}
}
"стандартный" protothread-овский
Код
PT_WAIT_UNTIL(pt, TCNT1 != 0xff00);
по стеку экономнее, так как ставит метку и даёт возврат из функции, а там уже просматривается список потоков.
Никто не мешает комбинировать.
И управляющую структуру я бы выделил в виде заголовка
Код
typedef struct Tag_TCB_header
{
void (*task)(struct Tag_TCB *tcb);
void *entry;
struct Tag_TCB *next;
unsigned lock:1;// lock counter
unsigned stop:1;// stop flag
unsigned exit:1;// request to delete from list
unsigned PID:5; // process ID
// тут может ещё сразу таймерную переменную для таймаутов/sleep()
} TCB_header_t;
а локальные параметры не через указатель, а как продолжением структуры
Код
typedef struct tag_some_task_tcb
{
TCB_header_t th;
unsigned some_param;
unsigned char some_buf[8];
} some_task_tcb_t;
при обращении не будет лишнего уровня косвенности.
А вообще
Vit на protothread-подобных вещах стаю собак сожрал, это с ним обсуждать надо.