ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
13 июля
455649 Топик полностью
Vit (20.10.2013 17:08, просмотров: 114) ответил Скрипач на <префикс модуля>? А как его применить если, например, нужно запустить несколько ПИД-регуляторов?
для однотипных модулей, IMHO, проще размножением параметров. изобразил - что-то типа такого: typedef unsigned short lc_t; typedef struct pt { lc_t lc; int rc; //structpointer * void * ct; }pt; #define LC_INIT(s) s = 0; #define LC_RESUME(s) switch(s) { case 0: #define LC_SET(s) s = __LINE__; case __LINE__: #define LC_END(s) } #define PT_WAITING 0 #define PT_YIELDED 1 #define PT_EXITED 2 #define PT_ENDED 3 #define PT_INIT(pt) LC_INIT((pt)->lc) #define PT_BEGIN(pt) { char PT_YIELD_FLAG = 1; LC_RESUME((pt)->lc) #define PT_WAIT_UNTIL(pt, condition) \ do { \ LC_SET((pt)->lc); \ if(!(condition)) { \ /*return PT_WAITING;*/(pt)->rc = PT_WAITING;\ return; \ } \ } while(0) #define PT_END(pt) LC_END((pt)->lc); PT_YIELD_FLAG = 0; \ PT_INIT(pt); /*return*/ (pt)->rc = PT_ENDED; } typedef struct PID_param{ int a; long b; float c; }PID_param; #define PID_PARAM_DEFAULT {3,5,7} #define PID_PARAM_RESET_0 {1,3,7} PID_param PID_param_0 = PID_PARAM_RESET_0; pt PID0 = {0,0,(void *)&PID_param_0};/* PT_INIT() :) */ #define PID_PARAM_RESET_1 {1,4,7} PID_param PID_param_1 = PID_PARAM_RESET_1; pt PID1 = {0,0,(void *)&PID_param_1}; PID_param PID_param_2 = PID_PARAM_DEFAULT; pt PID2 = {0,0,(void *)&PID_param_2}; void foo(pt * PT){ PID_param * pid = (PID_param *)(PT->ct); PT_BEGIN(PT); pid->a += 77; pid->b -= 33; //PT_WAIT_UNTIL(PT, foooo()); pid->c = pid->a * 1.5; PT_END(PT); } int main(void) { PT_INIT(&PID0); PT_INIT(&PID1); PT_INIT(&PID2); while(1) { foo(&PID0); foo(&PID1); foo(&PID2); } }