WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Simulink Coder: Funktion mul_s32_s32_s32_srxx eliminieren

 

Barbed2wire
Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 11.03.16
Wohnort: ---
Version: R2015b
     Beitrag Verfasst am: 11.03.2016, 10:28     Titel: Simulink Coder: Funktion mul_s32_s32_s32_srxx eliminieren
  Antworten mit Zitat      
Hallo,

ich habe eine Frage bezüglich der Code Generierung des Simulink Coders.
Ich habe C-Code von einem Subsystem meines Modells erzeugt.
In den Configuration Parameters unter Hardware Implementation habe ich folgende Einstelleungen gemacht:
Als Device Typ habe ich einen 32-bit Embedded Processor ausgewählt. Largest atomic size ist Int, und Floating -Point None.

Das Ziel ist, komplett mit dem Datentyp int32 zu arbeiten.

Im Code werden nun ca. 10 Funktionen vom Typ
Code:

int32_T mul_s32_s32_s32_sr6(int32_T a, int32_T b)
{
  uint32_T u32_chi;
  uint32_T u32_clo;
  mul_wide_s32(a, b, &u32_chi, &u32_clo);
  u32_clo = u32_chi << 26U | u32_clo >> 6U;
  return (int32_T)u32_clo;
}

erzeugt. Die Unterscheiden sich im Funktionsnamen nur durch die letzte Zahl (z.B. sr17 anstatt sr6) und um wieviele Bits geshifted ( z.B. <<15U und >>17U) wird bevor das return aufgerufen wird.
Die aufgerufene Funktion mul_wide_s32 hat folgende Definition:
Code:

void mul_wide_s32(int32_T in0, int32_T in1, uint32_T *ptrOutBitsHi, uint32_T
                  *ptrOutBitsLo)
{
  uint32_T absIn0;
  uint32_T absIn1;
  uint32_T in0Lo;
  uint32_T in0Hi;
  uint32_T in1Hi;
  uint32_T productHiLo;
  uint32_T productLoHi;
  absIn0 = (uint32_T)(in0 < 0 ? -in0 : in0);
  absIn1 = (uint32_T)(in1 < 0 ? -in1 : in1);
  in0Hi = absIn0 >> 16U;
  in0Lo = absIn0 & 65535U;
  in1Hi = absIn1 >> 16U;
  absIn0 = absIn1 & 65535U;
  productHiLo = in0Hi * absIn0;
  productLoHi = in0Lo * in1Hi;
  absIn0 *= in0Lo;
  absIn1 = 0U;
  in0Lo = (productLoHi << 16U) + absIn0;
  if (in0Lo < absIn0) {
    absIn1 = 1U;
  }

  absIn0 = in0Lo;
  in0Lo += productHiLo << 16U;
  if (in0Lo < absIn0) {
    absIn1++;
  }

  absIn0 = (((productLoHi >> 16U) + (productHiLo >> 16U)) + in0Hi * in1Hi) +
    absIn1;
  if (!((in0 == 0) || ((in1 == 0) || ((in0 > 0) == (in1 > 0))))) {
    absIn0 = ~absIn0;
    in0Lo = ~in0Lo;
    in0Lo++;
    if (in0Lo == 0U) {
      absIn0++;
    }
  }

  *ptrOutBitsHi = absIn0;
  *ptrOutBitsLo = in0Lo;
}


Im Endeffekt führen diese Funktionen ja eine Multiplikation aus. Allerdings finde ich, dass dadurch der Code zu komplex wird, ich würde diese Funktionen also gerne durch die normale Multiplikation (*) ersetzen.

Dazu Interessiert mich, wodurch diese Funktionen generiert werden und was für einen Zweck sie genau haben. Wie kann ich also meine Simulation anpassen um diese Funktionen zu eliminieren?

Viele Grüße,
wire
Private Nachricht senden Benutzer-Profile anzeigen


Barbed2wire
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 11.03.16
Wohnort: ---
Version: R2015b
     Beitrag Verfasst am: 14.03.2016, 13:08     Titel:
  Antworten mit Zitat      
Hallo,

ich habe noch eine weitere mir unverständliche Stelle im generierten Code:
Ich berechne in einem Subsystem einen Wert aus mehreren Variablen, einer Square-Funktion und Gains, sowie Addition und Division. Ich habe den entsprechenden Teil des Modells angehängt.
Die Werte von J_w, r, M und alpha werden über ein .mat-File eingelesen:
Code:

r = 22;  % Radius * 100
J_w = 5;  % Trägheitsmoment J_w * 10
M = 85; % Masse
alpha = 9; % alpha * 10
 

Das Ergebnis ist dann ein Faktor, mit welchem weitergerechnet wird.
Durch die Codeerzeugung werden die Werte in einem Struct abgelegt:
Code:

P_Model_T Model_P = {
  22,                                  /* Variable: r
                                        * Referenced by: '<S3>/r_Constant'
                                        */
  1207959552,                   /* Variable: alpha
                                        * Referenced by: '<S3>/alpha'
                                        */
  1426063360,                  /* Variable: M
                                        * Referenced by: '<S3>/Mass'
                                        */
  10000,                           /* Computed Parameter: Constant_10e4_Value
                                        * Referenced by: '<S3>/Constant_10e4'
                                        */
  5,                                  /* Expression: J_w
                                        * Referenced by: '<S3>/Jw_Constant'
                                        */
  1600000000,                  /* Computed Parameter: Jw_10e8_Gain
                                        * Referenced by: '<S3>/Jw_10e8'
                                        */

}

und hier noch der Code, in dem mit den Werten gerechnet wird:
Code:

  rtb_tmp_Signal = MTTE_P.Constant_10e4_Value + div_s32_floor(mul_s32_s32_s32_sr4 (MTTE_Param.Jw_10e8_Gain, MTTE_P.Jw_Constant_Value),
       mul_s32_s32_s32_sr24 (MTTE_P.M, mul_s32_s32_s32_sr27
        (MTTE_P.alpha, mul_sat(MTTE_P.r, MTTE_P.r))));
 


Weiß jemand, wie der Simulink Coder dazu kommt, aus dem Wert 9 für Alpha 1207959552 zu machen? Auch bei M und Jw_10e8_Gain sind die Werte so komisch. (Ursprünglich 85 und 1*10e8)
Ich bin hier echt Ratlos und hoffe es hat jemand eine Idee oder einen Tipp für mich.

Viele Grüße
wire

untitled.slx
 Beschreibung:

Download
 Dateiname:  untitled.slx
 Dateigröße:  19.23 KB
 Heruntergeladen:  355 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Barbed2wire
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 11.03.16
Wohnort: ---
Version: R2015b
     Beitrag Verfasst am: 21.03.2016, 10:28     Titel:
  Antworten mit Zitat      
Das Problem mit den Parametern habe ich nun gelöst. Wenn diese in der Deklaration ausdrücklich als int32 benannt werden, erscheinen die Werte wie sie sollen im Code. Dies habe ich über Simulink.Parameter gelöst:
Beispiel:
Code:

alpha=Simulink.Parameter;
alpha.Value=9;
alpha.DataType='int32';
 


Was die mul-Funktionen betrifft bin ich leider noch nicht weitergekommen. Hat niemand eine Idee?

wire
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.