Integrate C Code in Custom S-Functions
You can integrate C code in custom S-functions to work with Simulink® Desktop Real-Time™ applications.
Note
Do not use the Analog Input, Analog Output, Digital Input, or Digital Output blocks as starting points for creating custom blocks.
Supported C Functions
You can use ANSI® C functions that do not use the operating system in your custom blocks. The following includes a partial list of supported functions:
Console I/O —
printfThe
printffunction sends output to the MATLAB® Command Window when it is called from the real-time application.Data conversion —
abs,atof,atoi,atol,itoa,labs,ltoa,strtod,strtol,strtoul,ultoaMemory allocation —
calloc,free,mallocMemory allocation is not an operation that can be done in real time. To work with a Simulink Desktop Real-Time application, memory management must occur before real-time simulation begins. Simulation switches into real time after
mdlStart, so you can allocate memory inmdlInitializeSizesormdlStart. You cannot allocate memory in any function aftermdlStart, such asmdlOutputsormdlUpdate.Memory manipulation —
_memccpy,memcpy,memchr,memcmp,_memicmp,memmove,memsetCharacter string manipulation —
strcat,strchr,strcmp,strcpy,strcspn,_strdup,_stricmp,strlen,_strlwr,strncat,strncmp,strncpy,_strnset,strpbrk,strrchr,_strrev,_strset,strspn,strstr,strtok,struprMathematical —
acos,asin,atan,atan2,ceil,cos,cosh,div,exp,fabs,floor,fmod,frexp,ldexp,ldiv,log,log10,max,min,modf,pow,rand,sin,sinh,sqrt,srand,tan,tanh,uldivCharacter class tests and conversion —
isalnum,isalpha,_isascii,iscntrl,isdigit,isgraph,islower,isprint,ispunct,isspace,isupper,isxdigit,isxupper,isxlower,_toascii,tolower,toupperSearching and sorting —
bsearch,qsortDummy functions —
exit,fprintf
Unsupported C Functions
If you create your own custom blocks, use only C functions that Simulink Desktop Real-Time supports. Simulink Desktop Real-Time does not support functions that use the operating system. This category includes functions from vendor-supplied block libraries for the operating system, which are also not supported.
The following list includes many, but not all, of the unsupported functions:
File I/O —
fopen,freopen,fclose,fread,fwrite,fputs,fputc,fgets,fgetc,gets,getc,getchar,puts,putc,putchar,fflush,setbuf,setvbufConsole I/O —
fprintf,sprintf,vfprintf,vprintf,vsprintf,fscanf,scanf,sscanfProcess management —
spawn,exit,abort,atexitSignals and exceptions —
signal,longimp,raiseTime functions —
clock,time,difftime,asctime,ctime,difftime,gmtime,localtime,mktime,strftimeOperating system API functions — No operating system API functions, such as Win64 functions, are supported.
Incompatibility with Operating System API Calls
The Simulink Desktop Real-Time kernel intercepts the interrupt from the system clock. It then reprograms the system clock to operate at a higher frequency for running your real-time application. At the original clock frequency, it sends an interrupt to the operating system to allow software that uses the operating system API to run.
As a result, software that uses the operating system API, such as Win64 functions, cannot be executed as a component of your real-time application. Software you use to write I/O drivers must not make calls to the operating system API.
I/O Register Access from S-Functions Limitation
Operating system drivers can access I/O registers only from the real-time kernel and not from the Simulink software. To prevent drivers from attempting to access I/O registers from Simulink S-functions, enter code fragments like the following:
#ifndef MATLAB_MEX_FILE /* we are in real-time kernel, do board I/O */ #else /* we are in Simulink, don't do board I/O */ #endif