Ny på GCC, diverse fågor...
Ny på GCC, diverse fågor...
Det är dags för en gammal kärring att försöka C ljuset och kravla sig upp från Pascalträsket och få fast mark under fötterna...
Ibland kommer det att bli tvärnit och då hoppas jag på forumets välvilja för att komma vidare.
Här är den första frågan: GCC accepterar denna struct men säger att attributet "packed" har ignorerats. pragma pack(1); tycker den inte hellre om. Hur skall jag göra istället för att variablerna inte skall läggas på 4 eller 8 bytes boundaries? Den _måste_ ligga i följd för att MCU'n som tar emot blocket skall kunna hantera det.
struct
{
union
{
struct {
unsigned long Signature; //let the MCU ignore autodetect junk following enumeration
unsigned char Cmd; //command
unsigned short Position; //start position
unsigned short Length; //length
unsigned char filler[8];
unsigned short CRC; //-1 init crc-16
unsigned char Data[32]; //data payload
};
unsigned char filler2[63]; //not 64, an USB-transfer has to terminate without a null packet.
};
} CmdBlkT __attribute__ ((packed)) ;
Edit: Blev visst lite tillplattad av forumet, men går nog att följa ändå... "Code" nästa gång...
Ibland kommer det att bli tvärnit och då hoppas jag på forumets välvilja för att komma vidare.
Här är den första frågan: GCC accepterar denna struct men säger att attributet "packed" har ignorerats. pragma pack(1); tycker den inte hellre om. Hur skall jag göra istället för att variablerna inte skall läggas på 4 eller 8 bytes boundaries? Den _måste_ ligga i följd för att MCU'n som tar emot blocket skall kunna hantera det.
struct
{
union
{
struct {
unsigned long Signature; //let the MCU ignore autodetect junk following enumeration
unsigned char Cmd; //command
unsigned short Position; //start position
unsigned short Length; //length
unsigned char filler[8];
unsigned short CRC; //-1 init crc-16
unsigned char Data[32]; //data payload
};
unsigned char filler2[63]; //not 64, an USB-transfer has to terminate without a null packet.
};
} CmdBlkT __attribute__ ((packed)) ;
Edit: Blev visst lite tillplattad av forumet, men går nog att följa ändå... "Code" nästa gång...
Re: Ny på GCC, diverse fågor...
Hm, jag testade med #pragma pack och det funkade bra i GCC (version 4.6.3), nedanstående snutt
skriver snällt ut 63 (och inte 64)
/johan
skriver snällt ut 63 (och inte 64)
Kod: Markera allt
#include <stdio.h>
#pragma pack(push, 1)
struct
{
union
{
struct {
unsigned long Signature; //let the MCU ignore autodetect junk following enumeration
unsigned char Cmd; //command
unsigned short Position; //start position
unsigned short Length; //length
unsigned char filler[8];
unsigned short CRC; //-1 init crc-16
unsigned char Data[32]; //data payload
};
unsigned char filler2[63]; //not 64, an USB-transfer has to terminate without a null packet.
};
} CmdBlkT;
#pragma pack(pop)
int main()
{
printf("%lu", sizeof(CmdBlkT));
return 0;
}
Re: Ny på GCC, diverse fågor...
En long ligger på en adress jämt delbar med 4, i vissa fall räcker det med jämn adress.
En short ligger alltid på en adress jämt delbar med 2 !
Så i sekvensen:
måste Position ligga på jämn adress, och gcc paddar med en byte.
En short ligger alltid på en adress jämt delbar med 2 !
Så i sekvensen:
Kod: Markera allt
unsigned long Signature; //let the MCU ignore autodetect junk following enumeration
unsigned char Cmd; //command
unsigned short Position; //start position
Re: Ny på GCC, diverse fågor...
Fick ordning på det efter att ha låtit det vila en stund. Sk*t bakom tangenterna. #pragma fungerade alldeles utmärkt, det var semikolon efter som halkat med som fick gcc att gnälla.
Efter att ha skrivit ut &variablename på allt i structen så visar det sig att alltning ligger packat precis som det måste göra.
Nästa fråga: Finns det något bra material på nätet att läsa för inbitna Pascalfossil som vill konvertera till C? Engelska är givetvis helt OK.
Efter att ha skrivit ut &variablename på allt i structen så visar det sig att alltning ligger packat precis som det måste göra.
Nästa fråga: Finns det något bra material på nätet att läsa för inbitna Pascalfossil som vill konvertera till C? Engelska är givetvis helt OK.
Re: Ny på GCC, diverse fågor...
Bara för att vara den som är den..
Anledningen att gcc säger att den ignoreras är för att __attribute__ inte gäller på inre typer, dvs den går bara en nivå in i din struct. Din struct innehåller bara en union (i sig lite slöseri med skrivande imo, ge unionen ett namn och använd den istället). För att det ska fungera som du vill behöver du sätta packing på den inre structen, är ju där det spelar roll.
Anledningen att gcc säger att den ignoreras är för att __attribute__ inte gäller på inre typer, dvs den går bara en nivå in i din struct. Din struct innehåller bara en union (i sig lite slöseri med skrivande imo, ge unionen ett namn och använd den istället). För att det ska fungera som du vill behöver du sätta packing på den inre structen, är ju där det spelar roll.
Kod: Markera allt
struct
{
union
{
struct {
unsigned long Signature; //let the MCU ignore autodetect junk following enumeration
unsigned char Cmd; //command
unsigned short Position; //start position
unsigned short Length; //length
unsigned char filler[8];
unsigned short CRC; //-1 init crc-16
unsigned char Data[32]; //data payload
} __attribute__ ((packed));
unsigned char filler2[63]; //not 64, an USB-transfer has to terminate without a null packet.
};
} CmdBlkT;
Re: Ny på GCC, diverse fågor...
Har läst många generella C-böcker men tycker nog den bästa sammanfattande boken är den klassiska "The C Programming Language" . Inte en massa dötext. Annars är "Pointers on C" trevlig.
Re: Ny på GCC, diverse fågor...
Och jag sitter delvist med samma problem och har nu testat lite.
Jag använder typedef varför det inte går att packa när man anger den färdiga variabel. Men jag testade:
och det fungerar.
Jag använder typedef varför det inte går att packa när man anger den färdiga variabel. Men jag testade:
Kod: Markera allt
typedef struct __attribute__ ((packed))
{
... bla bla bla osv.
} T_SOMENAME;
Re: Ny på GCC, diverse fågor...
>>Nästa fråga: Finns det något bra material på nätet att läsa för inbitna Pascalfossil som vill konvertera till C? Engelska är givetvis helt OK.
Hur mycket som helst. Eftersom du inte är nybörjare kan du börja här:
https://gcc.gnu.org/onlinedocs/gcc/
https://www.gnu.org/software/gnu-c-manu ... anual.html
Sedan har jag tipset att använda Gdb och Valgrind.
Det ger en djupare förståelse för hur saker fungerar,
förutom att det är rutinmässiga sätt att hitta fel.
Gdb körs bäst inifrån t.ex Emacs eller IDE.
Och övriga gnutools som:
addr2line ,as, gcov, gprof, nm, objcopy,size, strings ...
Man kan bygga in dem i skripter som man kopplar till sitt IDE.
Och så naturligtvis lint eller splint, men det går inte att göra dem nöjda.
Hur mycket som helst. Eftersom du inte är nybörjare kan du börja här:
https://gcc.gnu.org/onlinedocs/gcc/
https://www.gnu.org/software/gnu-c-manu ... anual.html
Sedan har jag tipset att använda Gdb och Valgrind.
Det ger en djupare förståelse för hur saker fungerar,
förutom att det är rutinmässiga sätt att hitta fel.
Gdb körs bäst inifrån t.ex Emacs eller IDE.
Och övriga gnutools som:
addr2line ,as, gcov, gprof, nm, objcopy,size, strings ...
Man kan bygga in dem i skripter som man kopplar till sitt IDE.
Och så naturligtvis lint eller splint, men det går inte att göra dem nöjda.
Re: Ny på GCC, diverse fågor...
Jag antar att det som efterfrågas är specifikt "att gå från Pascal till C", inte att "lära sig C".
Re: Ny på GCC, diverse fågor...
Får hålla med sodjan. Jag bytte från Pascal till C och upplevde att strukturen är nästan identisk.
Re: Ny på GCC, diverse fågor...
Nej, jag menade att skillnaden mellan "att gå från Pascal till C" och "att lära sig C" är hårfin.
Inte att skillnaden mellan C och Pascal är hårfin i sig (har ingen uppfattning om det).
Inte att skillnaden mellan C och Pascal är hårfin i sig (har ingen uppfattning om det).
Re: Ny på GCC, diverse fågor...
Tak! Detta med __attribute__ ((packed)) har precis löst ett stort problem för mig!
Jag har dock märkt att om man har en struct med struct i måste varje struct ha attributen.
Jag har dock märkt att om man har en struct med struct i måste varje struct ha attributen.
Senast redigerad av Icecap 10 april 2015, 15:30:33, redigerad totalt 1 gång.
Re: Ny på GCC, diverse fågor...
Nu tar Du väl ändå i. Det är verkligen inte som att lära från början och jag har hyfsad vana vid att läsa C. De flesta strukturer har ju sina direkta motsvarigheter. Det enda icke-kompatibla hittils är switch som ju är crap jämfört med Pascal's case.
Det verkligt tunga i det aktuella programmet är att få i/o-hantering mot usb att fungera. Var stökigt innan det fungerade i Pascal och nu är det samma en gång till... Får tillbaka att rätt antal bytes sänts med write, men MCU'n reagerar inte. Har (är det meningen i varje fall) öppnat devicen och initierat den på motsvarande sätt, men vad som verkligen händer vet bara datorn... Skall flasha om för att se om den tar emot blaj eller inget alls innan det blir fler dumma frågor...
Det verkligt tunga i det aktuella programmet är att få i/o-hantering mot usb att fungera. Var stökigt innan det fungerade i Pascal och nu är det samma en gång till... Får tillbaka att rätt antal bytes sänts med write, men MCU'n reagerar inte. Har (är det meningen i varje fall) öppnat devicen och initierat den på motsvarande sätt, men vad som verkligen händer vet bara datorn... Skall flasha om för att se om den tar emot blaj eller inget alls innan det blir fler dumma frågor...