|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
trot Član
Pridružen-a: Čet 18 Jan 2007 20:25 Prispevkov: 1270 Aktiv.: 6.04 Kraj: glej fogl
|
Objavljeno: Pet Nov 11, 2016 11:43 am Naslov sporočila: C volatile |
|
|
Takole imam definirane registre
#define REG1 (*(volatile uint16_t *)(0x0400))
#define REG2 (*(volatile uint16_t *)(0x0600))
Ni mi jasno kako se to dela v primeru arraya.
Rad bi skopiral array 10 registrov od REG1 naprej v 10 registrov od REG2 naprej.
Ali pa da bi array 10 registrov od REG1 skopiral v REG2 (če je REG2 fifo).
Mogoče kdo ve, kako se to v Cju naredi? _________________ lp, Klemen |
|
Nazaj na vrh |
|
|
Saran Član
Pridružen-a: Pet 13 Feb 2009 16:26 Prispevkov: 729 Aktiv.: 3.94 Kraj: Zasavje
|
Objavljeno: Pet Nov 11, 2016 9:40 pm Naslov sporočila: |
|
|
Ne razumem točno vprašanja. Ti bi rad skopiral 10 registrov, ki se začnejo pri adresu REG1 v 10 registrov, ki se začnejo na naslovu REG2?
Bi šlo s kopiranjem spomina direktno?
memcpy(®2, ®1, sizeof(uint16_t) * 10);
Mimo grede: Volatile pomeni samo, da compiler ne sme te spremenljivke oz. konstante odoptimizirati stran. Onesposobi se vsa optimizacija te spremenljivke. To se uporabi takrat, kadar je treba spremenljivko neprekinjeno prebrati ali zapisati. Npr. če imaš 16-bitno spremenljivko, je ta zapisana v dveh bajtih. 8-bitni mikrokrmilniki berejo takšne spremenljivke tako, da najprej preberejo prvi bajt in valuto zapišejo v neko začasno spremenjlivko, nato pa preberejo drugi bajt. Težava se pojavi, ko lahko vmes med branjem pride do prekinitve (interrupt) in nek drugi mehanizem nato spremeni vrednost v tem registru. Ko pa se potem proces branja nadaljuje, pa krmilnik prebere še drugi bajt in sestavi cifro skupaj. Seveda pa je podatek koruptiran, saj je program prebral prvi bajt stare in drugi bajt nove spremenljivke. Da se temu izognemo, je treba med branjem oz. pisanjem volatile spremenljivk onesposobiti interupte.
Vsaj tako je na atmegi oz. arduinotu.
lp _________________ Moja mama je strela, moj fotr je grom. Če hočeš bit moja, prključ se na štrom. |
|
Nazaj na vrh |
|
|
tilz0R Član
Pridružen-a: Čet 31 Maj 2012 15:39 Prispevkov: 898 Aktiv.: 6.20 Kraj: Črnomelj
|
Objavljeno: Sre Sep 20, 2017 12:43 pm Naslov sporočila: |
|
|
Saran je napisal/a: |
....To se uporabi takrat, kadar je treba spremenljivko neprekinjeno prebrati ali zapisati. Npr. če imaš 16-bitno spremenljivko, je ta zapisana v dveh bajtih. 8-bitni mikrokrmilniki berejo takšne spremenljivke tako, da najprej preberejo prvi bajt in valuto zapišejo v neko začasno spremenjlivko, nato pa preberejo drugi bajt. Težava se pojavi, ko lahko vmes med branjem pride do prekinitve (interrupt) in nek drugi mehanizem nato spremeni vrednost v tem registru. Ko pa se potem proces branja nadaljuje, pa krmilnik prebere še drugi bajt in sestavi cifro skupaj. Seveda pa je podatek koruptiran, saj je program prebral prvi bajt stare in drugi bajt nove spremenljivke. Da se temu izognemo, je treba med branjem oz. pisanjem volatile spremenljivk onesposobiti interupte.
Vsaj tako je na atmegi oz. arduinotu.
|
Volatile s tem nima nič. _________________ Knowledge sharing is caring.
majerle.eu | stm32f4-discovery.net |
|
Nazaj na vrh |
|
|
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 77 dni
Powered by phpBB © 2001, 2005 phpBB Group
|