stm32 in delay

programski jeziki in programiranje

Moderator: tilz0R

stm32 in delay

OdgovorNapisal/-a japina » 15 Avg 2016, 11:00

Pišem knjižnico za delay na stm32f030 (Cortex M0), ki podpira tudi RTC (real time clock).
Ali je smiselno delati delay z interupti, kot to dela Tilen Majerle ali raje uporabim RTC?
japina
 
Prispevkov: 270
Pridružen: 28 Jan 2015, 20:16
Kraj: Šentrupert na Dolenjskem
Zahvalil se je: 45 krat
Prejel zahvalo: 20 krat
Uporabnika povabil: aly
Število neizkoriščenih povabil: 4

Re: stm32 in delay

OdgovorNapisal/-a TilenS » 15 Avg 2016, 12:04

Odvisno od dolžine delaya, časa izvajana celotnega programa ter koliko ti je pomembno, da se neka zadeva izvede točno ob nekem času. Jaz za splošne časovne rutine kot so recimo prižiganje ledic, proženje rutin, ki niso časovno kritične,... uporabljam samo en timer, ki ima resolucijo toliko kolikor mi zahteva najbolj časovno zahtevna rutina in potem gledam, kdaj zadeva poteče. Če mi poteče na 10ms potem ponavadi tam še prištevam druge varijable, da pridem do 100ms in 1sec zastavice potem pa z temi zastavicami opravljam vse druge časovne funkcije. Interrupt-a dejansko niti ne rabiš razen, če res imaš neke zadeve katere se morajo narediti točno ob nekem trenutku.

Problem se pojavi pri zelo kratkih delay-ih (resolucije do enega cikla). Recimo z "NOP" si pri 8051 zelo lepo naredil en delay dolg 1 cikel pri ARM se pa stvar zakomplicira.
Zadnjič spremenil TilenS, dne 15 Avg 2016, 12:14, skupaj popravljeno 1 krat.
TilenS
 
Prispevkov: 263
Pridružen: 04 Feb 2015, 23:40
Zahvalil se je: 0 krat
Prejel zahvalo: 40 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 8

Re: stm32 in delay

OdgovorNapisal/-a s54mtb » 15 Avg 2016, 12:09

uporabiš lahko systick
s54mtb
 
Prispevkov: 7084
Pridružen: 15 Jan 2015, 00:10
Zahvalil se je: 915 krat
Prejel zahvalo: 2270 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 48

Re: stm32 in delay

OdgovorNapisal/-a japina » 15 Avg 2016, 13:10

Saj systick uporabljam. No, saj zadeva je že narejena, pa sem pozabil, da sem na začetku dal init_timer() funkcijo in mi ni delalo :D ... koda na https://github.com/japina/timing_lib_m0
japina
 
Prispevkov: 270
Pridružen: 28 Jan 2015, 20:16
Kraj: Šentrupert na Dolenjskem
Zahvalil se je: 45 krat
Prejel zahvalo: 20 krat
Uporabnika povabil: aly
Število neizkoriščenih povabil: 4

Re: stm32 in delay

OdgovorNapisal/-a tilz0R » 16 Avg 2016, 22:39

Jaz (Tilen Majerle) uporabljam Systick timer za delay z ms resolucijo, ter opcijsko drug timer za us resolucijo (brez IRQ). Us se da tudi naštudirat s štetjem ukazov asemblerja ter je odvisno od prevajalnika in optimizacij.
"Words come easy, when they're true!"
Robbie Williams, Gary Barlow
Moj nickname je tilz[NULA]R.
Uporabniški avatar
tilz0R
 
Prispevkov: 1156
Pridružen: 17 Jan 2015, 23:12
Kraj: Črnomelj
Zahvalil se je: 164 krat
Prejel zahvalo: 290 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: stm32 in delay

OdgovorNapisal/-a TilenS » 16 Avg 2016, 23:46

Je pa tečno, da niso v arm v7-m vključili "NOP". Težko prideš do zanesljivega delay-a resolucije parih ciklov.
TilenS
 
Prispevkov: 263
Pridružen: 04 Feb 2015, 23:40
Zahvalil se je: 0 krat
Prejel zahvalo: 40 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 8

Re: stm32 in delay

OdgovorNapisal/-a japina » 17 Avg 2016, 04:53

@tilz0R sem se spraševal, če in kakšen nick imaš na forumu :)
Hvala za odgovor.
japina
 
Prispevkov: 270
Pridružen: 28 Jan 2015, 20:16
Kraj: Šentrupert na Dolenjskem
Zahvalil se je: 45 krat
Prejel zahvalo: 20 krat
Uporabnika povabil: aly
Število neizkoriščenih povabil: 4

Re: stm32 in delay

OdgovorNapisal/-a Kroko » 17 Avg 2016, 09:33

