SmlkSfunc_jzTc-Generator

SmlkSfunc_jzTc-Generator

Inhalt


TODO bisher sind nur die Buskapitel beschrieben, existiert als pdf


Topic:.SmlkSfunc_jzTc.


Topic:.SmlkSfunc_jzTc.SmlkSfunc_jzTc.

Der SmlkSfunc_jzTc-Generator für Sfunctions generiert aus einem gegebenen Headerfile:

Benötigt wird dazu

Man kann den Sfunction-Generator SmlkSfunc_jzTc auch nur für die Buss-Generierung nutzen, bzw. Busse, die nicht in Sfunction verwendet werden, ebenfalls aus typedef struct in einem Headerfile generierene. Der Vorteil ist eine einheitliche Herangehensweise und eine klare textuelle Busdefinition über die struct. Die struct bzw. der Header wird dann für die Codegenerierung für ein Zielsystem gleich benutzt.


1 Busse und Sfunctions

Topic:.SmlkSfunc_jzTc.bus.

Last changed: 2019-03-10

Busse stellen ein probates Mittel der Datenbündelung in Simulink außerhalb von Sfunction dar. Die Busse werden im Simulink-Datenhaushalt wie strukturierte Daten abgelegt. Dem entsprechend ist im generiertem Code ein Bus als Datenstruktur mit den entsprechenden Elementen (struct) realisiert. Dabei kann entweder der Simulink-Coder aus der Busdefinition die typedef struct { ... } generieren:

MyBus.DataScope = 'Exported';

oder die Coder setzt die Existenz eines Headers mit einer passenden typedef struct { ... } für den Bus voraus und benutzt diese Typdefinition:

MyBus.HeaderFile = 'srcC_Model/MeasPrep.h';
MyBus.DataScope = 'Imported';

Diese gezeigten Codezeilen können in ein Matlab-Script enthalten sein, dass den Bus im Simulink-Datenhaushalt definiert durch Abarbeiten dieses Scripts, zweckmäßig beim Modellstart. Der Rahmen für das Script wird gebildet mit

clear MyBus_elems;
ix = 1;
MyBus_elems(ix) = Simulink.BusElement;
MyBus_elems(ix).Name = 's1';
....
MyBus = Simulink.Bus;
MyBus.Elements = MyBus_elems;
assignin('base','MyBus', MyBus);

Die andere Möglichkeit ist die Nutzung der grafischen Bedienung für die Anlage des Busses. Damit steht die Busdefinition im Modell.

Diese 4 Möglichkeiten:

sind im Simulink aus Sicht der Mathworks-Strategie-Vorgaben etwa gleichwertig, Mathworks unterstützt alle 4 Kombinationen. Wenn man stark mit Sfunctions arbeitet, Kernfunktionen in C einbinden möchte und dies auch mit Bussen verbinden möchte, dann ist nur eine Kombination zweckmäßig:


2 Der Sfunction-Generator SmlkSfunc_jzTc

Topic:.SmlkSfunc_jzTc.SmlkSfunc_jzTc.

Der SmlkSfunc_jzTc-Generator für Sfunctions generiert aus einem gegebenen Headerfile:

Benötigt wird dazu

Man kann den Sfunction-Generator SmlkSfunc_jzTc auch nur für die Buss-Generierung nutzen, bzw. Busse, die nicht in Sfunction verwendet werden, ebenfalls aus typedef struct in einem Headerfile generierene. Der Vorteil ist eine einheitliche Herangehensweise und eine klare textuelle Busdefinition über die struct. Die struct bzw. der Header wird dann für die Codegenerierung für ein Zielsystem gleich benutzt.


3 Busse als In- und Output von Sfunction

Topic:.SmlkSfunc_jzTc.busport.

Video über Busse in Sfunctionen, mit Debug des Checks, ca. 20 min

Die Sfunction können Busse im Simulink direkt von den Adressen an den Ports zugreifen:

MyBus const* x_bus = ( MyBus const*)ssGetInputPortSignal(simstruct, ixInputPort);

Simulink speichert im Bus die Daten im passenden Layout zur struct, allerdings mit Bedingungen:

Wenn die Busdefinition aus dem Headerfile generiert wird und der Headerfile im Speicherlayout genauso eingestellt ist wie der Bus (das ist in einem 64-bit-System 8-Byte-Alignment), dann passen diese Dinge.

Der Legacy-Code-Sfunction-Generator von Mathworks setzt die Übereinstimmung nicht voraus, da ein Anwender beliebig zusammenstellen kann. Daher werden dort alle Buselemente über memcpy in die temporär angelegte Struktur kopiert und umgekehrt bei Outputs, die Sfunction bekommt dann den Zeiger auf die temporäre struct im Stack. Das ist etwas Overhead.

Bei der SmlkSfunc_jzTc-Generierung wird folgender Weg gegangen: