Forum: Mikrocontroller und Digitale Elektronik Arm7 FreeRTOS Problem


von Ing-Dom (Firma: OpenKNX) (sirsydom)


Lesenswert?

Hallo!

Ich benutze folgenden Port: 
http://www.sirsydom.de/permalinks/MCB2300FreeRTOSlwIP.rar

auf einem Keil MCB2300 EvalBoard mit einem LPC2368.

Den ganzen Ethernet/IP Code habe ich entfernt und es läuft.

Nun füge ich hier und da etwas Code hinzu und nichts geht mehr. D.h. 
FreeRTOS läuft nicht mehr, es werden keine Tasks mehr geschedult.

Das ist völlig verrückt! Entferne ich 2 Zeilen Code aus einer Funktion 
die ich niemals aufrufe geht es nicht mehr, füge ich sie wieder dazu 
gehts wieder. Manchmal genau andersherum. Ich hab keine Ahnung wo ich 
anfangen soll das Problem zu lösen.

von Schorschl (Gast)


Lesenswert?

hi,

schalte mal die compileroptimierung ab und schau dir ev. noch den 
generierten
assemblercode an. Hast du ev. noch den Watchdog aktiv?

gruss,
schorschl.

von Ing-Dom (Firma: OpenKNX) (sirsydom)


Lesenswert?

Die Optimierung ist bereits aus.
Wenn du mir noch sagst was genau du mit Watchdog aktiv meinst kann ich 
es dir vielleicht auch sagen :)
Ich bin recht neu in dem ganzen Thema..
Und Assemblercode ansehen, naja sind ja doch einige kb wo soll ich da 
anfangen?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

In welcher Funktion entfernst du welchen Code? An welchen hier und da 
Stellen fügst du welchen Code hinzu? Ist in dem angegebenen 
Projektarchiv der lauffähige Fall oder der nicht-lauffähige Fall?

Aus dem MAP-File und dem Linkercontrolskript geht hervor, dass ein 0x800 
Bytes grosser Stack eingestellt ist. Du verwendest ausserdem ein 
Linkercontrolskript LPC2368_ROM.ld für ein Target LPC2378. Ist das 
Speicherlayout kompatibel?

Ohne obiges zu kennen, würde ich "probieren" den Stack hochsetzen und 
dann kucken, was der Ball macht. Im Moment hast du 0x800 (2 KB) brutto 
d.h. 0x400 netto + Rest Stack für Interrupts.

Zwischen Stack und RAM-Daten (DATA+BSS) ist noch 2732 Bytes Platz. Die 
könntest du wenigstens teilweise zur Stackerweiterung nutzen. Dafür wäre 
im Linkercontrolskript anzupassen:

Length bei ram kürzen (0x7800 => 0x7000)
Origin bei ramstack verschieben (0x40007800 => 0x40007000)
Length bei ramstack erhöhen (0x0800 => 0x1000) d.h. 100% mehr Stack



von Ing-Dom (Firma: OpenKNX) (sirsydom)


Lesenswert?

Das Linkcontrollskript für den 2368 ist auf jeden Fall korrekt weil es 
ein 2368 ist auf dem ich den code ausführe.

Danke für deine Hilfe, leider hat es nicht geholfen.

Du wolltest noch wissen welche Funktionen ich geändert habe:

Ich habe 3 Funktionen, LED_on, LED_off, LED_switch hinzugefügt (am Ende 
der main.c):

/*
void LED_switch(unsigned char num)
{

  if(num <= 7)
  {
    if(FIO2PIN & (1 << num) == (1 << num))
      FIO2SET = (1 << num);
    else
      FIO2CLR = (1 << num);
  }

}

void LED_on(unsigned char num)
{
  if(num <= 7)
    FIO2SET = (1 << num);
}

void LED_off(unsigned char num)
{
  if(num <= 7)
    FIO2CLR = (1 << num);
}
*/

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Hinzugefügt inkl. Kommentarzeichen oder ohne? Die Funktionen werden, so 
weit ich dich verstanden habe, nur deklariert aber nie angesprungen.

Wie sieht die Map-Datei aus, wenn obiger Code hinzugefügt ist?

Wie sieht das Main-Listing aus, wenn obiger Code hinzugefügt ist?

Zum Erzeugen des Main-Listings (main.lst) das Makefile damit ergänzen:
CFLAGS += -Wa,-adhlns=$(subst $(suffix $<),.lst,$<)
# Beitrag "Listfile erzeugung mit GNUARM compiler"

von Werner B. (Gast)


Lesenswert?

Eventuell wird Fast IO und Legacy IO am Port2 gemischt. Das mögen die 
nicht.

