RTV forum PL | NewsGroups PL

Jak poprawnie zainicjować stałą strukturę z użyciem PROGMEM i PSTR w AVR?

Avr: PROGMEM, PSTR i struktura

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Jak poprawnie zainicjować stałą strukturę z użyciem PROGMEM i PSTR w AVR?

Sebastian Biały
Guest

Sun Aug 07, 2011 10:38 pm   



Witam.

Chce zrobić coś takiego:

struct Data {
const char *foo;
unsigned char a;
};

Data PROGMEM data = { PSTR("Coś"), 4 };

Oczywiscie nie mogę, bo PSTR to jest "__extension__" i można tego używać
chyba tylko jako argumentu funkcji: " statement-expressions are not
allowed outside functions nor in template-argument lists"

W kazdym razie padłem na tym że nie mam jak zainicjować statycznej const
struktury. Chciałbym ja inicjować dokladnie tak jak to widać, tzn w miejscu.

Tak też się nie da:

const char PROGMEM *z = "Inne";

Data PROGMEM data2 = { z, 8 };

Wylatuje z: "error: data2 causes a section type conflict"

Zamiana z const char* na PGM_P tez nic nie pomaga. Co jeszcze powinienem
sprawdzić?

WinAVR-20100110.

Zbych
Guest

Mon Aug 08, 2011 6:00 am   



W dniu 2011-08-08 00:38, Sebastian Biały pisze:
Quote:
Witam.

Chce zrobić coś takiego:

struct Data {
const char *foo;
unsigned char a;
};

Data PROGMEM data = { PSTR("Coś"), 4 };

Oczywiscie nie mogę, bo PSTR to jest "__extension__" i można tego używać
chyba tylko jako argumentu funkcji: " statement-expressions are not
allowed outside functions nor in template-argument lists"

I jest to nawet opisane w FAQ:

http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_rom_array

Quote:
W kazdym razie padłem na tym że nie mam jak zainicjować statycznej const
struktury. Chciałbym ja inicjować dokladnie tak jak to widać, tzn w
miejscu.

Tak też się nie da:

const char PROGMEM *z = "Inne";
Data PROGMEM data2 = { z, 8 };

Wylatuje z: "error: data2 causes a section type conflict"

Zamiana z const char* na PGM_P tez nic nie pomaga. Co jeszcze powinienem
sprawdzić?


U siebie stosuję coś takiego:

static const prog_char cmd_sin_rgb_fast[] = "$sin_rgb_fast#";
[...]

struct{
const prog_char * cmd;
uint8_t len;
uint8_t mode;
}static const PROGMEM cmd_tab[] = {
{cmd_sin_rgb_fast, sizeof(cmd_sin_rgb_fast) - 1, mode_sin_rgb_fast},
[...]
};

i działa.

Sławomir Szczyrba
Guest

Mon Aug 08, 2011 6:58 am   



Take the red pill, Sebastian Biały...
Quote:
Witam.

Chce zrobić coś takiego:

struct Data {
const char *foo;
unsigned char a;
};

Data PROGMEM data = { PSTR("Coś"), 4 };

Oczywiscie nie mogę, bo PSTR to jest "__extension__" i można tego używać
[...]

Spróbuj tak :

#v+
#include <avr/pgmspace.h>

typedef struct{
const char * foo;
unsigned char a;
} Data;

const char const string1[] PROGMEM = "foo.shmoo";

const Data const data PROGMEM = { string1 , 7 };

int main() {
// ...
return 0;
}
#v-

00000026 <string1>:
26: 66 6f 6f 2e 73 68 6d 6f 6f 00 foo.shmoo.

00000031 <data>:
31: 26 00 07 &..


Sławek
--
________ Ej! Zrób światu przysługę! Przestań się cofać, KOLEEEEEŚ!
_/ __/ __/ (słoniowaty)
\__ \__ \_______________________________________________________________
/___/___/ Sławomir Szczyrba steev/AT/hot\dot\pl

Sebastian Biały
Guest

Mon Aug 08, 2011 5:57 pm   



On 2011-08-08 00:38, Sebastian Biały wrote:
Quote:
Witam.
[ciach]

A miało być tak pięknie:

http://std.dkuug.dk/JTC1/SC22/WG14/www/docs/n1021.pdf

Co się stało z tym pomysłem? gcc miało coś implementować.

Zbych
Guest

Mon Aug 08, 2011 7:14 pm   



W dniu 2011-08-08 19:57, Sebastian Biały pisze:
Quote:
On 2011-08-08 00:38, Sebastian Biały wrote:
Witam.
[ciach]

A miało być tak pięknie:

http://std.dkuug.dk/JTC1/SC22/WG14/www/docs/n1021.pdf

Co się stało z tym pomysłem? gcc miało coś implementować.

Niby ma przestrzenie adresowe i są jakieś próby z avr:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49868

http://gcc.gnu.org/ml/gcc/2011-08/msg00164.html

Konop
Guest

Mon Aug 08, 2011 9:09 pm   



Quote:
struct Data {
const char *foo;
unsigned char a;
};

Data PROGMEM data = { PSTR("Coś"), 4 };

Trochę strzelam, bo nie mam teraz jak sprawdzić, ale czy nie zadziała po
prostu:
Data PROGMEM data = {"Coś" , 4};
??

--
Pozdrawiam
Konop

Sebastian Biały
Guest

Mon Aug 08, 2011 9:37 pm   



On 2011-08-08 23:09, Konop wrote:
Quote:
Trochę strzelam, bo nie mam teraz jak sprawdzić, ale czy nie zadziała po
prostu:
Data PROGMEM data = {"Coś" , 4};

Nie, "coś" ląduje w RAM zamiast Flash. We Flash znajdzie się tylko sama
struktura z pointerem.

elektroda NewsGroups Forum Index - Elektronika Polska - Jak poprawnie zainicjować stałą strukturę z użyciem PROGMEM i PSTR w AVR?

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map