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

Declare variable in the same location as that of a struct member

Hi All,
Am trying to re-write a code in PLM51 to embedded C.
There is a statement in PLM51 as below.

DECLARE TASK(17) STRUCTURE(PNTR BYTE,STATUS BYTE,DELAY WORD);
DECLARE DELAY_HEAD BYTE AT (.TASK(0).PNTR); //ERROR LINE//

What i have understood from this is-- DELAY_HEAD is a byte variable which resides at the same location as that of TASK(0).PNTR.(From the PLM51 manual)

I have rewritten the same into C as below.

struct tsk
{ unsigned char PNTR ; unsigned char STATUS; unsigned int DELAY;
}TASK[17];
unsigned char DELAY_HEAD _at_ &TASK[0].PNTR ;

But its giving error 221:non-constant case/dim expression.
Plss help..!!

Parents
  • Uncalled Segment, Ignored for Overlay Process
    


    Isn't that obvious?

    Have you checked in your source code - do you think that it should be called from somewhere?

    The C51 manual explains the segment naming conventions - so you can relate the segment name reported by the linker to your source code...

Reply
  • Uncalled Segment, Ignored for Overlay Process
    


    Isn't that obvious?

    Have you checked in your source code - do you think that it should be called from somewhere?

    The C51 manual explains the segment naming conventions - so you can relate the segment name reported by the linker to your source code...

Children
  • Hey,

    I have to initialise a variable called CONTROL1 in code memory and locate the same in fixed address 0x7FFE.I have gone through many forums and the Keil user's guide.I have written as below.

    unsigned int code CONTROL1 = 0xFFFF;
    

    Then,To use the linker BL51,
    I have done it as below.

     Options->(Am using BL51)BL51 locate->Code ?CO?CONTROL1(07FFEh)
    

    Still the error is L110:Cannot find segment.
    Apart from the warning mentioned above.
    The functions mentioned in the warning are called in the program.I have gone through the source code.
    Pls help
    Thanks.

  • But is any part of the program accessing the variable CONTROL1?

  • Hey,
    CONTROL1 is a variable used in one of the functions which would be called in the main loop in the initialisation stage.It is used in the Checksum function.The microcontroller used here is 80552 which is a ROMless version and hence using external EEPROM.
    Thanks.

  • "CONTROL1 is a variable used in one of the functions which would be called in the main loop"

    Why do you say, "would be" there?

    Is it called, or isn't it??

  • Hey,
    Yes,The function(Named as test_hardw) is called in the main loop..!But CONTROL1 is a local variable inside the function,test_hardw.I dont know if that makes a difference.
    CONTROL1 takes the value 0xFFFF and has to be located in code memory location 0x7FFE.

    Thanks

  • Still the error is L110:Cannot find segment.

    And you still haven't checked the obvious: do you have a segment by that name? Look into your map file (perhaps after temporarily removing that special linker directive).

    If you do have such a segment: is that the one your variable is actually in?

  • Hi,
    As you have said,i have removed that linker directive and checked in the MAP file.Its given as here.

    
    SYMBOL TABLE OF MODULE:  mp15 (PMOB)
    VALUE       REP       CLASS    TYPE      SYMBOL NAME
    .....
    LX51 LINKER/LOCATER V3.64
    .....
    
    010030EBH   SYMBOL    CONST    BYTE      MEM_VAL
    00000010H   SYMBOL    IDATA    ---       MEM_PTR
    00000013H   SYMBOL    IDATA    WORD      CHECK
    010030E9H   SYMBOL    CONST    WORD      CONTROL1
    
    
    
    
    BASE START END USED MEMORY CLASS ========================================================== C:000000H C:000000H C:00FFFFH 002F1DH CODE X:000000H X:000000H X:00FFFFH 0001C8H XDATA I:000020H.0 I:000020H.0 I:00002FH.7 000002H.2 BIT C:000000H C:000000H C:00FFFFH 0001BEH CONST I:000000H I:000000H I:0000FFH 00006CH IDATA I:000000H I:000000H I:00007FH 000018H DATA


    In the above table its given CODE memory class range as 0000-FFFF.But my EPROM size is 0000-7FFF.I have given that in the OPTIONS->TARGET->Off-chip CODE Memory as 0x0000,0x8000.Pls check this.

    tHANKS

  • Hey,
    How do i know which linker to use??BL51 or LX51.I am using 80552 microcontroller.

    Thanks

  • So now you have some data, you can start answering the questions I asked. Let's start with: does that segment whose address you were trying to change actually exist in your program?

    Pls check this.

    It's your program. Check it yourself.

    But here's a hint: what might that tickbox "Use Memory Layout from Target Dialog" on the Options->LX51 tab be about?

  • Hi,
    Now i have a doubt ..
    Actually CONTROL1 is a variable used in one of the functions called in the main program called PMOB.c.
    When the linker say CANNOT FIND SEGMENT,does it mean that its searching for a .c file named CONTROL1????
    So i need to create another .c file named CONTROL1.c and then add this variable in that?

    and then give

    
    ?CO?CONTROL(07FFEh)
    
    

    command in Options->BL51 locate CODE TAB??
    I tried making a seperate .c file named CONTROL with the variable CONTROL1 initialised to a value 0xFFFF as below

    
    unsigned int code CONTROL1 = 0xFFFF;
    
    


    But the same variable is used in the function in main module PMOB.c and hence i need to declare it as

    
    extern unsigned int code CONTROL1 = 0xFFFF;
    
    


    in PMOB.c too??
    Then it is giving Error L104 :Multiple Public Definitions and Error 110:Cannot find segment

    Thanks

  • Hey,
    Sorry.."CANNOT FIND SEGMENT" error is resolved for now.But wat do i do for the Error L104:Multiple Public Definitions.
    Pls help
    Thanks

  • When the linker say CANNOT FIND SEGMENT,does it mean that its searching for a .c file named CONTROL1????

    Of course not. It means exactly what it says: it's looking for a segment with that name. How that segment got to have that particular name is up to you to find out. It is spelled out in the documentation, including how you can change it.

    hence i need to declare it

    Yes.

    as

    extern unsigned int code CONTROL1 = 0xFFFF;

    No. That's a definition, not a declaration. If you don't know even that difference, you're in no position to be tinkering with the linker like you're trying to.