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

Problems with Passing Pointers as Parameters

Okay, I'm trying to pass a pointer to a char buffer to a function. It works fine in the Keil simulator/debugger, but not on the target hardware.

// Variable Declaration
#define MAX_RX_SIZE 100
static char xdata cmdBuffer[MAX_RX_SIZE];

// Calling function
void CallingFunc(void) {
// cmdBuffer is read in from serial
// port and contains "EF"
printf("\r\nP2_CMDFOUND\r\n");
printf(cmdBuffer);

if (!process_EraseFlash(cmdBuffer)) {
printf("\r\nP2_INVALARG\r\n");
printf(cmdBuffer);
printf("\n**invalid arguments");
}
else {
printf("\r\nFcn Success\r\n");
printf(cmdBuffer);
}
}

// Called Function
BYTE process_EraseFlash(char *cmdBuffer) reentrant
{
printf("\r\nP2_CMDEF\r\n");
printf(cmdBuffer);
if (strcmp(cmdBuffer, "EF"))
return FALSE;

if (flash_ChipErase())
printf("\r\nOK");
else
printf("\r\n**Error>\r\n");
return TRUE;
}

Okay, here's the output from the simulator:
P2_CMDFOUND
EF
P2_CMDEF
EF
OK
Fcn Success
EF

And here's the output from the target hardware:
P2_CMDFOUND
EF
P2_CMDEF

P2_INVALARG
EF
**invalid arguments

Looks like the pointer is not being passed to the process function properly, as the process function thinks the buffer is empty.

Any ideas? I'm stuck here.

Thanks,
Chris Beattie

Parents
  • In reply to both your posts...

    I definately think the problems are related, just not sure what's causing it. I'm using a Dallas 87C520 for the actual target hardware and a MetaLink RA-87C530 Emulator. Everything works on the Keil simulator, the errors occur on both the Emulator and target micro.

    I customized the Startup.a51 file as follows:

    IDATALEN	EQU	80H	; the length of IDATA memory in bytes.
    ;
    XDATASTART	EQU	0H	; the absolute start-address of XDATA mem
    XDATALEN	EQU	400H	; the length of XDATA memory in bytes.
    ;
    PDATASTART	EQU	0H	; the absolute start-address of PDATA memory
    PDATALEN	EQU	0H	; the length of PDATA memory in bytes.
    .
    .
    .
    IBPSTACK	EQU	1	; set to 1 if small reentrant is used.
    IBPSTACKTOP	EQU	0FFH+1	; set top of stack to highest location+1.
    ;
    .
    .
    .
    STARTUP1:
    ; Mask all interrupts.  We don't want any interrupts coming in while
    ; we are trying to start up.
    		MOV     IE, #0
    
    ; Specify that internal XDATA exists.
                    ANL     PMR, #0FCh    ; CLEAR DME0 & DME1
                    ORL     PMR, #01h     ; SET DME0
    
    ; Change priority of interrupts
                    SETB    PT1     ; Timer 1 High Priority
    
    ; Select fastest XDATA timing.
                    MOV     CKCON, #00H
    

    Am I doing something wrong? How can I verify that XDATA is working properly?

    Also, the variable is declared in xdata and used in the same .c file as it's declared in just fine, it's only when I pass a pointer to the memory that I get problems:

    Uart.c:
    static char xdata cmdBuffer[MAX_RX_SIZE];
    
    // Calling function
    void CallingFunc(void) {
      // cmdBuffer is read in from serial
      // port and contains "EF"
      printf("\r\nP2_CMDFOUND\r\n");
      printf(cmdBuffer);   // ***WORKS FINE*** Prints "EF"
    
      process_EraseFlash(cmdBuffer);
    }
    

    Commands.c:
    // Called Function
    BYTE process_EraseFlash(char *cmdBuffer) reentrant
    {
      printf("\r\nP2_CMDEF\r\n");
      printf(cmdBuffer);         // ***FAILS*** Prints Blank Line
    }
    

    I'm not sure if it's an XDATA problem or if there's a trick to passing pointers to XDATA or what...

    Chris

Reply
  • In reply to both your posts...

    I definately think the problems are related, just not sure what's causing it. I'm using a Dallas 87C520 for the actual target hardware and a MetaLink RA-87C530 Emulator. Everything works on the Keil simulator, the errors occur on both the Emulator and target micro.

    I customized the Startup.a51 file as follows:

    IDATALEN	EQU	80H	; the length of IDATA memory in bytes.
    ;
    XDATASTART	EQU	0H	; the absolute start-address of XDATA mem
    XDATALEN	EQU	400H	; the length of XDATA memory in bytes.
    ;
    PDATASTART	EQU	0H	; the absolute start-address of PDATA memory
    PDATALEN	EQU	0H	; the length of PDATA memory in bytes.
    .
    .
    .
    IBPSTACK	EQU	1	; set to 1 if small reentrant is used.
    IBPSTACKTOP	EQU	0FFH+1	; set top of stack to highest location+1.
    ;
    .
    .
    .
    STARTUP1:
    ; Mask all interrupts.  We don't want any interrupts coming in while
    ; we are trying to start up.
    		MOV     IE, #0
    
    ; Specify that internal XDATA exists.
                    ANL     PMR, #0FCh    ; CLEAR DME0 & DME1
                    ORL     PMR, #01h     ; SET DME0
    
    ; Change priority of interrupts
                    SETB    PT1     ; Timer 1 High Priority
    
    ; Select fastest XDATA timing.
                    MOV     CKCON, #00H
    

    Am I doing something wrong? How can I verify that XDATA is working properly?

    Also, the variable is declared in xdata and used in the same .c file as it's declared in just fine, it's only when I pass a pointer to the memory that I get problems:

    Uart.c:
    static char xdata cmdBuffer[MAX_RX_SIZE];
    
    // Calling function
    void CallingFunc(void) {
      // cmdBuffer is read in from serial
      // port and contains "EF"
      printf("\r\nP2_CMDFOUND\r\n");
      printf(cmdBuffer);   // ***WORKS FINE*** Prints "EF"
    
      process_EraseFlash(cmdBuffer);
    }
    

    Commands.c:
    // Called Function
    BYTE process_EraseFlash(char *cmdBuffer) reentrant
    {
      printf("\r\nP2_CMDEF\r\n");
      printf(cmdBuffer);         // ***FAILS*** Prints Blank Line
    }
    

    I'm not sure if it's an XDATA problem or if there's a trick to passing pointers to XDATA or what...

    Chris

Children