Ny på GCC, diverse fågor...

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 6952
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Ny på GCC, diverse fågor...

Inlägg av Marta »

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...
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: Ny på GCC, diverse fågor...

Inlägg av johano »

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)

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;
}
/johan
Användarvisningsbild
baron3d
EF Sponsor
Inlägg: 1339
Blev medlem: 1 oktober 2005, 23:58:43
Ort: Torestorp

Re: Ny på GCC, diverse fågor...

Inlägg av baron3d »

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:

Kod: Markera allt

unsigned long Signature; //let the MCU ignore autodetect junk following enumeration
unsigned char Cmd; //command
unsigned short Position; //start position
måste Position ligga på jämn adress, och gcc paddar med en byte.
SvenW
Inlägg: 1124
Blev medlem: 24 april 2007, 16:23:10
Ort: Göteborg

Re: Ny på GCC, diverse fågor...

Inlägg av SvenW »

Användarvisningsbild
Marta
EF Sponsor
Inlägg: 6952
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: Ny på GCC, diverse fågor...

Inlägg av Marta »

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.
thebolt
Inlägg: 248
Blev medlem: 10 februari 2008, 17:41:40
Ort: Taipei Taiwan

Re: Ny på GCC, diverse fågor...

Inlägg av thebolt »

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.

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;
Användarvisningsbild
ph
Inlägg: 284
Blev medlem: 10 augusti 2008, 20:52:36
Ort: Kävlinge
Kontakt:

Re: Ny på GCC, diverse fågor...

Inlägg av ph »

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.
Användarvisningsbild
Icecap
Inlägg: 26147
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Ny på GCC, diverse fågor...

Inlägg av Icecap »

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:

Kod: Markera allt

typedef struct __attribute__ ((packed))
  {
  ... bla bla bla osv.
  } T_SOMENAME;
och det fungerar.
SvenW
Inlägg: 1124
Blev medlem: 24 april 2007, 16:23:10
Ort: Göteborg

Re: Ny på GCC, diverse fågor...

Inlägg av SvenW »

>>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.
Nerre
Inlägg: 26706
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Ny på GCC, diverse fågor...

Inlägg av Nerre »

Jag antar att det som efterfrågas är specifikt "att gå från Pascal till C", inte att "lära sig C".
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43178
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Ny på GCC, diverse fågor...

Inlägg av sodjan »

Skillnaden känns hårfin... :-)

Man kanske: http://www.cs.gordon.edu/courses/cs320/ ... ascal.html ?
Användarvisningsbild
Icecap
Inlägg: 26147
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Ny på GCC, diverse fågor...

Inlägg av Icecap »

Får hålla med sodjan. Jag bytte från Pascal till C och upplevde att strukturen är nästan identisk.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43178
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Ny på GCC, diverse fågor...

Inlägg av sodjan »

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).
Användarvisningsbild
Icecap
Inlägg: 26147
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Ny på GCC, diverse fågor...

Inlägg av Icecap »

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.
Senast redigerad av Icecap 10 april 2015, 15:30:33, redigerad totalt 1 gång.
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 6952
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: Ny på GCC, diverse fågor...

Inlägg av Marta »

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...
Skriv svar