Forum: Compiler & IDEs Programm springt nicht in die main methode


von Timo (Gast)


Lesenswert?

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;

  }
}

von pumpkin (Gast)


Lesenswert?

> 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

von Timo (Gast)


Lesenswert?

Der SWI_Handler steht im Startup.s Code

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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.

von Martin T. (mthomas) (Moderator) Benutzerseite


Lesenswert?

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)

von Timo (Gast)


Lesenswert?

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

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.