 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
aly Član



Pridružen-a: Tor 28 Sep 2004 14:51 Prispevkov: 9407 Aktiv.: 39.62 Kraj: Kranj - struževo
|
Objavljeno: Pet Avg 05, 2011 1:33 pm Naslov sporočila: |
|
|
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
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  |
|
Nazaj na vrh |
|
 |
. Neznanec

Pridružen-a: Pet 01 Okt 2004 1:17 Prispevkov: 1 Aktiv.: 0.00
|
Objavljeno: Pet Avg 05, 2011 1:44 pm Naslov sporočila: |
|
|
Brisana vsebina odstranjenega uporabnika. |
|
Nazaj na vrh |
|
 |
Umnik Član

Pridružen-a: Čet 16 Sep 2004 17:52 Prispevkov: 958 Aktiv.: 4.03 Kraj: Novo mesto
|
Objavljeno: Pet Avg 05, 2011 1:45 pm Naslov sporočila: |
|
|
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 |
|
 |
chaos Član


Pridružen-a: Sob 16 Sep 2006 22:12 Prispevkov: 1063 Aktiv.: 4.65 Kraj: Zagorje ob Savi
|
Objavljeno: Pet Avg 05, 2011 1:47 pm Naslov sporočila: |
|
|
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 |
|
 |
. Neznanec

Pridružen-a: Pet 01 Okt 2004 1:17 Prispevkov: 1 Aktiv.: 0.00
|
Objavljeno: Pet Avg 05, 2011 1:59 pm Naslov sporočila: |
|
|
Brisana vsebina odstranjenega uporabnika. |
|
Nazaj na vrh |
|
 |
chaos Član


Pridružen-a: Sob 16 Sep 2006 22:12 Prispevkov: 1063 Aktiv.: 4.65 Kraj: Zagorje ob Savi
|
Objavljeno: Pet Avg 05, 2011 2:53 pm Naslov sporočila: |
|
|
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
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 |
|
 |
chaos Član


Pridružen-a: Sob 16 Sep 2006 22:12 Prispevkov: 1063 Aktiv.: 4.65 Kraj: Zagorje ob Savi
|
Objavljeno: Pet Avg 05, 2011 3:07 pm Naslov sporočila: |
|
|
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 |
|
 |
gumby Član


Pridružen-a: Sob 28 Apr 2007 12:32 Prispevkov: 4066 Aktiv.: 18.37
|
Objavljeno: Pet Avg 05, 2011 3:27 pm Naslov sporočila: |
|
|
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 |
|
 |
aly Član



Pridružen-a: Tor 28 Sep 2004 14:51 Prispevkov: 9407 Aktiv.: 39.62 Kraj: Kranj - struževo
|
Objavljeno: Pet Avg 05, 2011 4:02 pm Naslov sporočila: |
|
|
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  |
|
Nazaj na vrh |
|
 |
chaos Član


Pridružen-a: Sob 16 Sep 2006 22:12 Prispevkov: 1063 Aktiv.: 4.65 Kraj: Zagorje ob Savi
|
Objavljeno: Pet Avg 05, 2011 4:09 pm Naslov sporočila: |
|
|
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 |
|
 |
. Neznanec

Pridružen-a: Pet 01 Okt 2004 1:17 Prispevkov: 1 Aktiv.: 0.00
|
Objavljeno: Pet Avg 05, 2011 5:56 pm Naslov sporočila: |
|
|
Brisana vsebina odstranjenega uporabnika. |
|
Nazaj na vrh |
|
 |
aly Član



Pridružen-a: Tor 28 Sep 2004 14:51 Prispevkov: 9407 Aktiv.: 39.62 Kraj: Kranj - struževo
|
Objavljeno: Pet Avg 05, 2011 7:32 pm Naslov sporočila: |
|
|
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  |
|
Nazaj na vrh |
|
 |
Umnik Član

Pridružen-a: Čet 16 Sep 2004 17:52 Prispevkov: 958 Aktiv.: 4.03 Kraj: Novo mesto
|
Objavljeno: Pet Avg 05, 2011 7:47 pm Naslov sporočila: |
|
|
Const is a promise
Umnik je napisal/a: |
Koda: |
Vpisi ((u8 *)Tabela_flash ...); // ena tabela
Vpisi (Tabela_ram ...); // druga tabela
|
|
|
|
Nazaj na vrh |
|
 |
aly Član



Pridružen-a: Tor 28 Sep 2004 14:51 Prispevkov: 9407 Aktiv.: 39.62 Kraj: Kranj - struževo
|
Objavljeno: Čet Avg 11, 2011 11:09 am Naslov sporočila: |
|
|
Š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  |
|
Nazaj na vrh |
|
 |
Umnik Član

Pridružen-a: Čet 16 Sep 2004 17:52 Prispevkov: 958 Aktiv.: 4.03 Kraj: Novo mesto
|
Objavljeno: Čet Avg 11, 2011 11:32 am Naslov sporočila: |
|
|
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? ) |
|
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: 6 dni
Powered by phpBB © 2001, 2005 phpBB Group
|