Forum: Compiler & IDEs Zahlenarray generieren


von Adrian (Gast)


Lesenswert?

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;
 }
}

von Jörg Wunsch (Gast)


Lesenswert?

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.

von Adrian (Gast)


Lesenswert?

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

von Adrian (Gast)


Angehängte Dateien:

Lesenswert?

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

von Adrian (Gast)


Lesenswert?

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

von OldBug (Gast)


Lesenswert?

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

von Adrian (Gast)


Lesenswert?

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

von Jörg Wunsch (Gast)


Lesenswert?

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

von Adrian (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.