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:
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.