#define Makrogrosse begrenzt

OP #2525219
Guten Tag!

Ich habe eine Frage, ich arbeite mit dem uVision von Keil.
1
#define MAXVALCUR   700000
2
float   save_currCW[MAXVALCUR] = {0};

Error: L6406E: No space in execution regions with .ANY selector 
matching.
Error: L6407E: Sections of aggregate size 0xaae600 bytes could not fit 
into .ANY selector(s).

Wo ist die Grenze derPräprozessormakrogrösse. Oder bezieht sich der 
Fehler auf das Array? Der Wertebereich reicht doch aus??

Vielen Dank!

M.B.
Gast #2525231
M. B. schrieb:
> Wo ist die Grenze derPräprozessormakrogrösse.
nirgends

> Oder bezieht sich der Fehler auf das Array?
richtig erkannt.

> Der Wertebereich reicht doch aus??
welcher Wertebereich? Du hast einfach nciht genug RAM für
700000 * sizof(float)
Gast #2525244
Und du bist dir wirklich sicher, daß du ein Array mit 700.000 (in 
Worten: Siebenhunderttausend) float-Werten anlegen willst, und das auch 
benötigst?

Oliver
#2525245
Der Fehler bezieht sich sehr wahrscheinlich auf die Arraygrösse. Typisch 
der Index ein int sein, je nach Compiler und CPU ist das dann Maximal 
32768.

Etwas seltsam: 700'000 = 0x00A'AE60, Der Compiler/Linker meckert aber 
über einen 16 x höheren Wert:  Sections of aggregate size 0x00AA'E600 
bytes
Moderator Persönliche Seite #2525250
Wenn `int' ein 16-bit-Typ ist, dann ist der größtmögliche
Array-Index 32767, da die Indizierung in C immer mit dem Typ `int'
erfolgt (und auch immer vorzeichenbehaftet ist, denn ptr[-1] ist
eine gültige Operation).

("Keil uVision" allein genügt nicht um festzustellen, welche
Datentypen die Zielplattform wirklich hat.)

Selbst für eine 32-bit-Plattform sind 700000 floats aber schon
heftig viel.  Internen SRAM von mehr als 2 MiB dürfte kaum ein
Controller haben.  Die Benutzung externen RAMs muss man dem Compiler
(bzw. Linker) sicher irgendwo anzeigen.
Moderator #2525261
M. B. schrieb:
> Error: L6407E: Sections of aggregate size 0xaae600 bytes could not fit
> into .ANY selector(s).

Die Zahl 0xaae600 (=4·700000·sizeof(float)) deutet darauf hin, dass du
nicht nur ein Float-Array mit 700000 Elementen angelegt hast, sondern
gleich vier davon. Wieviel RAM hast du denn insgesamt?
#2525299
M. B. schrieb:
> Ich mach eine Strommessung auf einer Länge von 3600mm, der Task wird
> alle 70us durchlaufen. ergibt 680000 Messungen.

Kannst Du mal den Rechenweg erläutern, wie du Darauf kommst?

Auch wenn man aus der PC-Welt kommt, sollte man wissen, daß nicht jeder 
MC mindestens 4GB RAM hat.


M. B. schrieb:
> Die Messung sollte einfach möglichst genau
> sein.

Durch Umwandeln in float bläht sich der Wert nur auf, die Genauigkeit 
bleibt gleich. Wieviel Bit liefert denn Dein AD-Wandler.


Peter
OP #2525354
1
float       current = 0.0;
2

3
float Current_Measure(void)                  //ToDo//                    
4
{                                            
5
  const float resistor = 0.22;
6
  const int   Bits = 4095;
7
  const float voltage = 3.3;
8
  float res = 0.0;
9
  ADC_MotI_Mes =  ADCin.AN_IN;               //Get the measured ADC value
10
  ADC_Value = PWMaverage (ADC_MotI_Mes);
11
  current = ((voltage/Bits*ADC_Value)/resistor);
12

13
  res = current;
14
  return(res);
15
}

1
float currcal = 0;
2