Namesto nop uporabi for zanko in volatile spremenljivko. Se da narediti delat s resolucijo skoraj enega cikla.
http://www.planet-cnc.comKroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 3559
Pridružen: 14 Jan 2015, 11:12
Kraj: Ljubljana
Zahvalil se je: 597 krat
Prejel zahvalo: 1161 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 212

Re: stm32 in delay

OdgovorNapisal/-a tilz0R » 17 Avg 2016, 09:35

Kroko je napisal/-a:Namesto nop uporabi for zanko in volatile spremenljivko. Se da narediti delat s resolucijo skoraj enega cikla.


Žal sem bil razočaram s tem pristopom. MDK-ARM in GCC sta delala različne ASM inštrukcije glede na optimizacije in podobno, koda podobna spodnji:

Koda: Izberi vse
volatile int a = 1000;
while (a--);


Zgornja koda ni vedno trajala isto število inštrukcij, v razloge se nisem poglabljal.
"Words come easy, when they're true!"
Robbie Williams, Gary Barlow
Moj nickname je tilz[NULA]R.
Uporabniški avatar
tilz0R
 
Prispevkov: 1156
Pridružen: 17 Jan 2015, 23:12
Kraj: Črnomelj
Zahvalil se je: 164 krat
Prejel zahvalo: 290 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: stm32 in delay

OdgovorNapisal/-a Kroko » 17 Avg 2016, 09:46

Verjetno tole res ni portabilno. Bi bilo zanimivo ugotoviti zakaj.
Jaz sem sicer za svoje potrebe tole precej dobro uporabil.
http://www.planet-cnc.comKroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 3559
Pridružen: 14 Jan 2015, 11:12
Kraj: Ljubljana
Zahvalil se je: 597 krat
Prejel zahvalo: 1161 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 212

Re: stm32 in delay

OdgovorNapisal/-a tilz0R » 17 Avg 2016, 09:47

Kroko je napisal/-a:Verjetno tole res ni portabilno. Bi bilo zanimivo ugotoviti zakaj.
Jaz sem sicer za svoje potrebe tole precej dobro uporabil.


Rešitev, ki mi pade na pamet je le ta, da se ta del while zanke napiše izključno v ASM. Potem bo zadeva portabilna pomoje.
"Words come easy, when they're true!"
Robbie Williams, Gary Barlow
Moj nickname je tilz[NULA]R.
Uporabniški avatar
tilz0R
 
Prispevkov: 1156
Pridružen: 17 Jan 2015, 23:12
Kraj: Črnomelj
Zahvalil se je: 164 krat
Prejel zahvalo: 290 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: stm32 in delay

OdgovorNapisal/-a mujo » 17 Avg 2016, 10:57

Verjetno je problem v optimizaciji.
Poskusi jo izklopit (#pragma optimize=none)

Indirektno povezano: ARM Cortex jedra (nevem katera vsa!) imajo števec izvedenih ciklov. To je del DWT. Primer uporabe (žal v ruščini, ampak se vidi poanta).
mujo
 
Prispevkov: 675
Pridružen: 21 Jan 2015, 09:50
Kraj: MB
Zahvalil se je: 0 krat
Prejel zahvalo: 140 krat
Uporabnika povabil: VolkD
Število neizkoriščenih povabil: 17

Re: stm32 in delay

OdgovorNapisal/-a tilz0R » 17 Avg 2016, 10:59

mujo je napisal/-a:Verjetno je problem v optimizaciji.
Poskusi jo izklopit (#pragma optimize=none)

Indirektno povezano: ARM Cortex jedra (nevem katera vsa!) imajo števec izvedenih ciklov. To je del DWT. Primer uporabe (žal v ruščini, ampak se vidi poanta).


Jaz uporabljam DWT za "fake" CPU porabo, razmerje med cikli spanja in delovanja.

Klik

CM3/4/7 mislim da imajo samo. Za prvega nisem prepričan, ostala 2 imata zagotovo. Pri CM7 je potrebno v DWT->xxx register vpisat 0xC5ACCE55 vrednost, da se odklene dostop do registrov.
Zadnjič spremenil tilz0R, dne 17 Avg 2016, 11:35, skupaj popravljeno 1 krat.
"Words come easy, when they're true!"
Robbie Williams, Gary Barlow
Moj nickname je tilz[NULA]R.
Uporabniški avatar
tilz0R
 
Prispevkov: 1156
Pridružen: 17 Jan 2015, 23:12
Kraj: Črnomelj
Zahvalil se je: 164 krat
Prejel zahvalo: 290 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: stm32 in delay

OdgovorNapisal/-a mujo » 17 Avg 2016, 11:33

CM3 pa jaz uporabljam in DWT je.
mujo
 
Prispevkov: 675
Pridružen: 21 Jan 2015, 09:50
Kraj: MB
Zahvalil se je: 0 krat
Prejel zahvalo: 140 krat
Uporabnika povabil: VolkD
Število neizkoriščenih povabil: 17


Vrni se na Software

Kdo je na strani

Po forumu brska: 0 registriranih uporabnikov in 1 gost