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
1 | #define FA_SIZE 5
|
2 | |
3 | float fa[FA_SIZE]; |
4 | |
5 | DSPF_sp_maxidx(fa,FA_SIZE); |
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.
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 | }
|
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!
Und wie kommen die Werte in das Array rein? Der fehlerverursachende Code fehlt immer noch :-)
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 geb's auf. Du rückst nur häppchenweise immer neue Informationen raus. Damit kann man keine sinnvollen Tipps zur Fehlersuche geben.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.