Programm springt nicht in die main methode

Gast #688000
Hallo,

ich bin absoluter anfänger!

Ich habe mir ein LPC2294 board von Philips angeschafft und zusätzlich 
noch eine erweiterung, mit schaltern, LEDs, Poti, motor,...

Ich habe nun ein Programm geschrieben in der IDE Keil. Diese soll die 
Spannung am AD Converter messen und je nachdem wie hoch die Spannung 
ist, verschiedene LEDs zum leuchten bringen. Wenn ich im debug mode nach 
dem Fehler suche, kann ich sehen, dass das Programm gar nicht in die 
main methode springt. Es bleibt vorher stehen, am SWI_Handler. Hat 
jemand eine Idee an was dies liegen könnte?

Danke im Vorraus und Gruß

Timo



Hier der Quellcode:


#include <lpc22xx.h>                      // LPC2200 definitions
#include <stdio.h>                                  // standard I/O 
.h-file
#define VREF  3,6


unsigned int val;
unsigned int chan;


extern void init_serial (void);


int main(void) {


  init_serial();                      // Initialize Serial Interface



  /* Setup the A/D converter */
  IODIR1 = 0x00FF0000;                 // P1.16..23 defined as Outputs
  VPBDIV = 0x02;                       // Set the Pclk to 30 Mhz
  ADCR   = 0x00210601;                 // Setup A/D: 10-bit AIN0 @ 3MHz




  while(1) {

    ADCR  |= 0x01000000;                  // Start A/D Conversion
    while ((ADDR & 0x80000000) == 0);
    val = ((ADDR >> 6) & 0x03FF);         // Extract the A/D result
    chan = ((ADDR >> 24) &0x0007);        // Channel (should be 0)

    printf ("Digital Value %4u = %01u.%04u Volts\r",
         (unsigned) val,
         (unsigned) (val * VREF) >> 10,
         (unsigned) ((val  VREF  10000UL) >> 10UL) % 10000);






    //Digital value: LED ON


    IODIR1 = 0x00FF0000;



    if ( val <= 30 ) {                  // 0 Volt;

      IOCLR1 = 0x00FF0000;
    }

    else if ( val <= 169 ) {

      IOSET1 = 0x00010000;

    }
    else if ( val >= 303 ) {

      IOSET1 = 0x00030000;

    }
    else if ( val >= 414 ) {

      IOSET1 = 0x00070000;

    }
    else if ( val >= 552 ) {

      IOSET1 = 0x000F0000;

    }
    else if ( val >= 690 ) {

      IOSET1 = 0x001F0000;

    }
    else if ( val >= 828 ) {

      IOSET1 = 0x003F0000;

    }
    else if ( val >= 966 ) {

      IOSET1 = 0x007F0000;

    }
    else if ( val >= 1104 ) {

      IOSET1 = 0x00FF0000;

    }

    IOCLR1 = 0x00FF0000;

  }
}
Gast
> SWI_Handler

Wer, was und wo der/die/das auch immer sein soll.

Kompiliert der das überhaupt? Änder mal bitte:
1
#define VREF  3,6

in
1
#define VREF  3.6
Persönliche Seite
Wie wird der Debugger aufgerufen bzw. wie lange lässt du dem Programm 
Zeit bis du im Debugger manuell einen Break auslöst?
http://www.keil.com/forum/docs/thread8287.asp

Möglicherweise gibt ähnliches wie in 
http://www.keil.com/support/docs/3376.htm
(printf könnte memory allocation machen)

Ansonsten findet man bei Keil noch viel mehr zu SWI_Handler. Ich würde 
zuerst ein Beispiel von Keil compilieren und das dann wenn es läuft nach 
und nach entkernen und mit meinem Code aufrüsten.
Moderator Persönliche Seite
Vorab: Falls die RealView-Tools verwendet werden (Standardeinstellung 
bei Keil uVision), ist dies nicht das passende Forum. Keil hat ein 
eigenes Support-Forum (www.keil.com).

Dennoch: Die SWI Exception wird wahrscheinlich durch das stdio-Subsystem 
der Laufzeitbibliothek ausgelöst. Sieht so aus, als wäre 
"semihosting_swi" aktiviert. Darüber können z.B. Ausgaben an das 
Host-System umgeleitet werden, falls die Debugging-Hard-/Software(z.B. 
"RDI") dies unterstützt. Dies ist hier wohl nicht beabsichtigt. 
Üblicherweise findet man in den Beispielen von Keil eine Datei mit Namen 
"Retarget.c", in deren Funktionen wird die Anbindung(en) der 
stdio-Funktionen an das verwendete "IO-Device" (z.B. UART) eingestellt.

main() wird bei RealView üblicherweise nicht direkt vom Startup-code 
sondern indirekt von einer Funktion __main aufgerufen, die Teil der 
herstellerspezifischen Laufzeitbibliothek ist und vom Startup-code 
aufgerufen wird. __main erledigt noch einiges an Initialisierungen bevor 
es main() aufruft.

Langer Rede: Anhand des gezeigten Codes kann man überhaupt nicht konkret 
weiterhelfen und bestenfalls spekulieren (so getan). Man zeige den 
gesamten Quellcode (inkl. Startup, retarget etc.).

> Der SWI_Handler steht im Startup.s Code
Und wahrscheinlich ist es nur eine Endlosschleife als Platzhalter, 
zumindest ist das in vielen Beispielen von Keil so.

Martin Thomas
(Ich nutze Keil/RealView nur sehr selten und auch nur die Eval-Version 
aber schaue mir deren mitgelieferte Beispielsammlung öfters an - so take 
it for what it's worth)
Gast
Den Code den ich oben angegeben habe, ist ein beispielcode von Keil. Ich 
habe ihn nur erweitert. Ich habe jetzt auch mal all meine Erweiterungen 
nochmal rausgenommmen und trotzdem (nur das keil bsp) funktioniert 
nichts. Selbes Problem, auf dem Board ist nichts zu sehen. Alle LEDs 
sind an aber man kann nichts regeln. Wenn ich in den Debug mode gehe, 
bleibt das Programm wieder an der selben stelle hängen. Am SWI_Handler. 
Die main funktion wird also niemals ausgeführt.

gruß Timo

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.