We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
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
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)
------- 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