User`s guide

Interrupt Handling
11-19
creates and initializes the synchronization semaphore. It also spawns the
function-call subsystem as an independent task.
/* Create and spawn task: <Root>/Faster Rate(.015) */
if ((*(SEM_ID *)rtPWork.s6_S_Function.SemID =
semBCreate(SEM_Q_PRIORITY, SEM_EMPTY)) == NULL)
ssSetErrorStatus(rtS,"semBCreate call failed "
"for block <Root>/Faster Rate(.015).\n ");
}
if ((rtIWork.s6_S_Function.TaskID = taskSpawn("root_Faster_", 20, VX_FP_TASK,
1024, (FUNCPTR)Sys_root_Faster__OutputUpdate,
(int_T)rtS, 0, 0, 0, 0, 0, 0, 0, 0, 0)) == ERROR) {
ssSetErrorStatus(rtS,"taskSpawn call failed for block <Root>/ Faster Rate "
"(.015).\n");
}
The Task Synchronization block modifies the downstream function-call
subsystem by wrapping it inside an infinite loop and adding semaphore
synchronization code:
/* Output and update for function-call system: <Root>/Faster Rate(.015) */
void Sys_root_Faster__OutputUpdate(void *reserved, int_T
controlPortIdx, int_T tid)
{
/* Wait for semaphore to be released by system: <Root>/Task Synchronization */
for(;;) {
if (semTake(*(SEM_ID *)rtPWork.s6_S_Function.SemID,NO_WAIT) != ERROR) {
logMsg("Rate for function-call subsystem"
"Sys_root_Faster__OutputUpdate() fast.\n",0,0,0,0,0,0);
#if STOPONOVERRUN
logMsg("Aborting real-time simulation.\n",0,0,0,0,0,0);
semGive(stopSem);
return(ERROR);
#endif
} else {
semTake(*(SEM_ID *)rtPWork.s6_S_Function.SemID, WAIT_FOREVER);
}
/* UniformRandomNumber Block: <S3>/Uniform Random Number */
rtB.s3_Uniform_Random_Number =
rtRWork.s3_Uniform_Random_Number.NextOutput;
.
.
.
}