NGW100 Segmentation Falt

R

Ruddii

Guest
Hi,
ich hab ein Programm um bei meine NGW100 die LED zum leuchten zu bringen. Da mein AVR32 Studio keine Verbindung zum NGW100 aufbaut (kein mk2) lade ich die elf Datei direkt auf die SDcard und führe sie da aus! Mit den "Hallo Welt" Programmen läuft das auch auch ohne Probleme aber wenn ich die LED's ansteuern will bekomm ich immer die Fehlermeldung:

"SEGMENTATION FALT"

Kann es sein das ich Programme nicht mit "Cygwin" ausführen kann?
Oder das im AVR32 Studio hinter meiner "elf" Datei ein "[nonebe]" steht?

Jeder kleiner Tipp ist mir sehr willkommen.
 
gleiches Problem

Hi Rudii!

Bei mir ist heute das gleiche Problem aufgetaucht. Hast du deine Problem schon in den Griff bekommen.
Wen ja, wärs echt toll wenn du kurz schreiben könntest an was es gelegen hat.
Vielen Dank schon im Voraus!

Frieder
 
Ich könnte anbieten deinen Code unter linux zu kompilieren und hier auszuführen. Evtl entdecke ich ja was.
 
Ich habe es in cygwin mit "avr32-gcc hello.c" compiliert und mit der SD Karte übertragen. Und das war der Fehler !!! Richtig ist Folgende Zeile:
avr32-linux-gcc hello.cpp -mpart=ap7000 -o "hello.elf"

Hatte also den falschen compiler genommen.
 
Jetzt gehts!

Danke euch für eure Antworten!
Jetzt gehts habe einfach avr32-gcc durch avr32-linux-gcc ersetzt und jetzt gehts! Wunderbar!

Was mir nicht ganz klar ist ist dies hier: -mpart=ap7000. Was bedeutet das?
Bei mir funktionierts, wenn ich folgendes eingabe: avr32-linux-gcc -o hello.elf hello.c
Was ist da anders?

Vielen Dank!
 
erster Versuch!

Nun, da ich mein erstes kleines C-Programm (Hello WOrld ;-)) tatsächlich zum laufen gebracht habe, wollte ich nun mal eine LED zum blinken bekommen, bin aber leider gescheitert.
Zum einen habe ich die Adresse z.B. von LEDA nicht herausgefunden. Wenn ich das richtig verstanden habe muss ich doch irgendwie auf Bit 19 eine 0 bzw 1 schreiben , damit die LED an bzw. aus geht. Stimmt das schonmal?
Aber wo muss ich dies hinschreiben? Ins Register, das zurt LEDA gehört? Wo finde ich dies?
Habe schon die ganzen header files wie ap7000.h, pio202.h, io.h ... mal durchgestöbert aber entweder nichts brauchbares gefunden oder so viel, dass ich nicht wusste welches jetzt stimmt.
Wär echt super von euch, wenn mir da mal jemand helfen könnte.
Vielen Dank schonmal!

Grüße Frieder
 
Hallo Frieder,

auf dem NGW100 sind die LEDs wie folgt angeschlossen:
  • D1: PE19
  • D2: PA16
  • D3: PA19
D1 dürfte hier die LEDA sein, die du ansteuern möchtest. Wenn du Linux als Betriebssystem nutzt, kannst du Pins über das GPIO-Device ansteuern und abfragen. Das GPIO-Device wird hierbei wie ein File geöffnet und man kann etwas hineinschreiben oder herauslesen (siehe hierzu auch diesen Thread).

