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

Locating 2 parameters at the same address

I am using an 8051 (C51/BL51) with no off-chip memory. I have two functions with parameters:

void Detect( U8 iLed )

and

static U8 INHSampleHandler( U16 u16Sample )


Now I understand that Keil will allocate a variable (in DATA) for these. The problem seems to be that the locator is using the same memory location for both. I cannot understand why.

Below are excerpts from the scratchpad showing 2 "D:0026H". These are the only places these symbols are declared. Any ideas what I'm doing wrong?

Thanks,
Jeff

BL51 BANKED LINKER/LOCATER V5.12              07/14/2011  09:36:23  PAGE 1


BL51 BANKED LINKER/LOCATER V5.12, INVOKED BY:
Z:\TOOLS\SOFTWARE\KEIL\BL51.EXE Z:\Software\FB_CPU_Init.obj,
>> Z:\Software\Settings.obj, Z:\Software\Glo
>> bals.obj, Z:\Software\Devices\Clock.obj, Z:\ 
>> Software\Devices\Flash.obj, Z:\Software\Devices\HMI.obj
>> , Z:\Software\Devices\INH.obj, Z:\ 
>> Software\Devices\ADC.obj, Z:\Software\Devices\Timer.obj, Z
>> :\Software\Builds\TestINH - 06-00039-21-09\Main.obj
>> , Z:\Software\Test\Test_Button.obj, Z:\So
>> ftware\Builds\TestINH - 06-00039-21-09\Version.obj TO Z:\ 
>> Software\Builds\TestINH - 06-00039-21-09\06-00039-21-09-xx.wsp
>>  RS (256) PL (68) PW (78) XDATA (?XD?SETTINGS (0X0)) CODE (?CO?VERSION (0X7
>> FC0))


MEMORY MODEL: SMALL

Deleted for brevity

  -------         PROC          _INHSAMPLEHANDLER
  D:0026H         SYMBOL        u16Sample
  C:0BF1H         LINE#         150
  C:0BF5H         LINE#         151
  C:0BF5H         LINE#         207
  C:0BF7H         LINE#         208
  -------         ENDPROC       _INHSAMPLEHANDLER
  -------         ENDMOD        INH

Deleted for brevity

  C:09FEH         PUBLIC        _Detect
  C:074EH         PUBLIC        main
  -------         PROC          _DETECT
  D:0026H         SYMBOL        iLed

Parents
  • Another thing is to disable passing parameters in registers, and make sure that the functions do something:

    #pragma NOREGPARMS
    #include "c8051f9xx.h"
    
    typedef unsigned char U8;
    typedef unsigned int U16;
    
    U8 Sub1(  U8 SubVar1 )          // No 'volatile'
    {
            SubVar1 = SubVar1 + 1;
            return SubVar1;
    }
    
    U8 Sub2(  U8 SubVar2 )          // No 'volatile'
    {
            SubVar2 = SubVar2 + 1;
            return SubVar2;
    }
    
    
    void main(void)
    {
            while(1)
            {
                    Sub1( 13 );
            }
    }
    
    
    static void ADC_ISR(void) interrupt 10
    {
            U16 u16Result = 12;
            Sub2( u16Result );
            ADC0CN &= ~0x20;
    }
    

    Which then gives:

                 ; FUNCTION Sub1 (BEGIN)
                                               ; SOURCE LINE # 7
                                               ; SOURCE LINE # 8
                                               ; SOURCE LINE # 9
    0000 0500        R     INC     SubVar1
                                               ; SOURCE LINE # 10
    0002 AF00        R     MOV     R7,SubVar1
                                               ; SOURCE LINE # 11
    0004         ?C0001:
    0004 22                RET
                 ; FUNCTION Sub1 (END)
    
                 ; FUNCTION Sub2 (BEGIN)
                                               ; SOURCE LINE # 13
                                               ; SOURCE LINE # 14
                                               ; SOURCE LINE # 15
    0000 0500        R     INC     SubVar2
                                               ; SOURCE LINE # 16
    0002 AF00        R     MOV     R7,SubVar2
                                               ; SOURCE LINE # 17
    0004         ?C0002:
    0004 22                RET
                 ; FUNCTION Sub2 (END)
    

    and

    -------         MODULE        OVERLAY
      C:0000H         SYMBOL        _ICE_DUMMY_
      D:00E8H         PUBLIC        ADC0CN
      D:00A8H         PUBLIC        IE
      C:0003H         SYMBOL        ADC_ISR
      D:00B8H         PUBLIC        IP
      C:0024H         PUBLIC        main
      D:0088H         PUBLIC        TCON
      C:002CH         PUBLIC        Sub1
      C:0031H         PUBLIC        Sub2
      D:0098H         PUBLIC        SCON0
      D:00D0H         PUBLIC        PSW
      -------         PROC          SUB1
      D:0008H         SYMBOL        SubVar1
      C:002CH         LINE#         7
      C:002CH         LINE#         8
      C:002CH         LINE#         9
      C:002EH         LINE#         10
      C:0030H         LINE#         11
      -------         ENDPROC       SUB1
      -------         PROC          SUB2
      D:0009H         SYMBOL        SubVar2
      C:0031H         LINE#         13
      C:0031H         LINE#         14
      C:0031H         LINE#         15
      C:0033H         LINE#         16
      C:0035H         LINE#         17
      -------         ENDPROC       SUB2
    
    

