Forum: Mikrocontroller und Digitale Elektronik Nochmal STM32F4, IAP und Set Vector Table


von Kai (Gast)


Lesenswert?

Ich musste mein Programm leider auf eine andere IDE portieren, dabei ist 
wohl leider einiges schief gelaufen. Ich kann zwar in den anderen 
Speicherbereich springen, aber das Programm friert dann direkt ein. Das 
deutet wohl auf falsche Übergabe der Vector Table hin. Hier mal mein 
Code, der eigentlich auch nur Standard Programmcode ist:

typedef void (*pFunction)(void);
pFunction Jump_To_Application;

uint32_t ApplicationAddress;
uint32_t JumpAddress;
uint32_t VectTabOffset;

JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);
Jump_To_Application = (pFunction) JumpAddress;
NVIC_SetVectorTable(NVIC_VectTab_FLASH, (uint32_t)VectTabOffset);
__set_MSP(*(__IO uint32_t*) ApplicationAddress);
Jump_To_Application();


Was mache ich falsch?

von Jim M. (turboj)


Lesenswert?

Könntest Du das Thumb Bit vergessen haben?

Die konkreten Werte der Variablen wären auch interessant.

von Herbert (Gast)


Lesenswert?

Was hat die IDE mit dem Fehler im Programm zu tun?
Ist der Code beim Wechseln der IDE verloren gegangen?
Oder hat die IDE andere Compiler/Linker/-Parameter,
legt also den Code vielleicht wo anders hin?

von Gerhard O. (gerhard_)


Lesenswert?

Herbert schrieb:
> Was hat die IDE mit dem Fehler im Programm zu tun?
> Ist der Code beim Wechseln der IDE verloren gegangen?
> Oder hat die IDE andere Compiler/Linker/-Parameter,
> legt also den Code vielleicht wo anders hin?

Beim Wechsel von Atollic Lite auf Coocox ist es mir genauso gegangen 
weil Coocox seine eigenen Linker Script verwenden wollte und eigenen 
CMSIS Libraries. Durch zwei kleine Einstellungen in Coocox funktionierte 
danach alles richtig und die Original Projekt Datei Struktur (Libraries, 
Linker Script, Startup files, CMSIS, Librray Path) konnte beibehalten 
werden so dass man dann ohne Änderungen wieder auf Atollic umsteigen 
kann/könnte. Mir war es wichtig dass beide Tool Chains die gleichen 
Startup files, Linker Script und CMSIS Libraries benutzen und es 
funktioniert alles 100%.


Gerhard

von Kai (Gast)


Lesenswert?

Herbert schrieb:
> Was hat die IDE mit dem Fehler im Programm zu tun?
> Ist der Code beim Wechseln der IDE verloren gegangen?
> Oder hat die IDE andere Compiler/Linker/-Parameter,
> legt also den Code vielleicht wo anders hin?

Vorher habe ich mit Eclipse gearbeitet, jetzt mit Keil uVision. D.h. 
vorher hatte ich Linker- und Makefiles, jetzt muss ich die Werte per GUI 
einpflegen. Ich habe das so vorgesetzt bekommen und normal funktionieren 
alle Abhängigkeiten. Den Teil mit der Sprungfunktion bearbeite ich 
allerdings als Einziger und Erster, damit hat hier keiner Erfahrungen.

Könnte auch gut sein, dass ich das AXF-file, das ich vorher testweise 
geflasht habe, an die falsche Stelle gesetzt habe.

von Kai (Gast)


Lesenswert?

Jim Meba schrieb:
> Könntest Du das Thumb Bit vergessen haben?

Nochmal bitte für Fast-Anfänger. Ich mache das ganze noch nicht allzu 
lange. Ich habe mich einfach an die entsprechenden Dokumente von ST zu 
IAP gehalten.

> Die konkreten Werte der Variablen wären auch interessant.

Wird per Funktionsaufruf übergeben. Ich mache dann ein switch...case. 
Z.B. jemand möchte das Image in Sektor 3 des Flash schreiben, steht da:

  case 3:
    ApplicationAddress = 0x0800C000;
    VectTabOffset = 0xC000;
  break;

JumpAddress errechnet sich ja dann aus ApplicationAddress.

von W.S. (Gast)


Lesenswert?

Kai schrieb:
> Ich musste mein Programm leider auf eine andere IDE portieren,

Dann mach es doch so wie ich: schreib dir ne Batchdatei mit allen 
nötigen Compiler- Assembler- und Linkeraufrufen und fertig ist das 
Ganze. Mit sowas bist du schlichtweg völlig unabhängig von irgendeiner 
IDE.

Aber mal zur Sache selbst: Du benutzt den GCC, ja? Ich hatte vor einiger 
Zeit mich mal über subtile Macken dieses Compilers geärgert: 
Sprungadressen, also Labels in einem Stück Thumb Code hatte er mir 
schlichtweg als ARM-Adressen in den Objektcode gebaut und der Linker 
hatte dann natürlich Interworkingcode dazwischengesetzt --> Absturz. 
Abhilfe schaffte nur ein weiterer Schalter (war wohl -thumbfunction oder 
so ähnlich..) und wehe man hat das vergessen. Vielleicht hast du hier 
irgendein artverwandtes Problem. Hast du IDA? Dann guck dir mal den 
erzeugten Code ganauer an.

W.S.

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.