Wenn Du den Mikrocontroller im stand alone betreibst, also ohne Linux, kannst du folgendermaßen auf Pins zugreifen (hier mal am Beispiel LED D1 an PE19, andere Pins sind nicht berücksichtigt)
Code:
  /* LEDs beim NGW100:
     D1: PE19  <- diese wollen wir ansteuern
     D2: PA16
     D3: PA19   */


  /* PIO Enable Register. Pin-Maske für die Pins, welche durch den
     PIO-Controller gesteuert werden sollen. */
  pioe->per = 0x00080000; /* PE19 wird durch PIO-Controller gesteuert */
  
  /* Output Enable Register. Hier definierst du die Pins, welche
     Ausgänge sein sollen. */ 
  pioe->oer = 0x00080000;  /* Direction Output */
  
  /* Interrupt Disable Register. Hier die Interrupts der I/Os
     abschalten. */
  pioe->idr = 0x00080000;  /* Interrupts PE19 aus */
  
  /* PullUp Enable Register. Hier die Pins festlegen, welche den
     internen Pullup-Widerstand nutzen sollen. */
  pioe->puer = 0x00080000;  /* PE19 mit Pullup */
  
  /* Set Output Data Register. Hier die Pins auf High oder Low setzen. */
  pioe->sodr = 0x00080000; /* PE19 high, LED aus */
  pioe->sodr = 0x00000000; /* PE19 low, LED an */
Ich hoffe, ich konnte dir etwas weiter helfen.
(den Programmcode habe ich nicht getestet)

Gruss
Dirk
 
wieder Segmentation fault

Danke Dirk für die schnelle Antwort. Jetzt ist soweit alles klar. Habe den Code ein weinig verändert, z.B. muss anstelle von "->" ein "." stehen, oder?

Hier mein Code

Code:
#include <stdio.h>
#include <avr32/ap7000.h>


int main(void){	
  AVR32_PIOE.per = 0x00080000; 		/* PE19 wird durch PIO-Controller gesteuert */
  
  AVR32_PIOE.oer = 0x00080000;  	/* Direction Output */

  AVR32_PIOE.idr = 0x00080000;  	/* Interrupts PE19 aus */

  AVR32_PIOE.puer = 0x00080000;         /* PE19 mit Pullup */

  AVR32_PIOE.sodr = 0x00000000;  	/* PE19 low, LED an */

}

Nun bekomme ich nach folgendem Befehl:
avr32-linux-gcc led.c -mpart=ap7000 -o "led.elf"
einen Segmentation fault. Was mache ich denn falsch?
Ich bin über jede Hilfe dankbar.
Das NGW100 ist im Prinzip noch im Lieferzustand. D.h. es läuft schon ein Linux drauf. Geht das ganze dann trotzdem?
Viele Grüße
Frieder
 
Hallo Frieder ...
Habe den Code ein weinig verändert, z.B. muss anstelle von "->" ein "." stehen


uuups, da habe ich etwas vergessen...
Code:
  /* Strukturadresse erstellen, die auf die PIOE Basisadresse zeigt */
  [B][COLOR=DarkRed]volatile avr32_pio_t *pioe = &AVR32_PIOE;[/COLOR][/B]

  /* man kann jetzt auf pioe folgendermaßen zugreifen. */
   pioe->per = 0x00080000;    /* oder */
   (*pioe).per = 0x00080000;
Ich versuche das Problem mit dem Segmentation Fault heute abend mal nachzuvollziehen, kann aber noch nicht versprechen, ob ich dazu komme.

Gruss
Dirk
 
Hallo Frieder,

hast du inzwischen die Ursache des Fehlers "Segmentation Fault" gefunden? Ich wollte eigentlich auch mal mit dem NGW100 die LEDs steuern, bin aber leider am Wochenende nicht dazu gekommen :-/

Gruss
Dirk
 
Was Neues?

Hallo Dirk!

Hast du schon etwas neues herausgefunden?
Habe nun auch mal versucht die Adresse direkt mit einem Pointer anzuprechen, bekomme aber den gleichen Fehler. Ist ja im Prinzip das Gleiche.
Hier der kurze Versuch:
Code:
	unsigned long *testptr;	

	testptr = 0xFFE02830;

	*testptr = 0x00080000;

Der Segmentation Code Error kommt in der letzten Zeile, also erst bei der Zuweisung.

Viele Grüße
Frieder
 