3
tSM_functions SM_UIcal_exe(tSM_functions ms)
4
{
5
  
6
  if(!iStopp)
7
  {
8
    do
9
    {
10
      Motor_CW();
11
      func_ramp_mot(eSMrmpmot_run);
12
      currcal = Current_Measure();
13
      {
14
          static unsigned int i = 0;
15
    
16
          save_currCW[i] = currcal;
17
          i = ++i % MAXVALCUR;
18
      }  
19
    }while(!iStopp);
20

21
 
22
  res.main = eSMUImain_run;
23
  
24
  return(res);
25
}

12 Bit ADC
OP #2525397
ich bilde den Mittelwert direkt vom ADC Wert und übergebe einen int 
Wert. Dann rechne ich das ganze in den Stromwert (float) um. Aber dann 
lege ich ja wieder ein floatwert in ein Array?! einfach nur noch einmal 
statt 2 mal! Das sehe ich ein. Aber dann speichere ich ja trotzdem ein 
float in das Array!?

Das Ziel des ganzen ist ja, wenn der Strom ein gewisses Level erreicht 
hat, muss ich den Motor abschalten. Ich habe den ADC Wert in ein 
Stromwert umgerechnet, um es besser zu visualisieren. Du meinst jetzt 
ich soll den ADC Wert nicht in einen Stromwert umrechnen und ihn mit 
einem int Wert begrenzen? Das gebe viel weniger zu rechnen, es wäre aber 
nicht auf einen Blick ersichtlich, also unübersichtlicher!?
Gast #2525411
Jörg Wunsch schrieb:
> Wenn `int' ein 16-bit-Typ ist, dann ist der größtmögliche
> Array-Index 32767, da die Indizierung in C immer mit dem Typ `int'
> erfolgt (und auch immer vorzeichenbehaftet ist, denn ptr[-1] ist
> eine gültige Operation).
welcher index ist damit gemeint, der absolute oder der relative.

int 16bit

int a[32001];

a[32000] = 0;

dann muss er ja intern a + 32000*sizoof(int) rechen. damit ist das 
zwischenergebniss aber größer als int. Das ganze wird ja noch schlimmer 
wenn das array nicht int sondern ein noch größere Datentype ist.
#2525429
M. B. schrieb:

> Wert. Dann rechne ich das ganze in den Stromwert (float) um. Aber dann
> lege ich ja wieder ein floatwert in ein Array?!

Wozu?


> Das Ziel des ganzen ist ja, wenn der Strom ein gewisses Level erreicht
> hat, muss ich den Motor abschalten.

Dazu musst du aber nicht den ADC Wert in einen Strom umrechnen. Du 
kannst ja auch diesen gewissen Level in den zugehörigen ADC Wert 
umrechnen und damit den Vergleich machen.

> Ich habe den ADC Wert in ein
> Stromwert umgerechnet, um es besser zu visualisieren.

Du du sowieso eine lineare Funktion hast, ist das doch im Grunde nichts 
anderes als eine entsprechende Achsbeschriftung, wenn du die ADC Werte 
hinmalst. Die Kurve ist ja vollständig identisch, egal ob du sie als 
direkte ADC Werte oder als umgerechnete Stromwerte ausgibst. D.h. 'Ich 
muss visualisieren' ist kein Grund für unnötige Speicherverschwendung.

> einem int Wert begrenzen? Das gebe viel weniger zu rechnen, es wäre aber
> nicht auf einen Blick ersichtlich, also unübersichtlicher!?

Warum soll das unübersichtlich sein?
Alles nur eine Frage der Doku bzw. vernünftiger Variablennamen.
Gast #2525438
Peter Dannegger schrieb:
> Laut Datenblatt hat der STM32F103VC stolze 48kB RAM.

Um das ganze dann mal umzudrehen: 48kB Ram sind ausreichen für um die 
24000 16-bit-Werte, oder 12000 32-bit-Werte.

Das liegt nun doch um einiges unter den ursprüglichen 700000 Werten. Da 
sollte man nochmals über das Konzept nachdenken.

Oliver
OP #2525444
Karl Heinz Buchegger schrieb:

> Warum soll das unübersichtlich sein?
> Alles nur eine Frage der Doku bzw. vernünftiger Variablennamen.

ja ich weiss jetzt wie ich es mache. Die Vorgabe ist, das auch die 
Hardwareentwickler und Projektleiter auf einen Blick die Software 
verstehen. Aber die sind ja auch nicht auf den Kopf gefallen. Wie Du 
sagtest, eine Sache der richtigen Doku und Darstellung.

Danke für eure Antworten! Wieder etwas gelernt!

Gruss!

M.B.
#2525456
M. B. schrieb:

> ja ich weiss jetzt wie ich es mache. Die Vorgabe ist, das auch die
> Hardwareentwickler und Projektleiter auf einen Blick die Software
> verstehen.

Verpass allen Variablen einen postFix

   current_adc       ist der Messwert Strom-Messwert vom ADC
   current_cur       ist der zugehörige Messwert umgerechnet in einen
                     Strom

   limit_adc         ist der Grenzwert, ausgedrückt in ADC Einheiten
   limit_cur         dasselbe in Strom-Einheiten


Ein Code von
1
   if( current_cur > limit_adc )
kann daher schon mal nicht richtig sein, weil hier falsche Einheiten 
miteinander verrechnet werden. Das eine sind Milliampere, das andere 
sind ADC Werte.

Wohingegen
1
   if( current_cur > limit_cur )
oder
1
   if( current_adc > limit_adc )
richtig sein kann. Links und rechts sind die gleichen 'Einheiten'.

Noch dokumentieren, dass im Variablennamen die 'Einheit' des Messwertes 
enthalten sind, und schon versteht das jeder Techniker oder Ingenieur.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.