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
  • You may want yo try contacting support, however, it appears from other your other thread that removing reentrant helped somewhat.

    The reentrant stacks have worked with no problems for a long time so I'm not sure why it would work under simulation but not on the target.

    Anyway, I think your problem is related to the reentrant stack pointer. Maybe it is getting corrupted somehow.

    Have you included the reentrant keyword in your prototypes for the reentrant routines? For example:

    BYTE process_EraseFlash (
      char *cmdBuffer) reentrant;
    

    This is required to tell other routines that arguments are passed on the reentrant stack.

    Jon

Reply
  • You may want yo try contacting support, however, it appears from other your other thread that removing reentrant helped somewhat.

    The reentrant stacks have worked with no problems for a long time so I'm not sure why it would work under simulation but not on the target.

    Anyway, I think your problem is related to the reentrant stack pointer. Maybe it is getting corrupted somehow.

    Have you included the reentrant keyword in your prototypes for the reentrant routines? For example:

    BYTE process_EraseFlash (
      char *cmdBuffer) reentrant;
    

    This is required to tell other routines that arguments are passed on the reentrant stack.

    Jon

Children