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

Compiling differences between C51 v7.03 and v8.06

Hello!

I have uVision that compiles fine with the C51 v7.03 compiler and the related package, but not complete with the 8.06. I used two different Keil installations. All files are in the same folder.

In the 8.06 I get linker errors like "object does not fit in to pdata page" and "0080H". This looks like the compiler was thinking the PDATA was only 128 bytes, but it is set to 256 bytes in the startup.a51. Any clue what's different in the newer Keil package?

Also there is a warning in 8.06 (which does not show in 7.03) "converting non-pointer to pointer" on this

ptr_xdata = sPtr_obj->Adresse;


while the vars are set like this:

uchar uc_set_obj( uchar pdata *ptr_Set)
{
   uchar i;
   uchar xdata *ptr_xdata;
   struct stOBJADR code *sPtr_obj;

   sPtr_obj=&Obj[*ptr_Set];
   .
   .
   .
   ptr_xdata = sPtr_obj->Adresse;
}


The struct stOBJADR has a member "uint Adresse;"

I can see no wrong use of the pointers. I just want to be sure that the warning does not affect the code to not work correctly.

Parents
  • So if you're setting a pointer address, you should always use an uint value

    Not true. intptr_t is the integer type wide enough to hold a pointer; ptrdiff_t is the type wide enough to hold a difference of two pointers. Neither one is necessarily the same as an unsigned int.

    Compilers are allowed to warn about whatever they feel like. Given the complexity of the 8051 addresses spaces, as mentioned above, along with the variable width of pointers in the C51 implementation, I think it's a good thing for C51 to be sensitive in this regard. You're always free to disable or ignore the warning if you think it's silly, but in this case I'd recommended taking it to heart and putting in the proper casts where needed to convert the data type explicitly, rather than relying on default, implicit, conversions -- even if those did work in version 7.

Reply
  • So if you're setting a pointer address, you should always use an uint value

    Not true. intptr_t is the integer type wide enough to hold a pointer; ptrdiff_t is the type wide enough to hold a difference of two pointers. Neither one is necessarily the same as an unsigned int.

    Compilers are allowed to warn about whatever they feel like. Given the complexity of the 8051 addresses spaces, as mentioned above, along with the variable width of pointers in the C51 implementation, I think it's a good thing for C51 to be sensitive in this regard. You're always free to disable or ignore the warning if you think it's silly, but in this case I'd recommended taking it to heart and putting in the proper casts where needed to convert the data type explicitly, rather than relying on default, implicit, conversions -- even if those did work in version 7.

Children
No data