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 

Tabele v RAMu in Flashu (STM32, uVision)
Pojdi na stran 1, 2, 3  Naslednja
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> ARM arhitektura
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
aly
Član
Član



Pridružen-a: Tor 28 Sep 2004 14:51
Prispevkov: 9407
Aktiv.: 39.62
Kraj: Kranj - struževo

PrispevekObjavljeno: Pet Avg 05, 2011 1:33 pm    Naslov sporočila:   Odgovori s citatom

Da še jaz povprašam za nasvet...
Imam več tabel. V RAM-u in v FLASH-u.

Delam funkcijo, ki bi vzela ustrezno tabelo in jo poslala na SPI.
Tabelo bi funkciji podal kot pointer.
Kako pa to gre? Iščem primere po netu, pa mi ne gre najbolje. Torej:

Koda:

const u8 Tabela_flash[] = {0x00,0x00,0x00,0x00,0x00};
u8 Tabela_ram[5];

....

void Vpisi (____________)
  {
  u8 i;
  for(i=0;i<5;i++)
    SPI_I2S_SendData (SPI1, _________);
  }

....

  Vpisi (______);  // ena tabela
  Vpisi (______);  // druga tabela


Prosim če mi lahko kdo pomaga dopolniti manjkajoča polja, da bo delovalo Neutral


Tole sem uspel napisati, pa nisem siguren če bo ok:
Koda:

const u8 Tabela_flash[] = {0x00,0x00,0x00,0x00,0x00};
u8 Tabela_ram[5];

void Vpisi (u8* tabela)
  {
  u8 i;
  for(i=0;i<5;i++)
    SPI_I2S_SendData (SPI1, *(tabela+i));
  }

  Vpisi (Tabela_flash);  // ena tabela
  Vpisi (Tabela_ram);  // druga tabela

ali bi moral dati:
Koda:

  Vpisi (&Tabela_flash);  // ena tabela
  Vpisi (&Tabela_ram);  // druga tabela

_________________
I'm going to stand outside, so if anyone asks, I'm outstanding Smile
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran MSN Messenger - naslov
.
Neznanec
Neznanec



Pridružen-a: Pet 01 Okt 2004 1:17
Prispevkov: 1
Aktiv.: 0.00

PrispevekObjavljeno: Pet Avg 05, 2011 1:44 pm    Naslov sporočila:   Odgovori s citatom

Brisana vsebina odstranjenega uporabnika.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Umnik
Član
Član



Pridružen-a: Čet 16 Sep 2004 17:52
Prispevkov: 958
Aktiv.: 4.03
Kraj: Novo mesto

PrispevekObjavljeno: Pet Avg 05, 2011 1:45 pm    Naslov sporočila:   Odgovori s citatom

Koda:

const u8 Tabela_flash[] = {0x00,0x00,0x00,0x00,0x00};
u8 Tabela_ram[5];

void Vpisi (u8 *table, u32 tableLen) {
  u8 i;

  for(i = 0; i < tableLen; i++)
    SPI_I2S_SendData (SPI1, table[i]);
}

  Vpisi ((u8 *)Tabela_flash, sizeof (Tabela_flash));  // ena tabela
  Vpisi (Tabela_ram, sizeof (Tabela_ram));  // druga tabela



Tako bi jaz naredil.


Nazadnje urejal/a Umnik Pet Avg 05, 2011 1:51 pm; skupaj popravljeno 1 krat
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
chaos
Član
Član



Pridružen-a: Sob 16 Sep 2006 22:12
Prispevkov: 1063
Aktiv.: 4.65
Kraj: Zagorje ob Savi

PrispevekObjavljeno: Pet Avg 05, 2011 1:47 pm    Naslov sporočila:   Odgovori s citatom

Definitivno ne uporabljaj & za array spremenljivko, ki ze sama po sebi predstavlja naslov prvega elementa in se avtomatsko degradira v pointer.

LP!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
.
Neznanec
Neznanec



Pridružen-a: Pet 01 Okt 2004 1:17
Prispevkov: 1
Aktiv.: 0.00

PrispevekObjavljeno: Pet Avg 05, 2011 1:59 pm    Naslov sporočila:   Odgovori s citatom

Brisana vsebina odstranjenega uporabnika.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
chaos
Član
Član



