Тогда и YIELD'у нужно ссылку на контекст передать. А еще, готовый PT_WAIT_UNTIL есть. Реальный код выглядит вот так:
static char Fans2Fd(struct pt *pt){
static uint8_t TL = 0;
PT_BEGIN(pt);
L_IDLE:
while(1){
PT_YIELD(pt);
_Off(FD1); _Off(KM1); _Off(KM2);
if(B1_Button()) goto L_RUN_1;
if(B2_Button()) goto L_RUN_2;
};
L_RUN_1:
_On(KM1); _On(FD1);
PT_WAIT_WHILE(pt, B1_Button());
while(1){
PT_YIELD(pt);
if(B1_Button()){
_Off(FD1); _Off(KM1);
PT_WAIT_WHILE(pt, B1_Button());
goto L_IDLE;
};
if(B2_Button()){
_Off(FD1); _Off(KM1);
TL = SysTime_1s;
PT_WAIT_WHILE(pt, (Delay(TL, SysTime_1s) < 15));
goto L_RUN_2;
} };
L_RUN_2:
_On(KM2); _On(FD1);
PT_WAIT_WHILE(pt, B2_Button());
while(1){
PT_YIELD(pt);
if(B2_Button()){
_Off(FD1); _Off(KM2);
PT_WAIT_WHILE(pt, B2_Button());
goto L_IDLE;
};
if(B1_Button()){
_Off(FD1); _Off(KM2);
TL = SysTime_1s;
PT_WAIT_WHILE(pt, (Delay(TL, SysTime_1s) < 15));
goto L_RUN_1;
} };
PT_END(pt);
}
... но не любой ценой.