Hallo Frieder!
Hast du schon etwas neues herausgefunden?
Leider nicht. Ich bin noch nicht dazu gekommen, das selbst mal auszuprobieren ... und so auf Anhieb fällt mir keine Ursache für die Fehlermeldung ein. Ich werde am Wochenende versuchen die LEDs vom NGW100 anzusteuern, bzw. mal selbst ein Programm zu compilieren, früher schaffe ich es wahrscheinlich nicht.
Falls du zwischenzeitlich etwas herausfindest, kannst du dich ja mal melden.

Grüsse
Dirk
 
Hallo Dirk!

Ich halte dich auf jeden Fall auf dem Laufenden.
Mal noch ne andere Frage:
Woher weißt du, dass z.B. PER - PIO Enable Register, oder OER -Output Enable Register heißen? Scheint logisch, aber steht das irgendwo?

Gruß
Frieder
 
Hallo Dirk!

Danke für die superschnelle Antwort.

Habe nun mal die einfachste Zuweisung mit Speicherzugriff ausprobiert:
Code:
*(unsigned char*)AVR32_PIOA_ADDRESS = 0x00;
Es geht nicht! Ich folgere daraus, dass es ein Compiler - Linker Problem is, welches mir diesen "Segmentation fault" erzeugt. Weiterhin könnte es auch sein, dass mir das embedded Linux den Zugriff sperrt?
Meine Frage nun: Hats du irgendwelche Einstellungen am Compiler gemacht?
Ich habe mir Cygwin runtergeladen und betreibe es unter Windows. Gar nichts eingestellt und nur bekannte Zeile:
avr32-linux-gcc led.c -mpart=ap7000 -o "led.elf" eingegeben.
Wenn ich irgendwelche Einstellungen ändern muss, oder du mir vielleicht zu einen anderen Compiler rätst, dann schreibe mir das doch bitte kurz.
Ansonsten wünsche ich eine schöne Woche!

Viele Grüße
Frieder
 
kleiner Durchbruch!

Hallo Dirk!

Also erstmal das Gute vorneweg: Die LEDs blinken wie blöd! :)
Ich habe es wie folgt gemacht:
Code:
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>

#define BUFFERSIZE 257
#define LED_OFFSET 19

int main(void){
		int i;
		int pio = 0;
	  	static unsigned int off = 1<<LED_OFFSET;
	  	static unsigned int on = 0;
		

pio = open("/dev/gpio1", O_RDWR|O_NONBLOCK);

	for(i = 0; i < 1000000; i++)
	{
		write(pio, &on, 4);
	  	write(pio, &off, 4);
	}
	close(pio);
	
return 0;
}
Das Problem ist nur, dass das Ganze jetzt über die Treiber in Linux läuft (/dev/gpio1).
Wenn du eine Lösung hast, wie ich den Speicher direkt ansprechen kann, dann wär das natürlich klasse.

Viele Grüße
Frieder
 
Hallo Frieder!

Also erstmal das Gute vorneweg: Die LEDs blinken wie blöd!
:) Das ist doch klasse!
Warum der Fehler Segmentation Fault aufgetreten ist, weiss ich noch nicht, ich konnte es selber noch nicht ausprobieren. Ich denke mal, dass man die GPIO-Pins nicht direkt bei einer Linux-Applikation ansprechen kann, man würde ja auch die GPIO-Konfiguration von Linux übergehen. Suche mal bei www.avrfreaks.com im AVR32-Linux-Forum nach "gpio_leds" und "gpio_keys", dies soll eine bessere Lösung bieten, auf GPIO-Pins zuzugreifen. Sobald ich weitere Infos zu dem Thema habe, melde ich mich!

Grüsse,
Dirk
 
Hallo,
so wies aussieht, hat bis jetzt auch keiner eine Antwort gefunden. Ich hab' gehört, das es am Linux liegen kann, was auf dem NGW drauf ist. Habe es aber noch nicht getestet. Sollte jemand mittlerweile eine Antwort haben, wäre es schön wenn es hier gepostet werden würde :)

Noch viel Erfolg,
Ruddii
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)