Structuring Language: Activity Chart Implementation : TASK/ISR Run Modes : Super Step Example

Super Step Example

For example, if you select Super Step mode:

1.
2.
The code for testing derived events and generating them is moved from the do...while loop of the Task and after the functional code. All the calls to the Activities and Controls in the Task are moved to be before the do..while loop of the Task (just like the test for buffered access elements and derived events on them).

Consider the following code:

void TASK_SINGLE_STEP(void)
{
do
{
cgGlobalFlags &=~BITSUPERSTEP_TASK_SINGLE_STEP;
cgActivity_SINGLE_STEP_CTRL();
if(!lval_COND && COND != lval_COND)
{
GENERATE_EVENT(BECAME_FALSE_COND);
};
if(lval_COND && COND != lval_COND)
{
GENERATE_EVENT(BECAME_TRUE_COND);
};
if(COND != lval_COND)
GENERATE_EVENT(CHANGED_COND);
};
if(cgDoubleBufferNew_TASK_SINGLE_STEP.cg_Events)
cgGlobalFlags |= BITSUPERSTEP_TASK_SINGLE_STEP;
cgDoubleBufferOld_TASK_SINGLE_STEP =
cgDoubleBufferNew_TASK_SINGLE_STEP;
cgDoubleBufferNew_TASK_SINGLE_STEP.cg_Events = 0;
}
while ((cgGlobalFlags & BITSUPERSTEP_TASK_SINGLE_STEP)
!= 0);}
 

The resultant MicroC code is as follows:

void TASK_SINGLE_STEP(void)
{
if(!lval_COND && COND != lval_COND)
{
GENERATE_EVENT(BECAME_FALSE_COND);
};
if(lval_COND && COND != lval_COND)
{
GENERATE_EVENT(BECAME_TRUE_COND);
};
if(COND != lval_COND)
{
GENERATE_EVENT(CHANGED_COND);
};
do
{
cgGlobalFlags &=~BITSUPERSTEP_TASK_SINGLE_STEP;
cgActivity_SINGLE_STEP_CTRL();
if(cgDoubleBufferNew_TASK_SINGLE_STEP.cg_Events)
cgGlobalFlags |= BITSUPERSTEP_TASK_SINGLE_STEP;
cgDoubleBufferOld_TASK_SINGLE_STEP =
cgDoubleBufferNew_TASK_SINGLE_STEP;
cgDoubleBufferNew_TASK_SINGLE_STEP.cg_Events = 0;
}
while ((cgGlobalFlags &
BITSUPERSTEP_TASK_SINGLE_STEP)!= 0);
}