Pridružen-a: Sob 16 Sep 2006 22:12
Prispevkov: 1063
Aktiv.: 4.65
Kraj: Zagorje ob Savi

PrispevekObjavljeno: Pet Avg 05, 2011 2:53 pm    Naslov sporočila:   Odgovori s citatom

Kroko je napisal/a:
Kaj pa to pomeni?


Ko podas array kot parameter funkciji, se ta array avtomaticno spremeni v pointer na prvi element arraya. Kar pa se ne pomeni, da je dejansko spremenljivka, deklarirana kot array, ekvivalentna pointerju. Na hitro:
Koda:

int ar[8]; // pomeni rezervacijo 8 mest v pomnilniku, ar je dejansko naslov prvega elementa
int * ar_p = ar; // pointer na prvi element arraya, s tem da je ar_p 'locena' spremenljivka - ima svoj prostor v pomnilniku

S tem da je ar_p 'modifiable lvalue', ar pa ne. Pa se druge razlike so, pa je prevec za pisat Smile


Citiram:

Oba spodnja primera sta pravilna.


Oba primera sta pravilna, njihov klic pa ne, ravno tako tvoja razlaga. Edini razlog, da klic
Koda:
Vpisi (&Tabela_ram);

deluje je, da prevajalnik preprosto ignorira & - address of operator. Kar je pogosta praksa, in program normalno deluje, ni se pa pametno na tako sintakso navaditi, ker je nepravilna.
Torej funkcija v obeh primerih dobi kazalec na prvi element, in tudi obe verziji funkcije delujeta klicani tako:
Koda:
Vpisi (Tabela_ram);



LP!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
chaos
Član
Član



Pridružen-a: Sob 16 Sep 2006 22:12
Prispevkov: 1063
Aktiv.: 4.65
Kraj: Zagorje ob Savi

PrispevekObjavljeno: Pet Avg 05, 2011 3:07 pm    Naslov sporočila:   Odgovori s citatom

Umnik je napisal/a:
Koda:


  Vpisi ((u8 *)Tabela_flash, sizeof (Tabela_flash));  // ena tabela
  Vpisi (Tabela_ram, sizeof (Tabela_ram));  // druga tabela



Tako bi jaz naredil.


Tukaj bi opozoril, da je treba biti previden, ko z sizeof() zelis izvedeti velikost arraya. V tem primeru, bi bila razlika med sizeof(Tabela_flash) in sizeof(tabela) - ta zadnja bi bila klicana znotraj Vpisi() funkcije. Kot sem ze napisal, se array, podan kot parameter funkciji, spremeni v pointer, torej bi znotraj funkcije sizeof() dejansko vrnil velikost pointerja (kar je npr. 4 bajte za 32-bitne mlincke).

LP!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
gumby
Član
Član



Pridružen-a: Sob 28 Apr 2007 12:32
Prispevkov: 4066
Aktiv.: 18.37

PrispevekObjavljeno: Pet Avg 05, 2011 3:27 pm    Naslov sporočila:   Odgovori s citatom

chaos je napisal/a:
...torej bi znotraj funkcije sizeof() dejansko vrnil velikost pointerja

sizeof() je v klicu funkcije, ne znotraj funkcije...

_________________
Tule nisem več aktiven.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
aly
Član
Član



Pridružen-a: Tor 28 Sep 2004 14:51
Prispevkov: 9407
Aktiv.: 39.62
Kraj: Kranj - struževo

PrispevekObjavljeno: Pet Avg 05, 2011 4:02 pm    Naslov sporočila:   Odgovori s citatom

Takole sem naredil in deluje.
Koda:
void Vpisi (u8* tabela)
  {
  u8 i;

  for(i=0;i<5;i++)
    {
    SPI_I2S_SendData (SPI1, *tabela);
    tabela++;
    }
  }

Vpisi (XY_tabela);

Vse tabele so iste dolžine zato se s prenašanjem velikosti nisem ukvarjal.

Hvala vsem za napotke.
Še eno dumb vprašanje - ali je razlika med:
Koda:
void Vpisi (u8*  tabela)

in
Koda:
void Vpisi (u8  *tabela)

?

_________________
I'm going to stand outside, so if anyone asks, I'm outstanding Smile
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran MSN Messenger - naslov
chaos
Član
Član



