Für eine mehrsprachige Display-Anzeige habe ich folgendes Speicher Array
definiert (Compiler IAR für AVR):
__flash unsigned char strings[][maxSprachen][LAENGE] = {
{ "go", "los" },
{ "Info", "Info" },
{ "Push", "drücken" }
};
In einer Strucktur möchte ich nun auf die Strings zugreifen. Und dort
anhand der aktuellen Sprache den jeweiligen Text anzeigen. Die
Anzeigefunktion hat diesen Prototyp:
void show_text(unsigned char __flash *t)
typedef struct xxx
{
__flash unsigned char *text[LAENGE]; // geht net !
__flash unsigned char **text; // geht auch net ! aber wie dann?
unsigned char b;
signed char a;
};
Wie muss der Zeiger auf ds mehrspaltige string Array aussehen?
Ich weiß jetzt nicht so recht, ob beim Initialisieren der struct
je nach dann aktueller Sprache ein Text ausgewählt werden soll
(Variante 1), oder ob über die struct ein Text in allen Sprachen
erreichbar sein soll, und erst bei der Ausgabe über die Sprache
entschieden wird, welcher genommen werden soll (Variante 2).
Beides geht (__flash und unsigned mal wegdefiniert, damit ich es
auf dem PC probieren kann):
1
#include<stdio.h>
2
3
#define __flash
4
#define unsigned
5
6
enum
7
{
8
english,
9
deutsch,
10
maxSprachen// immer letzter Eintrag
11
};
12
13
__flashunsignedchar*strings[][maxSprachen]=
14
{
15
{"go","los"},
16
{"Info","Info"},
17
{"Push","drücken"}
18
};
19
20
// In einer Strucktur möchte ich nun auf die Strings zugreifen. Und dort
21
// anhand der aktuellen Sprache den jeweiligen Text anzeigen. Die
22
// Anzeigefunktion hat diesen Prototyp:
23
// void show_text(unsigned char __flash *t)
24
25
26
intaktuelleSprache=english;
27
//int aktuelleSprache = deutsch;
28
29
// Variante 1:
30
// in der struct wird genau ein Text hinterlegt; beim Initialisieren je
31
// nach Sprache und Nummer des Textes anzugeben:
32
voidvariante1()
33
{
34
typedefstructxxx
35
{
36
//__flash unsigned char *text[LAENGE]; // geht net !
37
//__flash unsigned char **text; // geht auch net ! aber wie dann?
Beim anlegen der Struktur dann der Fehler:
Error[Pe144]: a value of type "unsigned char __flash (*)[23]" cannot be
used to initialize an entity of type "unsigned char __flash **" xx.c 5
... 23 ist die LAENGE
Muss beim Testen einen Fehler gemacht haben, die Strings liegen nun in
einer Struktur
1
__flashunsignedchar*stringsNeu[][maxSprachen]
die Struktur passt auch
1
typedefstructxxx
2
{
3
__flashunsignedchar**text;
4
5
unsignedcharb;
6
signedchara;
7
}diestruct_t;
aber beim füllen mit Daten kommt die Fehlermeldung:
Error[Pe144]: a value of type "unsigned char *__flash *" cannot be used
to initialize an entity of type "unsigned char __flash **" xx.c 5
Ich sehe so keinen Fehler.
Allerdings glaube ich auch nicht, hier die ganze Wahrheit zu sehen.
Insbesondere passt auch die Fehlermeldung nicht so recht dazu.
Klaus Wachtler schrieb:
> Halt!>> Ich sehe gerade, daß du die struct ja auch ins Flash packst.> Muss das sein?
Würde ich für vernünftig halten.
Allerdings müssen dann die _flash richtig verteilt sein.
Es gibt immerum die alte Frage: Wer ist denn nun im _flash? Das worauf
der Pointer zeigt, der Pointer selbst oder etwa beide
1
_flashunsignedchar*ptr;// das worauf der Ptr zeigt ist im flash
2
unsignedchar*_flashptr;// der Ptr selbst ist im Flash, nicht
3
// aber die Daten auf die er zeigt
4
_flashunsignedchar*_flashptr;// beides ist im Flash
(zumindest wenn IAR __flash als Modifier wie const auffast, wovon ich
einmal stark ausgehe)
Aber Klaus hat schon recht:
Poste doch bitte endlich einmal einen umfangreicheren Codeabschnitt! Mit
der Microsicht der Dinge ist es schwer den Überblick zu halten, was du
denn nun wirklich konkret gemacht hast.
Karl heinz Buchegger schrieb:
> Klaus Wachtler schrieb:>> Halt!>>>> Ich sehe gerade, daß du die struct ja auch ins Flash packst.>> Muss das sein?>> Würde ich für vernünftig halten.
ich eigentlich auch, aber nur, wenn er weiß was er will und es
konsequent durchhält.
Da ich aber nur den gcc habe und er offenbar nicht, steige ich
sowieso aus, was das Probieren angeht.
> ...
wird mit
Warning[Pa011]: memory attribute duplicated xxx.c 7
gemeldet.
und beim initialsieren kommt:
Error[Pe144]: a value of type "unsigned char *__flash *" cannot be used
to initialize an entity of type "unsigned char __flash *__flash *" xxx.c
5
Bitte, bitte, bitte
Poste mehr Code.
Es bringt nichts, da jetzt immer nur 1 Zeile zu präsentieren mit der
Fehlermeldung dazu.
Das ganze ist in erster Linie erst mal eine Konzeptfrage! Und mir
scheint du schmeisst da jetzt 2 Konzepte grossartig durcheinander.
Zuerst muss das Konzept stehen, dann kümmern wir uns darum es dem
Compiler schmackhaft zu machen. Vorschlag: lass die __flash erst mal
alle beiseite und lege alles im SRAM ab. Und erst dann gehen Teile der
Datenstruktur ins Flash
(Ich hab da irgendwas im Hinterkopf, dass bei IAR so etwas
const char Text = "Hallo Welt";
durch das const sowieso im Flash angelegt wird. Trügt mich da jetzt mein
Gedächtnis?)
> Ein>> __flash unsigned char * __flash stringsNeu[][maxSprachen] = ...>> wird mit> Warning[Pa011]: memory attribute duplicated xxx.c 7> gemeldet.
Dann verhält sich — entgegen meiner und Karl Heinz' Vermutung — __flash
anders als die Standard-Qualifier const und volatile in C :-(
Man müsste jetzt also durch Lesen im Handbuch des IAR oder durch Aus-
probieren herausfinden, was __flash genau macht, wann der Compiler
Daten schon von sich aus ins Flash legt usw.
Beides ist für einen Nicht-IAR-User nicht so leicht ;-)
Aber wie Karl Heinz geschrieben hat: Poste mehr Code, der kompilierfähig
ist (ohne die __flash), damit nicht einer nach langen Bemühungen eine
Lösung findet, die am Ende gar nicht deinen Vorstellungen entspricht :)