Verzweifelt: Array deklaration fuer TI Funtionen

Gast #2208414
Lesenswert?

Hi,

ich werde bald hier noch Wahnsinnig. Ich quaele mich mit einer Funktion
auf der TI Library ab. Eine simple MaxVal funktion:

int DSPF_sp_maxidx(const float* x, const int n)

Beschreibung von TI:
x Pointer to input array. Array must have  n  elements.

Ich bekomme es einfach nicht hin, ein Array und nen Pointer anzulegen,
der bei dieser Funktion die richtige Loesung ausgibt. Nur mit direkter
Speicherzuweisung (Adressenzuweisung) ohne Arraygroesse funkioniert es.
Also z.B. so:

float * x = (float *)0x8000D000;

sobald ich jedoch ein Array und Pointer anlege funktioniert es nicht
mehr, ich habe alle Moeglichen deklarationen ausprobiert die ich kenne,
deswegen werde ich die hier jetzt nicht alle niederschreiben, sonder ich
Frage einfach mal rum: wie wuerdet ihr die Deklaration eines Arrays
machen, das ich in dieser Funktion benutzten kann? Ich waere sehr
dankbar fuer Vorschlaege.

Gruss
Johann
Gast #2208435
Lesenswert?

So hab ich es auch mal Versucht. Jedoch habe ich soebend den Fehler 
gefunden. Komischerweise funktioniert diese Deklaration nicht global. 
Kann mir einer erklaeren warum, bzw. muss man auf was achten, wenn man 
das Array global deklarieren moechte?
Gast #2208451
Lesenswert?

wenn du es so genau wissen willst:
also wenn ich das Array in meiner main() deklariere, dann funktioniert 
die Funktion DSPF_sp_maxidx einwandfrei, der Array-Inhalt wird staendig 
von einem ADC gefuettert. Das Ergebniss von der Funktion kann ich 
kontrollieren, und wie gesagt es ist das richtige.
Sobald ich das Array aus der main() rausnehme und global deklariere dann 
liefert mir die Funktion DSPF_sp_maxidx einerseits einen falschen Wert 
und andererseits sprint der Wert die ganze Zeit herum, was er nicht tun 
sollte.
Gast #2208490
Lesenswert?

Das Funktioniert:
1
#include ...
2
 
3
void main(void)
4
{
5
   float ADCINPUT[512];
6
   DSPF_sp_maxidx(ADCINPUT,512);
7
}


Das Funktioniert nicht:
1
#include ...
2
 
3
float ADCINPUT[512];
4

5
void main(void)
6
{
7
   DSPF_sp_maxidx(ADCINPUT,512);
8
}
Gast #2208498
Lesenswert?

Also Johann, deine Fehlerbeschreibung lässt immer noch arg zu wünschen 
übrig. Bisher dachte ich, du schreibst von einem Compilerfehler 
(Deklaration), aber nun ist es wohl ein Runtime Problem. Evtl. liegt ein 
Optimierungsproblem vor - deklariere mal den float Buffer als 
"volatile". Wie beschreibst du den Buffer? Per Interrupt Routine? (ADC 
hat einen Wert gewandelt -> Interrupt -> erzeugt float und schreibt den 
in den Buffer).
Nachdem du aber kaum Infos lieferst, ist das alles wie ein stochern im 
Nebel!
Gast #2208551
Lesenswert?

Es ist ja so, dass ich an dem vollstaendigen Code nichts aender, ausser 
halt ich schiebe die Deklaration des Arrays einmal in die main() und 
einmal halt global. Waere der restliche code incorrekt, dann sollte er 
doch bei beiden varianten den gleichen fehler verursachen?
Follgender ablauf:
EDMA schreibt in L1 Cache --> EDMA stoppt --> CPU fuehrt berechnungen 
durch und schreibt Ergebnisse in L2 Cache --> EDMA wird wieder aktiviert 
--> Es wird nur noch mit dem L2 Cache gerechnet --> Das Array, dass ich 
in die maxidix Funktion einsetzte stammt aus einer anderen TI Funktion: 
Ner FFT --> Nach der FFT ne Schleife in der der Realert fuer ein 
Spectrum berechnet wird --> danach direkt in die maxidix Funktion. Wie 
gesagt, wenn ich das Array in der main() deklariere, dann funzt alles. 
Wenn aber global, dann funzt es nicht mehr.
Ich musste gerade aber noch was lustiger feststellen, wenn ich das 
Array, dass ich in die maxidix reintue, vergroesser, dann fuktioniert 
der ganze code nicht mehr. Ich glaube ich habe eher ein problem mit der 
Cache groesse als beim Code. Wo gibts eigentlich bei CCS die Info ueber 
die Codegroesse etc.?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren