wskaźniki do flash w WinAVR

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From Polish to

Threaded View
WracajB1%c jeszcze do wskaBC%nikF3%w w WinAVR.
Powiedzmy BF%e mam funkcjEA%20
viod funkcja(byte *ptr)
{
char3D%read_pgm_byte(ptr);  // np robi cos takiego
}

A teraz jej wywoB3%anie
funkcja(PSTR("cos do wyB6%wietlenia bez sensu"));
lub tak20%
funkcja(tab);
z tym BF%e20%
prog_char tab[] PROGMEM3D%{"inny tekst"};

Pytanie takie:
1. Czy byte powinno byc typu char czy prog_char?
2. Czy tab powinna mieE6% dwie deklaracje umieszczajB1%ce B3%aF1%cuch we Fl=
ash? czy albo uBF%ywa siEA% prog_char czy albo PROGMEM?

Skoro prog_char jest zmiennB1% z atrybutem PROGMEM to czy naleBF%ny tego u=
BF%ywaE6% podwF3%jnie?
TAk samo wskaBC%nik w funkcji powinien byE6% zmiennB1% to czy deklarowanie =
go jako zmienna bEA%dB1%ca we flash ma sens?

Re: wskaźniki do flash w WinAVR
W dniu 2012-07-25 08:15, slawek7 pisze:
Quoted text here. Click to load it

Powinno być prog_char, albo właściwie const prog_char. Można używać
zdefiniowanego w <avr/pgmspace.h> PGM_P, definicja wygląda tak: #define
PGM_P const prog_char *.

Quoted text here. Click to load it
albo używa się prog_char czy albo PROGMEM?

Można tak:
prog_char tab[] = {"inny tekst"};
albo tak:
char PROGMEM tab[] = {"inny tekst"};

Quoted text here. Click to load it
podwójnie?

Nie.

Quoted text here. Click to load it
zmienna będąca we flash ma sens?
Quoted text here. Click to load it

Wskaźnik powinien wskazywać na stałą w pamięci flash, czyli coś takiego:
const prog_char *ptr
albo prościej
PGM_P ptr

Re: wskaĹşniki do flash w WinAVR
In the darkest hour on Fri, 27 Jul 2012 07:45:33 +0200,
Quoted text here. Click to load it
czy albo używa się prog_char czy albo PROGMEM?
Quoted text here. Click to load it

Nie można ani tak ani tak. W GCC atrybuty dotyczą tylko elementu, przy
którym występują. Dzięki powyższym deklaracjom umieścisz tab w program
space, ale "inny tekst" nadal będzie w data space. Trzeba to zrobić
dwuetapowo:

char string[] PROGMEM = "inny tekst";
PGM_P tab[] PROGMEM = { string };

Odczyt, kopiowanie itp. takich ciągów to już inne zagadnienie.

--
[ Artur M. Piwko : Pipen : AMP29-RIPE : RLU:100918 : From == Trap! : SIG:237B ]
[ 11:14:56 user up 13242 days, 23:09,  1 user, load average: 0.00, 0.28, 0.99 ]

We've slightly trimmed the long signature. Click to see the full one.
Re: wskaĹşniki do flash w WinAVR
<->
Quoted text here. Click to load it

JesteC5%9B pewien? Mam w programie, miC4%99dzy innymi, takC4%85 kostr=
ukcjC4%99:
prog_char znak [12]3D%;=

Gdy zmieniC4%99 deklaracjC4%99 na:
char znak [12]3D%;
to .data roC5%9Bnie dokC5%82adnie o 12 bajtC3%B3w...
Wg tego co piszesz chyba nie powinno.

Pozdrawiam.

Re: wskaĹşniki do flash w WinAVR
In the darkest hour on Fri, 27 Jul 2012 13:40:02 +0200,
Quoted text here. Click to load it

Rozpatrywaliśmy tablicę stringów i tego dotyczyła moja wypowiedź.
Przetestuj podobny przypadek na .

Z tego co widzę (obecnie siedzę w ARM-ach) trochę już się zmieniło
w zakresie prog_charów w avr-gcc - teraz muszę dodawać makro
__PROG_TYPES_COMPAT__ (avr-gcc 4.7.1 i avr-libc 1.8.0-2).

Zrobiłem testy i widzę, że conieco się zmieniło w tej materii.
Obecnie deklaracja tablicy w .text powoduje, że elementy będące
stringami dołączane są do .text.

Dawniej było tak, jak piszą w:
http://www.nongnu.org/avr-libc/user-manual/pgmspace.html

Sekcja: "Storing and Retrieving Strings in the Program Space".

Którą masz wersję gcc i libc? Mógłbyś sprawdzić ten przykład w swojej
wersji (jeśli jest starsza)?

--
[ Artur M. Piwko : Pipen : AMP29-RIPE : RLU:100918 : From == Trap! : SIG:226B ]
[ 18:50:17 user up 13243 days,  6:45,  1 user, load average: 0.01, 0.38, 0.97 ]

We've slightly trimmed the long signature. Click to see the full one.
Re: wskaĹşniki do flash w WinAVR
W dniu 2012-07-27 11:18, Artur M. Piwko pisze:
Quoted text here. Click to load it
czy albo używa się prog_char czy albo PROGMEM?
Quoted text here. Click to load it

Bardzo ciekawe, a niby dlaczego przytoczone przeze mnie przykłady mają
umieszczać "inny tekst" w data space a przytoczone przez kolegę:

char string[] PROGMEM = "inny tekst";

już nie, skoro to jest dokładnie to samo co moje:

prog_char tab[] = {"inny tekst"};
lub
char PROGMEM tab[] = {"inny tekst"};

Nie rozumiem po co dodatkowo tworzyć jednoelementową tablicę wskaźników
do program space, skoro juĹź takim wskaĹşnikiem jest samo string. Czyli w
przytoczonym przez kolegę przykładzie tab[0]=string i możemy skopiować
tekst do zmiennej w data space na 2 sposoby:

char buffer[20];
strcpy_P(buffer, (PGM_P)pgm_read_word(&(tab[0]))); //lub zamiast
&(tab[0]) w tym przypadku można użyć samo tab

lub dużo prościej bez używania tab

char buffer[20];
strcpy_P(buffer, string);

Przytoczony przez kolegę przykład ma sens jeśli chcemy zadeklarować
tablicę wskaźników do kilku stringów w program space. Wtedy taka
konstrukcja:

char *string_table[] PROGMEM =
{
     "String 1",
     "String 2",
     "String 3",
     "String 4",
     "String 5"
};

faktycznie umieści "String 1", "String 2" itd. w data space i w tym
przypadku trzeba zrobić to dwuetapowo:

char string_1[] PROGMEM = "String 1";
char string_2[] PROGMEM = "String 2";
char string_3[] PROGMEM = "String 3";
char string_4[] PROGMEM = "String 4";
char string_5[] PROGMEM = "String 5";

PGM_P string_table[] PROGMEM =
{
     string_1,
     string_2,
     string_3,
     string_4,
     string_5
};

Jednak pytanie w wątku dotyczyło umieszczania jednego stringa w program
space.



Re: wskaĹşniki do flash w WinAVR
In the darkest hour on Mon, 30 Jul 2012 10:45:44 +0200,
Quoted text here. Click to load it

Może wróć do artykułu inicjującego wątek i sprawdź kto pierwszy i gdzie
użył konstrukcji , do której się odnosiłem.

(ciach oczywistości)

--
[ Artur M. Piwko : Pipen : AMP29-RIPE : RLU:100918 : From == Trap! : SIG:229B ]
[ 09:03:49 user up 13246 days, 20:58,  1 user, load average: 0.24, 0.71, 0.80 ]

We've slightly trimmed the long signature. Click to see the full one.

Site Timeline