www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

C volatile

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Programiranje embedded sistemov
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
trot
Član
Član



Pridružen-a: Čet 18 Jan 2007 20:25
Prispevkov: 1270
Aktiv.: 6.07
Kraj: glej fogl

PrispevekObjavljeno: Pet Nov 11, 2016 11:43 am    Naslov sporočila:  C volatile Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Saran
Član
Član



Pridružen-a: Pet 13 Feb 2009 16:26
Prispevkov: 729
Aktiv.: 3.96
Kraj: Zasavje

PrispevekObjavljeno: Pet Nov 11, 2016 9:40 pm    Naslov sporočila:   Odgovori s citatom

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(&REG2, &REG1, 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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
tilz0R
Član
Član



Pridružen-a: Čet 31 Maj 2012 15:39
Prispevkov: 898
Aktiv.: 6.24
Kraj: Črnomelj

PrispevekObjavljeno: Sre Sep 20, 2017 12:43 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Programiranje embedded sistemov Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
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: 47 dni


Powered by phpBB © 2001, 2005 phpBB Group