Pridružen-a: Sob 16 Sep 2006 22:12
Prispevkov: 1063
Aktiv.: 4.65
Kraj: Zagorje ob Savi

PrispevekObjavljeno: Pet Avg 05, 2011 4:09 pm    Naslov sporočila:   Odgovori s citatom

aly je napisal/a:
ali je razlika med:
Koda:
void Vpisi (u8*  tabela)

in
Koda:
void Vpisi (u8  *tabela)

?


Ne.

Tole :
Koda:
    SPI_I2S_SendData (SPI1, *tabela);
    tabela++;


lahko zapises tudi kot:

Koda:
SPI_I2S_SendData (SPI1, *(tabela++));



LP!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
.
Neznanec
Neznanec



Pridružen-a: Pet 01 Okt 2004 1:17
Prispevkov: 1
Aktiv.: 0.00

PrispevekObjavljeno: Pet Avg 05, 2011 5:56 pm    Naslov sporočila:   Odgovori s citatom

Brisana vsebina odstranjenega uporabnika.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
aly
Član
Član



Pridružen-a: Tor 28 Sep 2004 14:51
Prispevkov: 9407
Aktiv.: 39.62
Kraj: Kranj - struževo

PrispevekObjavljeno: Pet Avg 05, 2011 7:32 pm    Naslov sporočila:   Odgovori s citatom

Ahm, imam pa še en problem... S tabelo iz RAM-a lepo dela, iz Flash-a pa ne gre.

definicija:
Koda:
const u8 Kalibracija_Asic_Flash[] = {0x03,0x02,
void Vpisi (u8* tabela)

uporaba:
Koda:
Vpisi (Tabela_Flash);

napaka:
Citiram:
src\main.c(404): error: #167: argument of type "const u8 *" is incompatible with parameter of type "u8 *"

Kako bi to rešil?

_________________
I'm going to stand outside, so if anyone asks, I'm outstanding Smile
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran MSN Messenger - naslov
Umnik
Član
Član



Pridružen-a: Čet 16 Sep 2004 17:52
Prispevkov: 958
Aktiv.: 4.03
Kraj: Novo mesto

PrispevekObjavljeno: Pet Avg 05, 2011 7:47 pm    Naslov sporočila:   Odgovori s citatom

Const is a promise Mr. Green
Umnik je napisal/a:
Koda:

  Vpisi ((u8 *)Tabela_flash ...);  // ena tabela
  Vpisi (Tabela_ram ...);           // druga tabela

Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
aly
Član
Član



Pridružen-a: Tor 28 Sep 2004 14:51
Prispevkov: 9407
Aktiv.: 39.62
Kraj: Kranj - struževo

PrispevekObjavljeno: Čet Avg 11, 2011 11:09 am    Naslov sporočila:   Odgovori s citatom

Še malo pomoči bi prosil.
kot že prej opisano, imam dve enaki tabeli v Flash in v RAM-u.
V RAMu lahko tabelo spreminjam med delovanjem programa. Potem pa bi jo rad zapisal nazaj v Flash.
Torej, pomoč bi rabil, kako narediti:
- Compiler prepričati, da mi tabelo postavi v določen Page v flash-u, kjer ni nič drugega
- Brisanje in vpis Page-a v Flashu med delovanjem programa

_________________
I'm going to stand outside, so if anyone asks, I'm outstanding Smile
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran MSN Messenger - naslov
Umnik
Član
Član



Pridružen-a: Čet 16 Sep 2004 17:52
Prispevkov: 958
Aktiv.: 4.03
Kraj: Novo mesto

PrispevekObjavljeno: Čet Avg 11, 2011 11:32 am    Naslov sporočila:   Odgovori s citatom

aly je napisal/a:
... kako narediti:
- Compiler prepričati, da mi tabelo postavi v določen Page v flash-u, kjer ni nič drugega
- Brisanje in vpis Page-a v Flashu med delovanjem programa

Tole je pa, žal, compiler specific in hardware specific.

(A po novem je tema v ARM oddelku? Mr. Green)
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> ARM arhitektura Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran 1, 2, 3  Naslednja
Stran 1 od 3

 
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: 6 dni


Powered by phpBB © 2001, 2005 phpBB Group