Vit (20.10.2013 17:08, просмотров: 140) ответил Скрипач на <префикс модуля>? А как его применить если, например, нужно запустить несколько ПИД-регуляторов?
для однотипных модулей, 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);
}
}