-         

Ergebnis 1 bis 5 von 5

Thema: Probleme mit Programmaufruf.

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    26.11.2006
    Ort
    Hamburg
    Alter
    25
    Beiträge
    384

    Probleme mit Programmaufruf.

    Anzeige

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

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    25.04.2010
    Beiträge
    1.249
    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.
    Code:
    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.

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    26.11.2006
    Ort
    Hamburg
    Alter
    25
    Beiträge
    384
    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

  4. #4
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    26.11.2006
    Ort
    Hamburg
    Alter
    25
    Beiträge
    384
    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?

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    25.08.2004
    Ort
    Planegg
    Beiträge
    96
    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.
    Schöne Grüsse... Beppo

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •