-
1. Data: 2012-07-25 08:15:04
Temat: wskaźniki do flash w WinAVR
Od: slawek7 <s...@w...pl>
Wracając jeszcze do wskaźników w WinAVR.
Powiedzmy że mam funkcję
viod funkcja(byte *ptr)
{
char=read_pgm_byte(ptr); // np robi cos takiego
}
A teraz jej wywołanie
funkcja(PSTR("cos do wyświetlenia bez sensu"));
lub tak
funkcja(tab);
z tym że
prog_char tab[] PROGMEM={"inny tekst"};
Pytanie takie:
1. Czy byte powinno byc typu char czy prog_char?
2. Czy tab powinna mieć dwie deklaracje umieszczające łańcuch we Flash? czy albo
używa się prog_char czy albo PROGMEM?
Skoro prog_char jest zmienną z atrybutem PROGMEM to czy należny tego używać
podwójnie?
TAk samo wskaźnik w funkcji powinien być zmienną to czy deklarowanie go jako zmienna
będąca we flash ma sens?
-
2. Data: 2012-07-27 07:45:33
Temat: Re: wskaźniki do flash w WinAVR
Od: max441 <m...@w...pl>
W dniu 2012-07-25 08:15, slawek7 pisze:
> Wracając jeszcze do wskaźników w WinAVR.
> Powiedzmy że mam funkcję
> viod funkcja(byte *ptr)
> {
> char=read_pgm_byte(ptr); // np robi cos takiego
> }
>
> A teraz jej wywołanie
> funkcja(PSTR("cos do wyświetlenia bez sensu"));
> lub tak
> funkcja(tab);
> z tym że
> prog_char tab[] PROGMEM={"inny tekst"};
>
> Pytanie takie:
> 1. Czy byte powinno byc typu char czy prog_char?
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 *.
> 2. Czy tab powinna mieć dwie deklaracje umieszczające łańcuch we Flash? czy albo
używa się prog_char czy albo PROGMEM?
Można tak:
prog_char tab[] = {"inny tekst"};
albo tak:
char PROGMEM tab[] = {"inny tekst"};
>
> Skoro prog_char jest zmienną z atrybutem PROGMEM to czy należny tego używać
podwójnie?
Nie.
> TAk samo wskaźnik w funkcji powinien być zmienną to czy deklarowanie go jako
zmienna będąca we flash ma sens?
>
Wskaźnik powinien wskazywać na stałą w pamięci flash, czyli coś takiego:
const prog_char *ptr
albo prościej
PGM_P ptr
-
3. Data: 2012-07-27 11:18:32
Temat: Re: wskaźniki do flash w WinAVR
Od: "Artur M. Piwko" <m...@b...pl>
In the darkest hour on Fri, 27 Jul 2012 07:45:33 +0200,
max441 <m...@w...pl> screamed:
>> 2. Czy tab powinna mieć dwie deklaracje umieszczające łańcuch we Flash? czy albo
używa się prog_char czy albo PROGMEM?
>
> Można tak:
> prog_char tab[] = {"inny tekst"};
> albo tak:
> char PROGMEM tab[] = {"inny tekst"};
>
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 ]
If love is the answer, could you rephrase the question? -- Lilly Tomlin
-
4. Data: 2012-07-27 13:40:02
Temat: Re: wskaźniki do flash w WinAVR
Od: WTK <w...@w...rubikon.pl>
<->
>> Można tak:
>> prog_char tab[] = {"inny tekst"};
>> albo tak:
>> char PROGMEM tab[] = {"inny tekst"};
>>
>
> 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 };
Jesteś pewien? Mam w programie, między innymi, taką kostrukcję:
prog_char znak [12]={'0','1','2','3','4','5','6','7','8','9','*','#
'};
Gdy zmienię deklarację na:
char znak [12]={'0','1','2','3','4','5','6','7','8','9','*','#
'};
to .data rośnie dokładnie o 12 bajtów...
Wg tego co piszesz chyba nie powinno.
Pozdrawiam.
-
5. Data: 2012-07-28 19:03:29
Temat: Re: wskaźniki do flash w WinAVR
Od: "Artur M. Piwko" <m...@b...pl>
In the darkest hour on Fri, 27 Jul 2012 13:40:02 +0200,
WTK <w...@w...rubikon.pl> screamed:
>> 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 };
>
> Jesteś pewien? Mam w programie, między innymi, taką kostrukcję:
> prog_char znak [12]={'0','1','2','3','4','5','6','7','8','9','*','#
'};
> Gdy zmienię deklarację na:
> char znak [12]={'0','1','2','3','4','5','6','7','8','9','*','#
'};
> to .data rośnie dokładnie o 12 bajtów...
> Wg tego co piszesz chyba nie powinno.
>
Rozpatrywaliśmy tablicę stringów i tego dotyczyła moja wypowiedź.
Przetestuj podobny przypadek na {"0","1","2",...}.
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 ]
If you have to ask what jazz is, you'll never know.
-
6. Data: 2012-07-30 10:45:44
Temat: Re: wskaźniki do flash w WinAVR
Od: max441 <m...@w...pl>
W dniu 2012-07-27 11:18, Artur M. Piwko pisze:
> In the darkest hour on Fri, 27 Jul 2012 07:45:33 +0200,
> max441 <m...@w...pl> screamed:
>>> 2. Czy tab powinna mieć dwie deklaracje umieszczające łańcuch we Flash? czy albo
używa się prog_char czy albo PROGMEM?
>>
>> Można tak:
>> prog_char tab[] = {"inny tekst"};
>> albo tak:
>> char PROGMEM tab[] = {"inny tekst"};
>>
>
> 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 };
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.
-
7. Data: 2012-07-31 09:04:53
Temat: Re: wskaźniki do flash w WinAVR
Od: "Artur M. Piwko" <m...@b...pl>
In the darkest hour on Mon, 30 Jul 2012 10:45:44 +0200,
max441 <m...@w...pl> screamed:
> 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:
>
Może wróć do artykułu inicjującego wątek i sprawdź kto pierwszy i gdzie
użył konstrukcji {"foo"}, 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 ]
You had mail, but the super-user read it, and deleted it!