Forum: Digitale Signalverarbeitung / DSP / Machine Learning Verzweifelt: Array deklaration fuer TI Funtionen


von Johann (Gast)


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

von Stefan E. (sternst)


Lesenswert?

1
#define FA_SIZE 5
2
3
float fa[FA_SIZE];
4
5
DSPF_sp_maxidx(fa,FA_SIZE);

von Johann (Gast)


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?

von Variol (Gast)


Lesenswert?

Johann schrieb:
> Komischerweise funktioniert diese Deklaration nicht global.

Natürlich funktioniert das auch global. Was heißt denn bei Dir 
"funktioniert nicht"? Ist denn heutzutage niemand mehr in der Lage, eine 
vernünftige Fehlerbeschreibung zu liefern?

von Johann (Gast)


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.

von Variol (Gast)


Lesenswert?

Wenn wir mal davon ausgehen, dass die von TI stammende Funktion 
DSPF_sp_maxidx korrekt funktioniert, liegt der Fehler in dem Teil des 
Codes, den Du uns hier nicht zeigst.

von Johann (Gast)


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
}

von klausr (Gast)


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!

von Variol (Gast)


Lesenswert?

Und wie kommen die Werte in das Array rein? Der fehlerverursachende Code 
fehlt immer noch :-)

von Johann (Gast)


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.?

von Variol (Gast)


Lesenswert?

Ich geb's auf. Du rückst nur häppchenweise immer neue Informationen 
raus. Damit kann man keine sinnvollen Tipps zur Fehlersuche geben.

von Johann (Gast)


Lesenswert?

ich denke nicht, dass du spass haettest meinen code durchzuschaun da ich 
dadran schon halbes jahr arbeite. Ich sitze selber schon eine Woche an 
diesem beschriebenen Problem.

von Johann (Gast)


Lesenswert?

achja @ klausr

volatile gibt ein compailerfehler, da die funktion ja nach nem "const 
float *" fragt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.