Forum: Mikrocontroller und Digitale Elektronik STM32: Initialisierung zwei Programme


von Johannes (Gast)


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

von holger (Gast)


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!

von block (Gast)


Lesenswert?

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

 ^^

durchlesen .. an einen µC denken  .. drüber nachdenken und 
schlussfolgern..

ergebnis =  ??

von Johannes (Gast)


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?

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


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.

von Johannes (Gast)


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?

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


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.

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.