Forum: Mikrocontroller und Digitale Elektronik Codevision Flashinhalt in RAM kopieren


von Michael_SS (Gast)


Lesenswert?

Hallo zusammen.

Ich habe da ein kleines Problem.
Ich habe bisher immer Codevision 1.24.2 verwendet für die Programmierung 
und Erzeugung von HEX Files für die ATMEGA64 µC.
Ich habe an Adresse 0xEF00 im Flash Parameter stehen, die der Reihe nach 
einer vorgegeben Struktur abgespeichert sind:

Adressinitianlisierung:

#define CPARAMETER               0xEF00


Definition meiner Struktur:

// parameters
typedef flash struct Par{
        byte CheckSum;             // 1
        byte Mode;                 // 2
        byte Gate1Beg;             // 3
        byte Gate1Wid;             // 4
        byte Gate2Beg;             // 5
        byte Gate2Wid;             // 6
        byte Level1_ScanBegin;     // 7
        byte Level2_ScanEnd;       // 8
        byte Gate1IntUp;           // 9
        byte Gate1IntDn;           //10
        byte Gate2IntUp;           //11
        byte Gate2IntDn;           //12
        byte HoldTime;             //13
        byte Logic;                //14
        byte LogicLevel;           //15
        byte LogicError;           //16
        byte LogicState;           //17
.
.
.
        word Threshold2;           //21
        byte Resolution;           //22
        word Delay;                //24
        byte Energy;               //25
        byte ScanSteps;            //26
        byte ScanFilter;           //27
        word OffsetMinTime;        //29
      } ParameterRecord;

nun defniere ich einen Pointer vom Typ dieser Struktur:

// variables in flash code
struct Par flash *P;


und lasse dann den Pointer P auf die Adresse 0xEF00 zeigen:

P = CPARAMETER;


Das Codevision 3.04 (das neue) welches ich nun verwende akzeptiert das 
nicht mehr und bringt mir die Fehlermeldung:

"a value of type 'unsigned int' can't be assigned to an entity of type 
'flash struct Par *'"

Könnt ihr mir erklären wieso dass nicht mehr funktioniert und was ich 
tun muss, dass es wieder funktioniert?

DAnke schon mal im Voraus

von Wusel D. (stefanfrings_de)


Lesenswert?

Der Type der Variable P stimmt nicht mit dem Typ der Konstante 
CPARAMETER überein. Der Compiler verlangt gleiche Typen wie sowas:
1
int i=3;
2
int j=i;
3
[c/code]
4
Der folgende fehlerhafte Code würde die gleiche Fehlermeldung auslösen, die Du bekommen hast:
5
[code]
6
char c='a';
7
int j=c;
Du kannst die Fehlermeldung durch Typecasting 
(http://www.paprots.com/red-inferno/cplusplus/basic/Typecasting/main.htm) 
unterdrücken.
1
P=(flash struct Par *) CPARAMETER;
Dann kann der Compiler aber nicht mehr prüfen, ob CPARAMETER auf eine 
Struktur vom gleichenTyp zeigt oder irgendwo anders hin. Folgenden 
fehler würde der Compiler nicht bemerken:
1
char[] CPARAMETER="Hallo";
2
struct Par flash *P=CPARAMETER;
Da in Deinem Fall CPARAMETER sowieso eine hardcodierter Pointer ist, 
kann der Compiler ohnehin nicht prüfen, ob die Adresse stimmt. Insofern 
denke ich, dass Typecasting in deinem Fall ausnahmsweise Ok ist.

von Michael_SS (Gast)


Lesenswert?

Okay, Fehlermeldung kommt jetzt nicht mehr. Muss jetzt noch prüfen, ob 
dies auch richtig funktioniert.

Da hast Du mir schon echt weiter geholfen. Vielen Dank dafür.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.