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
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?
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?
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.
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.
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!
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.?
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.
Eine eigene Frage?
Dieser Thread ist über 15 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.