Reply
  • Another thing is to disable passing parameters in registers, and make sure that the functions do something:

    #pragma NOREGPARMS
    #include "c8051f9xx.h"
    
    typedef unsigned char U8;
    typedef unsigned int U16;
    
    U8 Sub1(  U8 SubVar1 )          // No 'volatile'
    {
            SubVar1 = SubVar1 + 1;
            return SubVar1;
    }
    
    U8 Sub2(  U8 SubVar2 )          // No 'volatile'
    {
            SubVar2 = SubVar2 + 1;
            return SubVar2;
    }
    
    
    void main(void)
    {
            while(1)
            {
                    Sub1( 13 );
            }
    }
    
    
    static void ADC_ISR(void) interrupt 10
    {
            U16 u16Result = 12;
            Sub2( u16Result );
            ADC0CN &= ~0x20;
    }
    

    Which then gives:

                 ; FUNCTION Sub1 (BEGIN)
                                               ; SOURCE LINE # 7
                                               ; SOURCE LINE # 8
                                               ; SOURCE LINE # 9
    0000 0500        R     INC     SubVar1
                                               ; SOURCE LINE # 10
    0002 AF00        R     MOV     R7,SubVar1
                                               ; SOURCE LINE # 11
    0004         ?C0001:
    0004 22                RET
                 ; FUNCTION Sub1 (END)
    
                 ; FUNCTION Sub2 (BEGIN)
                                               ; SOURCE LINE # 13
                                               ; SOURCE LINE # 14
                                               ; SOURCE LINE # 15
    0000 0500        R     INC     SubVar2
                                               ; SOURCE LINE # 16
    0002 AF00        R     MOV     R7,SubVar2
                                               ; SOURCE LINE # 17
    0004         ?C0002:
    0004 22                RET
                 ; FUNCTION Sub2 (END)
    

    and

    -------         MODULE        OVERLAY
      C:0000H         SYMBOL        _ICE_DUMMY_
      D:00E8H         PUBLIC        ADC0CN
      D:00A8H         PUBLIC        IE
      C:0003H         SYMBOL        ADC_ISR
      D:00B8H         PUBLIC        IP
      C:0024H         PUBLIC        main
      D:0088H         PUBLIC        TCON
      C:002CH         PUBLIC        Sub1
      C:0031H         PUBLIC        Sub2
      D:0098H         PUBLIC        SCON0
      D:00D0H         PUBLIC        PSW
      -------         PROC          SUB1
      D:0008H         SYMBOL        SubVar1
      C:002CH         LINE#         7
      C:002CH         LINE#         8
      C:002CH         LINE#         9
      C:002EH         LINE#         10
      C:0030H         LINE#         11
      -------         ENDPROC       SUB1
      -------         PROC          SUB2
      D:0009H         SYMBOL        SubVar2
      C:0031H         LINE#         13
      C:0031H         LINE#         14
      C:0031H         LINE#         15
      C:0033H         LINE#         16
      C:0035H         LINE#         17
      -------         ENDPROC       SUB2
    
    

Children
No data