PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme mit Programmaufruf.



sloti
05.04.2011, 12:31
Moin,

ich habe inzwischen ein neues Problem mit meinem Board von IAR. Ich hab inzwischen damit angefangen alle Initialisierungen usw. (mehr oder weniger) selbst zu schreiben. Habs teilweise nur so geändert wie ich es brauche. Nun habe ich aber das Problemm, dass der Controller immer abstürzt wenn ich eine Funktion ausführe die ich vor der Main funktion deklariere. Hier einmal mein Code

#include "iolpc1766.h"
#include "intrinsics.h"

void i2c_init(void)
{
PCONP=(1<<7); // Enable Power
PCLKSEL0=(0<<14)|(1<<15); //PCLK = CCLK/2=50MHz
PINSEL1=(1<<22)|(1<<24); //I2C Pinfunktion auswählen
SETENA0=(1<<10); //I2C interrupt aktivieren
}

void i2c_start (void)
{
I2C0CONSET_bit.I2EN=1;
}

void test (void)
{
for(unsigned int a=0;a>15;a++);
}

void clock_init (void)
{
//PLL Interrupt aktivieren
SCS_bit.OSCEN=0;
PLL0CON_bit.PLLC = 0; //PLL abkoppeln
PLL0FEED = 0xAA;
PLL0FEED = 0x55;

PLL0CON_bit.PLLE = 0; //PLL ausschalten
PLL0FEED = 0xAA;
PLL0FEED = 0x55;

CLKSRCSEL &= ~(1<<0)|(1<<1); // internen Oszillator auswählen


PLL0CFG_bit.MSEL = 75-1; //M=75,N=2
PLL0CFG_bit.NSEL = 2-1;
PLL0FEED = 0xAA;
PLL0FEED = 0x55;

PLL0CON_bit.PLLE = 1; //PLL wieder einschalten
PLL0FEED = 0xAA;
PLL0FEED = 0x55;

while(!PLL0STAT_bit.PLOCK); //warten bis PLL fertig ist

CCLKCFG = 3-1; //CCLK= Fcco/3

PLL0CON_bit.PLLC = 1; // PLL ankoppeln
PLL0FEED = 0xAA;
PLL0FEED = 0x55;
}

void clock_output_init(void) //stellt den Takt für die Kamera auf P1.27 bereit
{
CLKOUTCFG_bit.CLKOUT_EN =0;
CLKOUTCFG &= ~(1<<0)|(1<<1)|(1<<2)|(1<<3); //CCLK auswählen
CLKOUTCFG = (1<<4)|(1<<5)|(1<<6); //duch 8 teilen 100/8=12,5
CLKOUTCFG_bit.CLKOUT_EN=1;
}


int main()
{
FLASHCFG=(1<<12)|(1<<14);
SETENA0=(1<<16);

test();

while(1)
{

}
}


Wenn ich den Inhalt der Funktionen einfach so in die Main kopiere klappts. Nur wenn ich die funktionen aufrufe, wie in meinem code gerade die test() funktion. Stürzt er ab und macht gar nichts mehr. Zudem gibt er mir immer folgendes aus : "Tue Apr 05 13:29:35 2011: The stack 'CSTACK' is filled to 100% (1024 bytes used out of 1024). The warning threshold is set to 90.% ". Mit der Meldung kann ich auch nur sehr wenig anfangen. Kann mir da jemand weiterhelfen? Wobei die Warunung nicht unbedingt im zusammenhang mit meinem Problem steht, da sie immer auftaucht sobald ich das programme downloade.

mfg
Erik

TobiKa
05.04.2011, 15:53
Na dein Programm macht doch auch nichts?!
Es führt schnell die Funktion vor der while-Schleife aus, und geht dann in die leere Unendlichschleife und macht dann nichts mehr.
Wenn er also nicht mehr reagiert, macht er ganz genau das was du programmiert hast!

Und noch ein paar Grundsätzliche Dinge.

for(unsigned int a=0;a>15;a++);
Dir ist schon klar das diese Schleife nie laufen wird?!
Außerdem ist die Verwendung eines Int, egal ob signed oder unsigned, an der Stelle eine riesen Verschwendung von Speicher!

Ein Stack ist ein Speicherbereich, ich würde es auf keinenfall ignorieren und mal gucken wo das Problem herkommt.

sloti
06.04.2011, 08:27
Danke für die Antwort. Das die Funktion nichts macht ist eigentlich nebensächlich. Da es egal ist welche funktion ich Aufrufe und ich kann halt im Debugger sehen, dass er irgendwie abstürzt, da er die Funktion (egal welche ich nehme) nicht ausführt. Das mit dem Stack ist auch noch sehr eigenartig. Ich hab etwas geforscht und hab iwo gelesen, dass es an mangelndem startup code liegt. Ich hab daraufhin mal den startup code aus einem Beispielprogramm kopiert. Aber geholfen hat das auch nich. Hat da vielleicht nochmal jemand ne Idee?

mfg
Erik

sloti
06.04.2011, 10:13
So inzwischen bin ich mir sicher, dass das Problem mit dem Programmaufruf nur durch das Stackproblem bedingt ist. Ich hab ein wenig das Datenblatt durchforstet und bin auf das CONTROL register gestoßen bei dem man zwischen dem mainstack und dem process stack wählen kann. Nun stellt sich mir die Frage wo genau liegt der unterschied. Und Handler und Thread mode ist mir auch noch ein wenig suspekt. Und wie und wo initialisiere ich am besten den Stackpointer?

beppo
11.04.2011, 22:19
Schau in den Startup Code und in dein Linker command-file. Nach einem reset wird der Stackpointer mit dem Wort initialisiert, das an Adresse 0 im Flash steht. Danach wird der Program Counter mit dem 2. Wort (ab Adresse 4) geladen. An dieser Adresse sollte sich der Reset-Handler befinden. Der Reset Handler initialisiert die Variablen und ruft dann irgendwann main() auf.