von Ing-Dom (Firma: OpenKNX) (sirsydom)


Lesenswert?

Hallo Stefan,

ich hab mal mein Projekt, so wie es läuft, also mit auskommentierten 
LED-Funktionen gezippt: 
http://www.sirsydom.de/permalinks/FreeRTOS_LPC2368.zip

Die Listfiles und Mapfiles habe ich einmal mit und einmal mit 
auskommentierten LED-Funktionen erstellt:
http://www.sirsydom.de/permalinks/main.lst_mit
http://www.sirsydom.de/permalinks/LPC2378TEST.map_mit
http://www.sirsydom.de/permalinks/main.lst_ohne
http://www.sirsydom.de/permalinks/LPC2378TEST.map_ohne


@Werner

Eigentlich kann das nicht sein, des ist egal was ich in den Funktionen 
mache.

Definiere ich zb in der main.c diese Funktion:

void hfasdkue(void)
{
  int a;
  int b;
  int c;
  int d;

  a = 7;
  b = 9;
  c = 7*9%3;
  d = c*234;
  d /= 17;
}

geht es auch nicht mehr. Entferne ich diese - gehts wieder.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

> Die Listfiles habe ich einmal mit und einmal mit auskommentierten
> LED-Funktionen erstellt:
> http://www.sirsydom.de/permalinks/main.lst_mit
> http://www.sirsydom.de/permalinks/main.lst_ohne

Da ist was schief gegangen. Das sind nicht die Listings von main.c 
sondern von Startarm.s. Diese beiden Listings sind identisch.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

> http://www.sirsydom.de/permalinks/LPC2378TEST.map_mit
> http://www.sirsydom.de/permalinks/LPC2378TEST.map_ohne

Haben nur einen temporären Dateinamen als Unterschied, d.h. am 
Speicherlayout hat sich durch die Änderung in main.c nichts geändert.

von Ing-Dom (Firma: OpenKNX) (sirsydom)


Lesenswert?

hm. Ich habe einfach die Zeile in mein Makefile geschrieben, so:

#
# CFLAGS common to both the THUMB and ARM mode builds
#
CFLAGS=$(WARNINGS)  -D GCC_ARM7 -I. \
    -I ./include \
    -I $(SOURCE_DIR) \
    -I $(RTOS_SOURCE_DIR) \
    -I $(RTOS_PORT_DIR) \
    $(DEBUG) $(CPU_TYPE) -T$(LDSCRIPT) \
    $(OPTIM)

ifeq ($(USE_THUMB_MODE),YES)
  CFLAGS += -mthumb-interwork -D THUMB_INTERWORK
  THUMB_FLAGS=-mthumb
endif

CFLAGS += -Wa,-adhlns=$(subst $(suffix $<),.lst,$<)


>Haben nur einen temporären Dateinamen als Unterschied, d.h. am
>Speicherlayout hat sich durch die Änderung in main.c nichts geändert.

Das heißt? Das es daran nicht liegt?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

> main.lst aus startarm.s statt aus main.c ...

Ich sehe die Ursache im Moment nicht und kann das heute abend selbst 
testen. Irgendwas läuft im Makefile anders als gedacht. In dem Makefile 
aus deinem letzten Archiv ist die Zeile übrigens nicht drin - benutzt du 
das richtige Makefile?

> Kein signifikanter Unterschied im .map File ...

Der .map Filevergleich zeigt, dass das Problem irgendwo anders liegt als 
im Speicherlayout.

Interessant ist, ob der Compiler mit/ohne Zusatzzeilen (Kommentar) 
andere Code-Listings erzeugt. Aber wenn das Speicherlayout (Adressen, 
Längen, Namen) bereits identisch ist, passt das dort wahrscheinlich auch 
;-(

von Ing-Dom (Firma: OpenKNX) (sirsydom)


Lesenswert?

>In dem Makefile
>aus deinem letzten Archiv ist die Zeile übrigens nicht drin - benutzt du
>das richtige Makefile?

Die habe ich eingefügt nachdem ich das Projekt gezippt hatte, ohne wurde 
kein main.lst erzeugt.

Auf jeden Fall mal Danke für deine Hilfe.

von Stefan B. (stefan) Benutzerseite


Angehängte Dateien:

Lesenswert?

Ich kann keinen essentiellen Unterschied zwischen der Version mit den 
auskommentierten Zeilen in main.c und ohne diese Zeilen entdecken.

Allerdings hat mich die Sache mit dem falschen Listing stutzig gemacht 
und der bin ich solange nachgegangen bis es korrekt gemacht wird.

Dabei ist ein geändertes Makefile entstanden (s. Anhang). Die 
Assemblersource ist jetzt nicht "einfach" in der finalen Build-Regel 
aufgeführt, sondern hat einen eigenen Regelsatz bekommen.

von Ing-Dom (Firma: OpenKNX) (sirsydom)


Lesenswert?

Hallo, ich bins wieder, nun bin ich etwas weiter gekommen!

Ich weiß nun das ich im DAbt_Handler lande, weil wohl irgendwo auf eine 
falsche Adresse zugegriffen wird.
Dies passiert auf jeden Fall nachdem die Task gestartet wurde, und wie 
es scheint wird auch jeder Task einmal aufgerufen.

Aber irgendwie spinnt mein GDB noch ziemlich, ich komm da nicht weiter. 
Ich komme nie bis zu der Stelle an der der DAbt zuschlägt.
Evtl hat ja jemand DIE zündenen Idee :)

