STM32: Initialisierung zwei Programme

Gast #1804140
Lesenswert?

Hallo,

Meine Programmstruktur sieht folgendermaßen aus:
1
int main(void)
2
{
3
   //init clocks, flash, timer, IRQs, USART etc. 
4
   Init();
5
  
6
   if(usereingabe == 1)
7
   {
8
      //-> start zweites programm aus dem flash
9
      jump-to-app2();
10
   }
11
   else
12
   {
13
     //do some other stuff 
14
   } 
15

16
   while(1);
17
}

Wenn die Applikation2 aufgerufen wird (jump-to-app2();), wird wiederum 
die Init() durchgeführt - Initialisierung der Clocks, Flash, Timer etc.;

Somit werden in diesem Fall z.B. die Timer 2x initialisiert - weil ich 
sie im zweiten Programm benötige genauso wie im ersten, wenn die 
else-Anweisung ausgeführt wird.

Kann das zu Schwierigkeiten führen, wenn praktisch dann 2x der Timer4 
vorhanden ist, aber mit verschiedenen Interrupt-Adressen? Bzw. wäre es 
besser im ersten Programm nur die Clocks und den Flash-Zugriff zu 
realisieren und Timer, UARTs etc. erst in der else-Anweisung zu 
initialisieren?

Als Prozessor setze ich einen STM32F103 ein.

Gruß
Johannes
Gast #1804146
Lesenswert?

>Wenn die Applikation2 aufgerufen wird (jump-to-app2();), wird wiederum
>die Init() durchgeführt - Initialisierung der Clocks, Flash, Timer etc.;

Wozu?

>Kann das zu Schwierigkeiten führen, wenn praktisch dann 2x der Timer4
>vorhanden ist, aber mit verschiedenen Interrupt-Adressen?

Autsch!
Gast #1804157
Lesenswert?

holger schrieb:
>>Wenn die Applikation2 aufgerufen wird (jump-to-app2();), wird wiederum
>
>>die Init() durchgeführt - Initialisierung der Clocks, Flash, Timer etc.;
>
>
>
> Wozu?

Naja es sind zwei separate Programme, die für sich einzeln autark sein 
sollen bzw. sind; deshalb besitzen sie auch beide die gleiche 
Initialisierungsroutine.

Allerdings dachte ich mir schon, dass man beim Bootloader (Applikation1) 
vielleicht zu Beginn nur die Clocks und den Flash-Zugriff initialisiert 
und die Timer nur in der else Routine erstellt...

Das sollte dann ja wohl keine Probleme mehr machen, oder?
(Firma: EleLa - www.elela.de) #1805447
Lesenswert?

So geht das:

App 1:
- Initialisierung
- Run
- Deinitialisierung  Deaktivierung Interrupts  Reset der 
HW-Komponenten
- Sprung App2
- Initialisierung aus App2

Aufpassen, wenn die Clocks geändert werden müssen (RCC/PLL...) Im 
Handbuch RM0008 steht geschrieben wie man vorgehen muss.
Gast #1805453
Lesenswert?

Markus Müller schrieb:
> - Deinitialisierung  Deaktivierung Interrupts  Reset der
>
> HW-Komponenten

die Clocks und der Flash-Zugriff sind in beiden Programmen identisch, so 
dass ich es zu Beginn des Programmstarts von Programm1 durchführe und 
danach nicht mehr.

Die Interrupts müssen ja auf eine andere Position gebracht werden (NVIC 
- vector table offset) - Startaddresse des neuen Programms; reicht dass 
oder müssen die auch wirklich noch deaktiviert werden zuvor?
(Firma: EleLa - www.elela.de) #1806467
Lesenswert?

Also ich würde, bevor ich in die neue App springe die alte App erst 
korrekt beenden, also die Interrupts deaktivieren. Denn die neue App 
initialisiert Speicherbereiche, die evt. durch einen falschen 
Interruptaufruf überschrieben werden.
Dann kommen so Fehler wie, bei mir gings immer, aber der Kunde hat 
urplözlich Probleme.

Nicht vergessen: Die Probleme kommen auch immer dann, wenn man selbst im 
urlaub ist und ein Kollege dreht Dir dann 5x den Hals um.

Also, mach es richtig oder gar nicht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren