C++ in instantiziranje razredov

Moderator: tilz0R

C++ in instantiziranje razredov

OdgovorNapisal/-a Kroko » 21 Feb 2018, 22:32

Koda: Izberi vse
class MyClass
{
  public:
   MyClass()
  {
    printf("freq1 = %d", HAL_RCC_GetSysClockFreq);
  }
};

MyClass myclass;

int main()
{
  HAL_Init();
  SystemClock_Config();
  printf("freq2 = %d", HAL_RCC_GetSysClockFreq);
  while(1)
  {
  }
}


Sklepam, da freq1 ni to, kar želim. Je kakšna finta da instantizacijo razredov izvedem šele po inicializaciji hardwera?
http://www.planet-cnc.comKroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 3866
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 613 krat
Prejel zahvalo: 1244 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 228

Re: C++ in instantiziranje razredov

OdgovorNapisal/-a blasny » 22 Feb 2018, 21:18

blasny
 
Prispevkov: 247
Pridružen: 18 Jan 2015, 16:48
Zahvalil se je: 185 krat
Prejel zahvalo: 64 krat
Uporabnika povabil: VolkD
Število neizkoriščenih povabil: 9

Re: C++ in instantiziranje razredov

OdgovorNapisal/-a Kroko » 22 Feb 2018, 23:41

Ja, saj tako imam. Ampak mislim, da bi programer moral nad tem imeti nadzor in sprašujem, če kdo ve, kdaj se zgodi?

Ker če pogledava reset handler:
Koda: Izberi vse
Reset_Handler    PROC
                 EXPORT  Reset_Handler             [WEAK]
        IMPORT  SystemInit
        IMPORT  __main

                 LDR     R0, =SystemInit
                 BLX     R0
                 LDR     R0, =__main
                 BX      R0
                 ENDP

je SystemInit klican pred __main. __main je po moje "čarovnija" v kateri se zgodi instantizacija. Če je to res bi bilo smiselno spremeniti reset handler takole:
Koda: Izberi vse
Reset_Handler    PROC
                 EXPORT  Reset_Handler             [WEAK]
        IMPORT  SystemInit
      IMPORT  HAL_Init   
      IMPORT  SystemClock_Config
        IMPORT  __main

                 LDR     R0, =SystemInit
                 BLX     R0
                 LDR     R0, =HAL_Init
                 BLX     R0               
                 LDR     R0, =SystemClock_Config
                 BLX     R0            
                 LDR     R0, =__main
                 BX      R0
                 ENDP
http://www.planet-cnc.comKroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 3866
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 613 krat
Prejel zahvalo: 1244 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 228

Re: C++ in instantiziranje razredov

OdgovorNapisal/-a tilz0R » 23 Feb 2018, 01:02

Kroko, specifično za Keil:

1. System Init,
2. __main,
2.1. Inicializacija spremenljivk na default
2.2. Prava main funkcija

Drugače pa ti namenoma printaš naslov HAL_RCC_Get... funkcije? Ali bi rad vrednost neke spremenljivke?

Specifično za tvoj primer. SystemInit že nastavi neko default vrednost spremenljivke, tako da kar ti printaš je veljavno.
Kasneje, ko pa kličeš SystemClock_Config funkcijo, se pa to spremeni. Tvoja nadgradnja v ASM ti omogoča, da ko prideš v main si popolnoma ready za delo.

Vprašanje je, koliko je pametno vključevat interrupte, dokler nisi popolnoma v mainu.
Knowledge sharing is people' caring., T. MAJERLE
Uporabniški avatar
tilz0R
 
Prispevkov: 1369
Pridružen: 18 Jan 2015, 00:12
Kraj: Črnomelj
Zahvalil se je: 180 krat
Prejel zahvalo: 340 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: C++ in instantiziranje razredov

OdgovorNapisal/-a Kroko » 23 Feb 2018, 01:45

SystemClock_Config nastavlja ure. Gre zato, da dokler ure niso nastavljene tečejo narobe. Kaj se zgodi v primeru, če uporabljam zunanji ram, ure pa ne delajo kot bi morale?
http://www.planet-cnc.comKroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 3866
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 613 krat
Prejel zahvalo: 1244 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 228

Re: C++ in instantiziranje razredov

OdgovorNapisal/-a eboc » 23 Feb 2018, 12:38

Ce prav razumem problem.
Kreiraj objek na kopici (heap) in ga potem tudi ne pozabi izbrisati.

torej
// init HW
MyClass *myclass = new MyClass ();

....

delte myclass;

ali pa kaj v tem smislu (se poigras s scope) ker mogoce ni najlepse ...
// init HW
if(1){
MyClass myclass;
//ko gre ven iz if (scope) se objekt izbrise ...
}
Zadnjič spremenil eboc, dne 23 Feb 2018, 12:49, skupaj popravljeno 1 krat.
eboc
 
Prispevkov: 145
Pridružen: 19 Jan 2015, 11:12
Zahvalil se je: 52 krat
Prejel zahvalo: 26 krat
Uporabnika povabil: VolkD
Število neizkoriščenih povabil: 8

Re: C++ in instantiziranje razredov

OdgovorNapisal/-a tilz0R » 23 Feb 2018, 12:40

Če uporabljaš zunanji RAM in če ura ni točna, lahko da ram ne bo delal. Odvisno od RAM-a.

eboc, new in delete ukaza bi morala biti prepovedana na MCU :)
Knowledge sharing is people' caring., T. MAJERLE
Uporabniški avatar
tilz0R
 
Prispevkov: 1369
Pridružen: 18 Jan 2015, 00:12
Kraj: Črnomelj
Zahvalil se je: 180 krat
Prejel zahvalo: 340 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255


Vrni se na C in sorodni jeziki

Kdo je na strani

Po forumu brska: 0 registriranih uporabnikov in 1 gost