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

Mixed Memory Models

C51 v6.03+; uVision v2.07+

I want to build a Project with some files using the SMALL model, but most using LARGE.

If I select LARGE in the Target options, and specify SMALL in the C51 'Misc Controls' where required, or use a #pragma in the file itself, I get a fatal Compiler error:

RESPECIFIED OR CONFLICTING CONTROL

If I select SMALL in the Target options, and specify LARGE in the C51 'Misc Controls' box where required, everything Compiles OK, but I get Linker warnings for each of the 'Large' Modules:
L14: INCOMPATIBLE MEMORY MODEL

If I specify 'large' in each function declaration where required, it all Compiles and Links OK!

Thus it is possible to create a mixed-model Project, but extremely cumbersome to have to specify the model on every function!
Why doesn't it work when the model is specified at the module level?

(yes, I know you wouldn't want to design a Project like this from scratch, but this is "inherited" stuff...)

Parents
  • //main.c
    #pragma small
    extern myfunc(unsigned char n) large;
    void main(void){
      myfunc(55);
    }
    

    //large.c
    #pragma small
    myfunc(unsigned char n) large;
    //
    //...
    //
    myfunc(unsinged char n) large
    {
    //do something
    }
    

    (not tested, just think)

    1. Modify the "large.c" or just delete it, then translate the "main.c", the "main.obj" is same as before.

    2. Modify the "main.c" or just delete it, then translate the "large.c", the "large.obj" is same as before.

    3. Remove the word "large" in "main.c" and translate again, the "main.obj" should be changed.

    4. Remove the word "large" in "large.c" and translate again, the "large.obj" should be changed.

    5. So any changing in other modules does not effect the current file Compiling result.

    6. And different memory model in function declaration can get the different object file.

    7. The module level memory model just act as a default value when the function declaration do not have the special memory model selecting.

    8. And the Linker knows the memory model of each object(module), so the warning is shown when the objects have the different memory model.

    9. It is very important that the modules have the function body and other modules calling the function should have the same memory model of the function.

    10. So the "myfunc" should have the same memory model in the two files.

Reply
  • //main.c
    #pragma small
    extern myfunc(unsigned char n) large;
    void main(void){
      myfunc(55);
    }
    

    //large.c
    #pragma small
    myfunc(unsigned char n) large;
    //
    //...
    //
    myfunc(unsinged char n) large
    {
    //do something
    }
    

    (not tested, just think)

    1. Modify the "large.c" or just delete it, then translate the "main.c", the "main.obj" is same as before.

    2. Modify the "main.c" or just delete it, then translate the "large.c", the "large.obj" is same as before.

    3. Remove the word "large" in "main.c" and translate again, the "main.obj" should be changed.

    4. Remove the word "large" in "large.c" and translate again, the "large.obj" should be changed.

    5. So any changing in other modules does not effect the current file Compiling result.

    6. And different memory model in function declaration can get the different object file.

    7. The module level memory model just act as a default value when the function declaration do not have the special memory model selecting.

    8. And the Linker knows the memory model of each object(module), so the warning is shown when the objects have the different memory model.

    9. It is very important that the modules have the function body and other modules calling the function should have the same memory model of the function.

    10. So the "myfunc" should have the same memory model in the two files.

Children