Hallo Allerseits!
Ich arbeite mit dem uVision von Keil und dem STM32F103VDT6.
Ich habe verschiedene Variablen in einem typedef struct angelegt. Diese
Variablen möchte ich jetzt der gleichen Funktion nacheinander übergeben.
Fehlermeldung:
tsk_functions.c(1234): error: #167: argument of type "int" is
incompatible with parameter of type "tSetup"
compiling flash_functions.c...
flash_functions.c(98): error: #167: argument of type "tSetup" is
incompatible with parameter of type "uint32_t"
Was habe ich noch nicht verstanden? Habe von einem Beispiel aus dem
Forum abgeschaut!
Danke und Gruss!
M.B.
> set_in_Flash(Setup.Nmbr_of_Shttr);
die function will doch die komplette stuct nicht nur ein teil von ihr.
set_in_Flash(Setup);
das ganze ist aber wenig effizent, weil dabei eine kopie der struct
angelegt wird. Hier sollte man mit zeigern oder Referenzen arbeiten.
M. B. schrieb:> tsk_functions.c(1234): error: #167: argument of type "int" is> incompatible with parameter of type "tSetup"
Zeig mal Zeile 1234 und den Prototypen der dort aufgerufenen Funktion.
> compiling flash_functions.c...> flash_functions.c(98): error: #167: argument of type "tSetup" is> incompatible with parameter of type "uint32_t"
Zeig mal Zeile 98 und den Prototypen der dort aufgerufenen Funktion.
Wie würdest Du den das lösen.. ich speichere mehre Variablen ins Flash.
Die Variablen haben unterschiedliche Datentypen. Ich möchte ja nur eine
Funktion erstellen.?
Danke und Gruss!
>> und bei int x = sizeof(tSetup);> fehlt glaube ich noch ein /4, da sizeof die Größe in Bytes zurückgibt> und du sie in int haben willst.
wenn schon dann
sizeof(tSetup)/sizeof(int)
und nicht /4
Allerdings frage ich mich, was der ganze Quatsch soll?
Wenn du sowieso die komplette Struktur sichern willst, warum suchst du
dir dann nicht einen Ersatz für
FLASH_ProgramWord
der eben nicht nur ein Word sondern einen kompletten Speicherbereich
sichern kann?
M. B. schrieb:> Dies wäre natürlich die beste Lösung! Wusste nicht, dass es das gibt!
Ich weiß auch nicht ob es das in deinem System gibt.
Aber das Header File, aus dem die Funktion FLASH_ProgramWord stammt, die
weiß es. Wenn es eine derartige Funktion gibt, dann ist sie dort drinnen
aufgeführt.
Und ja: Auch in Systemheaderfiles darf man mit einem Editor
hineinschauen. Und nochmals ja: es ist nicht verboten die Doku zu seinem
Compiler zu lesen. Denn auch dort steht drinnen, welche Funktionen es
gibt.
Das hier
> Habe von einem Beispiel aus dem Forum abgeschaut!
ist gut um eine Idee zu bekommen. Aber gleich danach steht das Studium
der Hilfe (erste Anlaufstelle) oder des Headerfiles (zweite
Anlaufstelle, wenn man mit der Hilfe alleine nicht weiterkommt)
Karl Heinz Buchegger schrieb:> wenn schon dann>> sizeof(tSetup)/sizeof(int)>> und nicht /4
sollte es nicht besser
sizeof(tSetup)/sizeof(Word)
sein, denn die funktion heist FLASH_ProgramWord
Da gibts keine, die einen Speicherbereich programmiert. Aber sowas kann
man sich mit den vorhandenen Funktionen auch selber schreiben, solange
sizeof(x) eine gerade Zahl ist.
(uint16_t deswegen, weil ich die 'kleinere' Funktion genommen habe. Ist
sichergestellt, dass sizeof(Setup) ein Vielfaches von sizeof(uint32_t)
ist, dann kann man auch auf Word Behandlung ausweichen.
Peter II schrieb:> Karl Heinz Buchegger schrieb:>> wenn schon dann>>>> sizeof(tSetup)/sizeof(int)>>>> und nicht /4>> sollte es nicht besser>> sizeof(tSetup)/sizeof(Word)>> sein, denn die funktion heist FLASH_ProgramWord
Ich weiß nicht, ob es einen Datentyp Word gibt. Wenn ja, wäre das die
bessere Wahl. Aber auch die vorgegebene Program Funktion selber hat
diese Signatur:
FLASH_Status FLASH_ProgramWord (uint32_t Address, uint32_t Data)
Also explizit einen uint32_t als 'Word'
pData wäre Data
entweder ich bin zu blöd um Abzuschreiben oder es hat noch einen
Fehler!?
Fehlermeldung:
flash_functions.c(97): error: #254: type name is not allowed
1
for(size_ti=0;i<DataSize;i++)
flash_functions.c(97): error: #65: expected a ";"
1
for(size_ti=0;i<DataSize;i++)
flash_functions.c(97): error: #20: identifier "i" is undefined
zusammen.
Hier kann Setup unmöglich eine sizeof() von 4 haben.
Hast du da irgendwo noch einen Pointer im Gebälk?
Du musst schon drauf achten:
Nehme ich jetzt die sizeof von einem Strukturobjekt,
oder ist das was ich habe ein Pointer auf so ein Objekt?
70
incomplete type is not allowed
Example:
typedef struct {
unsigned char size;
char string[];
} FOO;
By not declaring a size for the array in the structure, the compiler
is not able to allocate a size of the structure. Incomplete types are
allowed in --c99 mode.
Also, erstmal eine Fehlerquelle nebenbei:
Du hast eine globale Variable namens Setup, die per extern auch an
flash.c/.h weitergegeben wird.
Die Funktion set_in_Flash hat auch einen Parameter namens Setup.
Das ist zwar für den Compiler kein Problem, aber birgt für den Leser
eine Fehlerquelle, die man vermeiden könnte, indem du z.B. in
set_in_Flash das setup klein schreibst.
Und dann fällt auch auf, warum bei
M. B. schrieb:> x = 8476
Scheint zu stimmen, weil:
4Byte float motspd_max; // [mm/s] normal full travelling speed
4Byte float motspd_cal_max; // [mm/s] Reference speed value
4Byte float motspd_inc; // [mm/s] Speed added when ramping up
4Byte float motspd_dec; // [mm/s] Speed added when ramping down
...2100 Elemente vom Typ tMotorCurrentSample sind wohl
4200Bytes MotI_TableCW[TRAV_MAXDIST_SAMPLES]; // = 2100
4200Bytes MotI_TableCCW[TRAV_MAXDIST_SAMPLES];
1Byte BOOL cal_OK;
4Byte int MotDistCal_PulsesMax;
4Byte float MotDistCal_pmm;
wieviele auch immer tPIDparameter PIDpar;
4Byte int ShttrueIdx[CNTSHT];
4Byte int Nmbr_of_Shttr;
4Byte int MotDir;
========
8437+Größe von tPIDparameter
Ziemlich dicker Struct.
tschuessle
Bernhard
Also wenn der struct wirklich die größe hat, wird dir eine memory page
nicht reichen, da brauchst du 5 Stück.
Ist es denn nötig, diese ganzen Informationen in den Flash auszulagern ?
...2100 Elemente vom Typ tMotorCurrentSample sind wohl
4200Bytes MotI_TableCW[TRAV_MAXDIST_SAMPLES]; // = 2100
4200Bytes MotI_TableCCW[TRAV_MAXDIST_SAMPLES];
1Byte BOOL cal_OK;
4Byte int ShttrueIdx[CNTSHT];
4Byte int Nmbr_of_Shttr;
4Byte int MotDir;
So habe es auf das Minimum eingegrenzt, vorerst!
Kann ich die " Tabellen MotI_TableCW[TRAV_MAXDIST_SAMPLES]", die ja
4,2kB gross sind auf 3 Pages verteilen?
Danke und Gruss!
M.B.
Ralf schrieb:> Nachtrag:> Probier mal bittex = sizeof(struct tSetup);bzw.x = sizeof(struct Setup);> Nur so interessehalber...>> Ralf
Als Entschuldige mal, das ist ja kompletter Unsinn.
Bitte Nachlesen Stichwort "typedef"!
speichert in eine Page mit der Startadresse "Address", was passiert,
wenn ich eine 4,2kB grosse Variable so speichere? Die würde ja 3 Pages
benötigen?
Ich gebe ja die Adresse der letzten Page an!
danke und Gruss!
M. B. schrieb:> was passiert,> wenn ich eine 4,2kB grosse Variable so speichere?
Er speichert um genau zu sein ab der Adresse, die du ihm übergibst.
D.h. wenn du bei der drittletzten Page anfängst, wird das auch auf die
letzten 3 pages verteilt.
Aber dafür musst du die Funktion noch so anpassen, dass sie auch die
letzten 3 pages löscht und nicht nur eine.