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 —
printf
The
printf
function 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
,ultoa
Memory allocation —
calloc
,free
,malloc
Memory 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 inmdlInitializeSizes
ormdlStart
. You cannot allocate memory in any function aftermdlStart
, such asmdlOutputs
ormdlUpdate
.Memory manipulation —
_memccpy
,memcpy
,memchr
,memcmp
,_memicmp
,memmove
,memset
Character string manipulation —
strcat
,strchr
,strcmp
,strcpy
,strcspn
,_strdup
,_stricmp
,strlen
,_strlwr
,strncat
,strncmp
,strncpy
,_strnset
,strpbrk
,strrchr
,_strrev
,_strset
,strspn
,strstr
,strtok
,strupr
Mathematical —
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
,uldiv
Character class tests and conversion —
isalnum
,isalpha
,_isascii
,iscntrl
,isdigit
,isgraph
,islower
,isprint
,ispunct
,isspace
,isupper
,isxdigit
,isxupper
,isxlower
,_toascii
,tolower
,toupper
Searching and sorting —
bsearch
,qsort
Dummy 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
,setvbuf
Console I/O —
fprintf
,sprintf
,vfprintf
,vprintf
,vsprintf
,fscanf
,scanf
,sscanf
Process management —
spawn
,exit
,abort
,atexit
Signals and exceptions —
signal
,longimp
,raise
Time functions —
clock
,time
,difftime
,asctime
,ctime
,difftime
,gmtime
,localtime
,mktime
,strftime
Operating 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