diff --git a/smi/src/rt_def.h b/smi/src/rt_def.h index d71f23c3ed830c3d69aab3b049e0ee85090aefaa..2b39eaf1ca62328cc93275767ccc704d1a46ead8 100644 --- a/smi/src/rt_def.h +++ b/smi/src/rt_def.h @@ -95,6 +95,7 @@ typedef volatile struct { taskStateStruct taskState[MAX_NUMBER_OF_TASK_STATES]; taskStateSysVarStruct taskStateSysVar[MAX_NUMBER_OF_TASK_STATES]; + controlFlagsStruct controlFlags[MAX_NUMBER_OF_TASK_STATES]; unsigned int smiLock; int intTest; diff --git a/smi/src/smi.c b/smi/src/smi.c index e7867c9802d2c326fe00b23c6e39a24b9c0761d9..a2e0c45aad47b21e151bc5eb482dbf1f0093a6b5 100644 --- a/smi/src/smi.c +++ b/smi/src/smi.c @@ -247,7 +247,8 @@ if (t2-t1>maxGettime) maxGettime=t2-t1; */ __sync_fetch_and_and(&(shm->smiLock),0); //rt_printf("in=%d ", __sync_fetch_and_add(&(shm->smiLock),0)); - +/* +t1=GETTIME; for (i=0;i<shm->numberOfTaskStates;i++) { if (__sync_fetch_and_add(&(shm->taskStateSysVar[i].copy),0)) { int j; @@ -259,7 +260,8 @@ if (t2-t1>maxGettime) maxGettime=t2-t1; __sync_fetch_and_and(&(shm->taskStateSysVar[i].copy),0); } } - +t2=GETTIME; rt_printf("%lld ",(t2-t1)/1000); +*/ shm->numberOfCurrentLeafStates=0; for (i=0;i<2*MAX_NUMBER_OF_CONCURRENT_STATES;i++) { @@ -306,12 +308,23 @@ if (t2-t1>maxGettime) maxGettime=t2-t1; currentTaskStateFlags[shm->numberOfCurrentLeafStates]|=TASK_TIMEOUT; if ((shm->taskStateSysVar[atomicStateVariables[i].taskStateVar].flags&TASK_BUSY)!=0) currentTaskStateFlags[shm->numberOfCurrentLeafStates]|=TASK_BUSY; -// the following three lines were commented -> ? + if (__sync_fetch_and_and(&(shm->taskStateSysVar[atomicStateVariables[i].taskStateVar].exit),0)==ATOMIC_UNLOCKED) { +//rt_printf("bbbb->%d ",__sync_fetch_and_add(&(shm->taskStateSysVar[atomicStateVariables[i].taskStateVar].exit),0)); + shm->taskStateSysVar[atomicStateVariables[i].taskStateVar].flags|=TASK_EXIT; + for (j=0;j<MAX_NUMBER_OF_CONTROL_FLAGS_PER_STATE;j++) { + shm->taskState[atomicStateVariables[i].taskStateVar].outputControlFlag[j] + =shm->controlFlags[atomicStateVariables[i].taskStateVar].outputControlFlag[j]; + shm->taskState[atomicStateVariables[i].taskStateVar].inputControlFlag[j] + =shm->controlFlags[atomicStateVariables[i].taskStateVar].inputControlFlag[j]; + } + } if ((shm->taskStateSysVar[atomicStateVariables[i].taskStateVar].flags&TASK_EXIT)!=0) - currentTaskStateFlags[shm->numberOfCurrentLeafStates]|=TASK_EXIT; + currentTaskStateFlags[shm->numberOfCurrentLeafStates]|=TASK_EXIT; else if (atomicStateVariables[i].exit==1) currentTaskStateFlags[shm->numberOfCurrentLeafStates]|=TASK_EXIT; +if (shm->taskStateSysVar[atomicStateVariables[i].taskStateVar].nrt==0 || +__sync_fetch_and_and(&(shm->taskStateSysVar[atomicStateVariables[i].taskStateVar].exit),1)==ATOMIC_UNLOCKED) for (j=0;j<MAX_NUMBER_OF_CONTROL_FLAGS_PER_STATE;j++) { if (shm->taskState[atomicStateVariables[i].taskStateVar].outputControlFlag[j]==1) { currentTaskStateFlags[shm->numberOfCurrentLeafStates]|=(1<<(j+8)); diff --git a/smi/src/smi_def.h b/smi/src/smi_def.h index 379830d6c0647c30b6ffcd28c2dfc7adf42105ba..08e7519401aceb24262b5806c0a661c84c2de66c 100644 --- a/smi/src/smi_def.h +++ b/smi/src/smi_def.h @@ -57,6 +57,12 @@ typedef volatile struct { int outputControlFlag[MAX_NUMBER_OF_CONTROL_FLAGS_PER_STATE]; } taskStateStruct; +typedef volatile struct { + signed char inputControlFlag[MAX_NUMBER_OF_CONTROL_FLAGS_PER_STATE]; + signed char outputControlFlag[MAX_NUMBER_OF_CONTROL_FLAGS_PER_STATE]; +} controlFlagsStruct; + + #define TASK_TIMEOUT 0x10 typedef volatile struct { #define TASK_EXEC 0x01 @@ -64,8 +70,8 @@ typedef volatile struct { #define TASK_ACTIVE 0x04 #define TASK_BUSY 0x08 #define TASK_SMI 0x20 - unsigned int copy; - signed char outputControlFlagTmp[MAX_NUMBER_OF_CONTROL_FLAGS_PER_STATE]; + int exit; +// signed char outputControlFlagTmp[MAX_NUMBER_OF_CONTROL_FLAGS_PER_STATE]; int flags; taskIDType taskID; processType process; diff --git a/smi/src/smi_nrt.c b/smi/src/smi_nrt.c index 92820bf162947609ff828adee6b6f8a4bacafe35..b8728f5d4cd9d2fa0756a181204ce6f28525890f 100644 --- a/smi/src/smi_nrt.c +++ b/smi/src/smi_nrt.c @@ -195,6 +195,7 @@ printf("new format\n"); } else shm->taskStateSysVar[shm->esmStateTransfer.taskStateVar].dataPort[i]=NA; } shm->taskStateSysVar[shm->esmStateTransfer.taskStateVar].flags=0; + shm->taskStateSysVar[shm->esmStateTransfer.taskStateVar].exit=0; if (index+1>=numberBufferSize) { error=12; diff --git a/smi/src/taskdisp_nrt.c b/smi/src/taskdisp_nrt.c index 9a2b2eb4d3a533356e3f9a69bf8ffb252699a7d9..a626575a8718b34352449028dafbc261d6f7fe5b 100644 --- a/smi/src/taskdisp_nrt.c +++ b/smi/src/taskdisp_nrt.c @@ -216,7 +216,36 @@ usleep(10000); usleep(STD_SLEEP); } else smiLock=1; } - + +// if ((shm->taskStateSysVar[i].flags&TASK_EXEC)!=0) + if ((taskStateSysVarTmp.flags&TASK_EXEC)!=0) + { +// execTask(&shm->taskState[i],&shm->taskStateSysVar[i],shm->taskStateSysVar[i].taskID); + execTask(&taskStateTmp,&taskStateSysVarTmp,taskStateSysVarTmp.taskID); +/* + memcpy((unsigned char*)&(shm->taskState[i]), + (unsigned char*)&taskStateTmp, + sizeof(taskStateStruct)); +*/ + for (j=0;j<MAX_NUMBER_OF_CONTROL_FLAGS_PER_STATE;j++) { + shm->controlFlags[i].outputControlFlag[j]=taskStateTmp.outputControlFlag[j]; + shm->controlFlags[i].inputControlFlag[j]=taskStateTmp.inputControlFlag[j]; + } + +// shm->taskStateSysVar[i].flags|=TASK_EXIT; +// __sync_fetch_and_and(&(shm->taskStateSysVar[i].flags),TASK_EXIT); + __sync_fetch_and_nand(&(shm->taskStateSysVar[i].exit),0); +//printf("aaaaaa->%d",__sync_fetch_and_add(&(shm->taskStateSysVar[i].exit),0)); + + numberOfSMIIterations=__sync_fetch_and_add(&(shm->numberOfSMIIterations),0); + while (numberOfSMIIterations==__sync_fetch_and_add(&(shm->numberOfSMIIterations),0) && shm->run!=0) + { + usleep(STD_SLEEP); + } + __sync_fetch_and_and(&(shm->taskStateSysVar[i].exit),0); + } + +if (0) { if ((taskStateSysVarTmp.flags&TASK_EXEC)!=0 /* && ((shm->taskStateSysVar[i].oneShot==0 || (shm->taskStateSysVar[i].flags&TASK_EXIT)==0 @@ -238,11 +267,13 @@ usleep(10000); //if (n==0 && shm->taskStateSysVar[i].taskID==27 && shm->taskState[i].stateID==72) printf("-----------------\n"); // shm->taskStateSysVar[i].flags&=~(TASK_ACTIVE); // shm->taskStateSysVar[i].flags&=~(TASK_EXEC); +/* for (j=0;j<MAX_NUMBER_OF_CONTROL_FLAGS_PER_STATE;j++) { shm->taskStateSysVar[i].outputControlFlagTmp[j]= taskStateTmp.outputControlFlag[j]; } - __sync_fetch_and_nand(&(shm->taskStateSysVar[i].copy),0); +*/ +// __sync_fetch_and_nand(&(shm->taskStateSysVar[i].copy),0); // shm->taskStateSysVar[i].flags|=TASK_EXIT; // shm->t3=shm->reftime; @@ -257,6 +288,7 @@ usleep(10000); usleep(STD_SLEEP); } } +} } } if (shm->run==0) break;