von Dirk (barricade) (Gast)


Lesenswert?

1.) BP auf 0x10 DAbt setzen

2.) Dabt zuschlagen lassen

3.) Fehlerstelle suchen mit Unassemble R14-8

4.) BP auf Fehlerstelle setzen

5.) Reset & Run, usw.

Gruß Dirk

von Ing-Dom (Firma: OpenKNX) (sirsydom)


Lesenswert?

Hallo!

Ich bin wieder mal etwas weiter gekommen, uA hab ich die Quelle des DAbt 
gefunden: Die ist je nach Code immer mal woanders - völlig 
undeterministisch.

Was ich aber herausgefunden habe und ich mir überhaupt nich erklären 
kann:
Ich hab nach dem Setup der MAM mal ein paar NOPs eingefügt (war ein 
Tipp). Dabei bemerkte ich folgendes:
Bei 6, 7, 10, 11, und 14 NOPs bekam ich einen DAbt
Bei 8, 9, 12 und 13 NOPs lieg alles wie geschiert!

Was zum Teufel kann das sein???

von Dominic R. (dominic)


Lesenswert?

Hi,

mit welcher Frequenz taktest du den LPC denn? In der LPC2000 Yahoo Group 
gab es mehrere Berichte wonach bestimmte LPC23xx bei höheren Taktraten 
nicht-deterministische Fehler aufweisen.

Auch scheinen Probleme mit dem LPC23x stark vom Produktionszeitpunkt 
abzuhängen - welcher Datecode steht denn auf deinem Chip?

Gruß,

Dominic

von Ing-Dom (Firma: OpenKNX) (sirsydom)


Lesenswert?

Ich hab 2 Keil MCB2300, ich takte mit 72MHz über 12MHz XTAL.
Date Code schaut aus wie ZSG0701-Y (also KW1 2007 ? Na toll, ein 
Neujahrsprozessor :) schlimmer als jedes Montagsauto lol)

Ich probiers mal mit 4MHz und schau was passiert.

von Dominic R. (dominic)


Lesenswert?

Angeblich sollen kein Problem auftreten, wenn der Prozessor mit bis zu 
48MHz getaktet wird. Der letzte Thread zu dem Thema hatte den Titel 
"[lpc2000] Investigation of LPC23xx MAM Issues"

Gruß,

Dominic

von Simon (Gast)


Lesenswert?

Salü!

Gleich mal sorry vorweg: ich habe den Thread nur diagonal durchgelesen. 
Vielleicht macht meine Antwort also hier keinen Sinn.

Deine Aussage :"manchmal auch umgekehrt" machte mich stutzig. Könnte es 
sein, dass es gar nicht an diesen zwei Zeilen liegt?

Ich hatte nämlich bei meinem STM32 ein ähnliches Problem: Plötzlich lief 
nichts mehr, dann irgendwann mal ein "altes" Design geladen, dann war's 
ok, dann das neue wieder drauf, lief auch, dann später nochmals 
probiert, nichts ging, das alte auch nicht mehr, dann plötzlich doch 
wieder...


Die Lösung war ganz einfach: Bei meinem Linkerscript-File hat sich ein 
Fehler eingeschlichen. Der Stack-Pointer (der beim Cortex nach Power-up 
von Adresse 0x0 initialisiert wird), zeigte ins Nirvana.

Wenn ich also das alte Design startete, initialisierte er korrekt. Dann 
flashte ich das neue Design, und es lief. Dann irgendwann probierte ich 
es wieder (power-up) und nichts ging. Dann flashte ich das alte Desing 
-> lief auch nicht, dann, nach einem Reset, plötzlich schon wieder....

Vielleicht ist das ja das Problem...

Gruss
Simon

von Simon (Gast)


Lesenswert?

Scheisse, ich sollte zuerst mal das Datum anschauen..... ups... 
soooorrrryyyy!

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.