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

indirect call

Hello

I have a function like this :

static int yaffs_WriteChunkToNAND(struct yaffs_DeviceStruct *dev,int chunkInNAND, const __u8 *data, yaffs_Spare *spare)
{
        .
         .
         .
return dev->writeChunkToNAN(dev,chunkInNAND ,data,spare);
}

dev is a struct like this:

struct yaffs_DeviceStruct
{
int   nBytesPerChunk;
int (*writeChunkToNAND)(struct yaffs_DeviceStruct *dev,int chunkInNAND, const __u8 *data, yaffs_Spare *spare);
int (*readChunkFromNAND)(struct yaffs_DeviceStruct *dev,int chunkInNAND, __u8 *_data, yaffs_Spare *spare);

but when compile this code, there is an error like this:
indirect call: parameters do not fit within registers.

What is couse of thiss error and what is solution?

Parents
  • One of the restrictions on function pointers in Keil C is that the parameters must be able to be passed in registers. The manual will give you details on the calling conventions, but in short: no more than three params, 16 bits or less; one 32-bit value; and possibly one 24-bit pointer (far or generic).

    The example function has four parameters, and so there's no way to fit them all into registers.

    When Keil C spills parameters out of registers, it has to allocate specific places in memory to hold the extras. These would have to be the same addresses for every function that could be called through a function pointer (which might also be called normally, and thus wind up in simultaneously yet another place in another call tree), and the compiler just can't handle that much complexity.

    You can declare your functions to be called via pointer as reentrant, which means parameters passed on the "software stack", and thus avoid this problem.

    You should read app note 129 on function pointers:
    http://www.keil.com/appnotes/docs/apnt_129.asp

Reply
  • One of the restrictions on function pointers in Keil C is that the parameters must be able to be passed in registers. The manual will give you details on the calling conventions, but in short: no more than three params, 16 bits or less; one 32-bit value; and possibly one 24-bit pointer (far or generic).

    The example function has four parameters, and so there's no way to fit them all into registers.

    When Keil C spills parameters out of registers, it has to allocate specific places in memory to hold the extras. These would have to be the same addresses for every function that could be called through a function pointer (which might also be called normally, and thus wind up in simultaneously yet another place in another call tree), and the compiler just can't handle that much complexity.

    You can declare your functions to be called via pointer as reentrant, which means parameters passed on the "software stack", and thus avoid this problem.

    You should read app note 129 on function pointers:
    http://www.keil.com/appnotes/docs/apnt_129.asp

Children