You can write custom I/O device drivers to work with Simulink® Desktop Real-Time™ applications.
Note
Do not use Analog Input, Analog Output, Digital Input, or Digital Output drivers as starting points for creating custom device drivers.
You can use ANSI® C functions that do not use the operating system in your custom blocks or I/O drivers. 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 in mdlInitializeSizes
or mdlStart
.
You cannot allocate memory in any
function after mdlStart
, such as mdlOutputs
or mdlUpdate
.
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
If you create your own custom I/O driver 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 driver 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 .
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.
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