This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

problem

i use keil arm rvct
and have small problem
RVCT have no #pragma pack(1)
but when i got program from my friend i didnt see this program and RVCT didnt say warning about this command - and i have problem
because this command destroy execute program
for example

#pragma pack(1)

typedef struct
{ unsigned char command; unsigned long packets; unsigned char reserved[3];

} COMMAND2;

int main()
{ COMMAND2 cmd2; unsigned long Size;

cmd2.command = 0x01; cmd2.packets = 1000; Size = cmd2.packets; Size = cmd2.command;
}

when run this program Size <> 1 at the end !!!

undetermine command #pragma pack(1) create error and compiler dont say warning about this command
if correct program for RVTC

typedef __packed struct
{ unsigned char command; unsigned long packets; unsigned char reserved[3];

} COMMAND2;

int main()
{ COMMAND2 cmd2; unsigned long Size;

cmd2.command = 0x01; cmd2.packets = 1000; Size = cmd2.packets; Size = cmd2.command;
}

we will get ok result

Parents
  • ****************************************************
    IDE-Version:
    µVision3 V3.50
    Copyright (c) Keil Elektronik GmbH / Keil Software, Inc. 1995 - 2007

    Tool Version Numbers:
    Toolchain Path: BIN30\
    C Compiler: ARM/Thumb C/C++ Compiler, RVCT3.0 [Build 951] for uVision [Full]
    Assembler: ARM/Thumb Macro Assembler, RVCT3.0 [Build 951] for uVision [Full]
    Linker/Locator: ARM Linker, RVCT3.0 [Build 951] for uVision [Full]
    Librarian: ARM Archiver, RVCT3.0 [Build 951] for uVision
    Hex Converter: ARM FromELF, RVCT3.0 [Build 951] for uVision [Full]
    CPU DLL: SARM.DLL V3.04
    Dialog DLL: DARMP.DLL V1.13
    Target DLL: BIN\UL2ARM.DLL V1.26
    Dialog DLL: TARMP.DLL V1.11f
    ******************************************************

    would you like?
    please
    look at IMPORTANT 17 OPERATOR 17: cmd2.packets = 1000;

    ****************************************************

    #pragma pack(1)
        12: {
        13:         COMMAND2 cmd2;
        14:         unsigned long Size;
        15:
    0x000001B0  E24DD008  SUB       R13,R13,#0x00000008
        16:         cmd2.command = 0x01;
    0x000001B4  E3A00001  MOV       R0,#0x00000001
    0x000001B8  E5CD0000  STRB      R0,[R13]
        17:         cmd2.packets = 1000;
    0x000001BC  E3A00FFA  MOV       R0,#0x000003E8
    0x000001C0  E28DC001  ADD       R12,R13,#0x00000001
    0x000001C4  E58C0000  STR       R0,[R12]
        18:         Size = cmd2.packets;
    0x000001C8  E28DC001  ADD       R12,R13,#0x00000001
    0x000001CC  E59C1000  LDR       R1,[R12]
        19:         Size = cmd2.command;
        20:
        21:
    0x000001D0  E5DD1000  LDRB      R1,[R13]
        22: }
    *****************************************************************
    if
    typedef __packed struct
    {
            unsigned char command;
        unsigned long packets;
        unsigned char reserved[3];
    
    } COMMAND2;
        12: {
        13:         COMMAND2 cmd2;
        14:         unsigned long Size;
        15:
    0x000001B0  E92D401C  STMDB     R13!,{R2-R4,R14}
        16:         cmd2.command = 0x01;
    0x000001B4  E3A00001  MOV       R0,#0x00000001
    0x000001B8  E5CD0000  STRB      R0,[R13]
        17:         cmd2.packets = 1000;
    0x000001BC  E28D1001  ADD       R1,R13,#0x00000001
    0x000001C0  E3A00FFA  MOV       R0,#0x000003E8
    0x000001C4  EB00000E  BL        0x00000204
        18:         Size = cmd2.packets;
    0x000001C8  E28D0001  ADD       R0,R13,#0x00000001
    0x000001CC  EB000004  BL        0x000001E4
    0x000001D0  E1A04000  MOV       R4,R0
        19:         Size = cmd2.command;
        20:
        21:
    0x000001D4  E5DD4000  LDRB      R4,[R13]
        22: }
    ************************************************************************
    have no #pragma
    only for example what must be when compiler will be ignore #pragma
    
        12: {
        13:         COMMAND2 cmd2;
        14:         unsigned long Size;
        15:
    0x000001B0  E24DD00C  SUB       R13,R13,#0x0000000C
        16:         cmd2.command = 0x01;
    0x000001B4  E3A00001  MOV       R0,#0x00000001
    0x000001B8  E5CD0000  STRB      R0,[R13]
        17:         cmd2.packets = 1000;
    0x000001BC  E3A00FFA  MOV       R0,#0x000003E8
    0x000001C0  E58D0004  STR       R0,[R13,#0x0004]
        18:         Size = cmd2.packets;
    0x000001C4  E59D1004  LDR       R1,[R13,#0x0004]
        19:         Size = cmd2.command;
        20:
        21:
    0x000001C8  E5DD1000  LDRB      R1,[R13]
        22: }
    
    

Reply
  • ****************************************************
    IDE-Version:
    µVision3 V3.50
    Copyright (c) Keil Elektronik GmbH / Keil Software, Inc. 1995 - 2007

    Tool Version Numbers:
    Toolchain Path: BIN30\
    C Compiler: ARM/Thumb C/C++ Compiler, RVCT3.0 [Build 951] for uVision [Full]
    Assembler: ARM/Thumb Macro Assembler, RVCT3.0 [Build 951] for uVision [Full]
    Linker/Locator: ARM Linker, RVCT3.0 [Build 951] for uVision [Full]
    Librarian: ARM Archiver, RVCT3.0 [Build 951] for uVision
    Hex Converter: ARM FromELF, RVCT3.0 [Build 951] for uVision [Full]
    CPU DLL: SARM.DLL V3.04
    Dialog DLL: DARMP.DLL V1.13
    Target DLL: BIN\UL2ARM.DLL V1.26
    Dialog DLL: TARMP.DLL V1.11f
    ******************************************************

    would you like?
    please
    look at IMPORTANT 17 OPERATOR 17: cmd2.packets = 1000;

    ****************************************************

    #pragma pack(1)
        12: {
        13:         COMMAND2 cmd2;
        14:         unsigned long Size;
        15:
    0x000001B0  E24DD008  SUB       R13,R13,#0x00000008
        16:         cmd2.command = 0x01;
    0x000001B4  E3A00001  MOV       R0,#0x00000001
    0x000001B8  E5CD0000  STRB      R0,[R13]
        17:         cmd2.packets = 1000;
    0x000001BC  E3A00FFA  MOV       R0,#0x000003E8
    0x000001C0  E28DC001  ADD       R12,R13,#0x00000001
    0x000001C4  E58C0000  STR       R0,[R12]
        18:         Size = cmd2.packets;
    0x000001C8  E28DC001  ADD       R12,R13,#0x00000001
    0x000001CC  E59C1000  LDR       R1,[R12]
        19:         Size = cmd2.command;
        20:
        21:
    0x000001D0  E5DD1000  LDRB      R1,[R13]
        22: }
    *****************************************************************
    if
    typedef __packed struct
    {
            unsigned char command;
        unsigned long packets;
        unsigned char reserved[3];
    
    } COMMAND2;
        12: {
        13:         COMMAND2 cmd2;
        14:         unsigned long Size;
        15:
    0x000001B0  E92D401C  STMDB     R13!,{R2-R4,R14}
        16:         cmd2.command = 0x01;
    0x000001B4  E3A00001  MOV       R0,#0x00000001
    0x000001B8  E5CD0000  STRB      R0,[R13]
        17:         cmd2.packets = 1000;
    0x000001BC  E28D1001  ADD       R1,R13,#0x00000001
    0x000001C0  E3A00FFA  MOV       R0,#0x000003E8
    0x000001C4  EB00000E  BL        0x00000204
        18:         Size = cmd2.packets;
    0x000001C8  E28D0001  ADD       R0,R13,#0x00000001
    0x000001CC  EB000004  BL        0x000001E4
    0x000001D0  E1A04000  MOV       R4,R0
        19:         Size = cmd2.command;
        20:
        21:
    0x000001D4  E5DD4000  LDRB      R4,[R13]
        22: }
    ************************************************************************
    have no #pragma
    only for example what must be when compiler will be ignore #pragma
    
        12: {
        13:         COMMAND2 cmd2;
        14:         unsigned long Size;
        15:
    0x000001B0  E24DD00C  SUB       R13,R13,#0x0000000C
        16:         cmd2.command = 0x01;
    0x000001B4  E3A00001  MOV       R0,#0x00000001
    0x000001B8  E5CD0000  STRB      R0,[R13]
        17:         cmd2.packets = 1000;
    0x000001BC  E3A00FFA  MOV       R0,#0x000003E8
    0x000001C0  E58D0004  STR       R0,[R13,#0x0004]
        18:         Size = cmd2.packets;
    0x000001C4  E59D1004  LDR       R1,[R13,#0x0004]
        19:         Size = cmd2.command;
        20:
        21:
    0x000001C8  E5DD1000  LDRB      R1,[R13]
        22: }
    
    

Children