Hi, der folgende Code, in dem ich mir aus Zeitgründen beim Programmstart ein Array mit 200 Zahlen berechne, funktioniert leider nicht am µC obwohl in der Simulationsumgebung von IAR KickStart alles geklappt hatte (habe ich mit printf gecheckt). Compiliert habe ich mit mspgcc. Was meint Ihr woran das liegt? Grüsse, adrian #include <io.h> int main (void) { int accelerate1[200]; unsigned int i; P1DIR=0xFF; P1OUT=0x01; for(i=0;i<201;i++){ //accelerate1 von [0]=1000 bis [200]=14333 accelerate1[i] = ((i * i) / 3) + 1000; } }
Was funktioniert denn genau nicht? Was sofort auffällt: Du überschreibst die Grenze des Arrays. Du hast 200 Elemente alloziert, gehst aber von Index 0 bis 200, also 201 Elemente. Ich weiß nicht, wie groß sizeof(int) beim MSP430-GCC ist, aber falls es 16 bits sind, bist Du bereits weit über dem Wertebereich: 200*200 sind 40000, der positive Wertebereich eines 16-bit int ist 16383.
Also ich hatte erst in KickStart danach in einer weiteren for-Schleife alle Werte abgefragt und korrekt rausbekommen. In der Praxis kann ich nur sagen dass alles was nach dieser Schleife kommt nicht mehr ausgeführt wird. Also zu den 16383: Ich dachte ein unsigned int geht bis 64000? Habt bitte Verständnis dass ich mit irgendwelchen eventuellen Hardwaregrenzen nicht vertraut bin da ich bisher nur Delphi, das zwar ganz gut, aber eben doch nur Hochsprache, programmiert habe.... Und zu dem Index von 0 - 200: Heisst das dass ich mit den [200] in der Deklaration 200 Werte festlege die dann von 0-199 gehen und nicht einen Index von 0-200? oder von 1-200? (den Wert für [200] konnte ich nämlich auslesen das waren 14333.)
Also ich hab mir mal die neueste IAR Testversion V3.10A heruntergeladen da kann man so schön die einzelnen Schritte verfolgen. Ausserdem den Zahlenbereich reduziert so dass es nur gut 15000 sind. Im Simulationsmodus geht er bis ganz runter und macht schön seine for-Schleife; schliesse ich dann wirklich den µC an gehts nicht mehr. Auch keine klare Auskunft an welcher Stelle es hängt, muss aber aufgrund der gemessenen Ports die 1. for-Schleife sein. Wahrscheinlich bin ich nur zu dumm irgendeine Einstellung zu setzen aber welche?! Hier mal der gesamte Text im Anhang.... [irgendwie nervt mich das es kann doch nicht sein dass dieses Teil nicht das tut was man ihm einbrennt?!] adrian
Also wenn ich das Array auf 7 verkleinere dann gehts teilweise, allerdings springt er nicht in die letzte for-schleife. Sieht fast so aus als wäre der Prozessor damit überlastet macht das was wenn er noch auf 32kHz läuft? (Tut er doch wenn ich kein Quartz angeschlossen habe?) Meine Hardware ist wirklich nur das Header Board mit MSP430F1232 und an 2 Ports Optokoppler; mit einfachen Schaltbefehlen hat das bereits funktioniert (allerdings NUR wenn ich sie mit mspgcc kompiliert habe mit IAR KickStart hats nie wirklich geklappt das konnte mir bislang auch niemand erklären.) adrian
Hallo Adrian!
>Also zu den 16383: Ich dachte ein unsigned int geht bis 64000?
beim msp430-gcc ist sizeof(int) tatsächlich 16 bit (wie Jörg schon
vermutete) und kann damit Werte im Bereich von -32768 bis 32768
annehmen. Das 16. Bit ist für das Vorzeichen Reserviert. Bei einem
unsigned int verdoppelt sich der Positive Bereich, der Negative ist
dagegen überhaupt nicht vorhanden (Werte von 0 bis 65536).
Warum das bei IAR nicht funktioniert, kann ich Dir leider auch nicht
sagen, aber mir fällt auf, daß Du keinerlei Initialisierung zu Beginn
von main machst. Vielleicht liegts daran...
Gruß,
Patrick...
was müsste ich denn initialisieren? ich habe auf jeden fall getestet das programm sowohl mit IAR wie auch mit mspgcc zu kompilieren ohne erfolg. wenn ich jedoch das array verkleinere dann gehts ja.... (ich hatte mal 7 versucht). das mit dem (unsigned) int war mir ja klar also liegt da schonmal nicht der fehler. kann das sein dass das array einfach nicht so gross sein darf weil irgendein speicher vollläuft oder so?! zur initialisierung: was sollte ich denn initialisieren? (sorry aber ich bin noch nicht so vertraut mit den mikroprozis....) danke und grüsse, adrian
> Und zu dem Index von 0 - 200: Heisst das dass ich mit den [200] in > der Deklaration 200 Werte festlege die dann von 0-199 gehen und > nicht einen Index von 0-200? oder von 1-200? 0..199. Sowas sollte in jedem C-Buch stehen -- Dein Handwerkszeug mußt Du schon erstmal ein wenig (kennen-)lernen, bevor Du das benutzt. > (den Wert für [200] > konnte ich nämlich auslesen das waren 14333.) Klar, Du hast ihn ja beschrieben. Er steht nur in einem Speicherbereich, den Du nicht für diesen Zweck reserviert hast, oder mit anderen Worten: Du hast damit irgendwas überschrieben (kannst auch ,,zerstört'' sagen). Damit ist es natürlich nicht verwunderlich, daß danach irgendwas anderes nicht mehr so funktioniert, wie es sein sollte. > ich habe auf jeden fall getestet das programm sowohl mit IAR wie > auch mit mspgcc zu kompilieren ohne erfolg. wenn ich jedoch das > array verkleinere dann gehts ja.... (ich hatte mal 7 versucht). Das deutet auf ein Ressourcenproblem hin. Ich weiß nicht, wo die MSP430 Tools auto-Variablen anlegen. Normalerweise landet sowas auf dem Stack. Vielleicht ist da nicht genügend Platz? Kannst ja mal probieren, ob das besser geht, wenn Du die Variable global machst oder `static' deklarierst.
Ich bin da eher learning-by-doing orientiert aber ich gebe zu dass es bei einer Sprache wie C vielleicht nicht optimal ist.... (mit Delphi hats wunderbar geklappt) Das mit den Ressourcen habe ich auch schon vermutet ich werde mal Deine Vorschläge testen! Was mir allerdings bislang keiner erklären konnte ist, warum das simple LED flashen mit for(i=0;i<32000;i++) mit mspgcc jedoch NICHT mit IAR geklappt hat.... IAR hat bei etwa i<1000 Schluss mit Zählen gemacht?! (jedoch nicht beim Simulieren) Sollte ich da vielleicht doch irgendetwas initialisieren (ausser Port1)? Vielen Dank für Eure Unterstützung! adrian
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.