ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
14 мая
915476 Топик полностью
Cкpипaчпророк (12.04.2019 14:40 - 12.05.2025 18:14, просмотров: 345) ответил Скрипач на Все что пробовал еще более громоздко. Делаю if-ы с goto. Ну и *Дункельсовские prototreads для совсем элементарных вещей (задержки и т.п.).
Пример. Блин. Хотел поправить отступы, глюкнул редактор, удалился текст. Вечером верну пример назад. 
static char Pumps2Fd(){
	static uint8_t TL = 0;
	static struct pt proc, *const pt = &proc;

RunLeds();
if(KM1_HiTemp) goto L_FAULT1;
if(KM2_HiTemp) goto L_FAULT2; PT_BEGIN(pt); L_PRE_START: _On(Led_Fault1); _On(Led_Fault2);
_Off(FD); _Off(KM1); _Off(KM2); while(KM1_Stat || KM2_Stat || FD_Stat){ PT_YIELD(pt); }; _Off(Led_Fault1); _Off(Led_Fault2); L_IDLE: _Off(FD); T_RST(&TL); while(FD_Stat){ PT_YIELD(pt); if(T_SECS(TL) > 15) goto L_PRE_START; }; _Off(KM1); _Off(KM2); if(FD_Fault){ _On(FD_Reset); T_RST(&TL); PT_WAIT_WHILE(pt, T_SECS(TL) < 2); _Off(FD_Reset); T_RST(&TL); PT_WAIT_WHILE(pt, T_SECS(TL) < 2); }; T_RST(&TL); while(KM1_Stat || KM2_Stat || FD_Stat || FD_Fault){ PT_YIELD(pt); if(T_SECS(TL) > 2) goto L_PRE_START; }; while(1){ PT_YIELD(pt); if(KM1_Mode_Off) _Off(Led_Fault1); if(KM2_Mode_Off) _Off(Led_Fault2); if(KM1_Mode_Auto && KM2_Mode_Auto && (auto_start == 0)){ _Off(Led_Fault1); _Off(Led_Fault2); }; switch(Select_Start()){ case 1: goto L_RUN_1; case 2: goto L_RUN_2; } }; L_RUN_1: _On(KM1); T_RST(&TL); while((!KM1_Stat) || KM2_Stat){ PT_YIELD(pt); if(T_SECS(TL) > 2) goto L_FAULT1; }; _On(FD); T_RST(&TL); while((!FD_Stat) || FD_Fault){ PT_YIELD(pt); if(T_SECS(TL) > 15) goto L_FAULT1; }; _Off(Led_Fault1); T_RST(&TL); while(T_SECS(TL) < 15){ PT_YIELD(pt); if(Select_Start() != 1) goto L_IDLE; if(FD_Stat && KM1_Stat) T_RST(&TL); }; L_FAULT1: _On(Led_Fault1); goto L_IDLE; L_RUN_2: _On(KM2); T_RST(&TL); while((!KM2_Stat) || KM1_Stat){ PT_YIELD(pt); if(T_SECS(TL) > 2) goto L_FAULT2; }; _On(FD); T_RST(&TL); while((!FD_Stat) || FD_Fault){ PT_YIELD(pt); if(T_SECS(TL) > 15) goto L_FAULT2; }; _Off(Led_Fault2); T_RST(&TL); while(T_SECS(TL) < 15){ PT_YIELD(pt); if(Select_Start() != 2) goto L_IDLE; if(FD_Stat && KM2_Stat) T_RST(&TL); }; L_FAULT2: _On(Led_Fault2); goto L_IDLE; PT_END(pt); }
... но не любой ценой.