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

const placed in DATA segment

Hi All,
when I write:
const char mysting[] ={"my string"};

data are placed to DATA segment, not code sement. I know if it would be written like this:

code char mysting[] ={"my string"};

data will be placed in code segment. What I have to do for automatic placing const data to code segment? I did it by #define const code
But may be other ways are exist.

Thanks,
Vladimir

  • const char mysting[] ={"my string"};
    data are placed to DATA segment, not code sement.

    Correct. const only means read-only from the compiler's point of view. It says nothing of where it is to be stored.

    I know if it would be written like this:

    code char mysting[] ={"my string"};
    Better to write
    const char code myString[] =  "Hello";

    And remember you don't need the { }'s and you should put the code between the type and the variable for future compatiblity.

    - Mark

  • Thank you Mark for your answer.

    But if compiler knows that data read-only, why it's difficult to place it in ROM segment? I've seen a program compiled by IAR, and there were no statments "code" for "const" data.

    Vladimir

  • It's not a difficulty. The idea is to give the user the flexibility to locate the strings in any memory space. The default is data space. While you could make an argument that as a const, it should default to code space, someone will then ask why it is not in data space.

  • 'const' is similar read-only, but it is not a memory_storage_qualifier.

    Look at the example:

    struct CCC {
      const int x;
      int y;
    } ccc = { 1, 2 };
    
    void func(const char *str)
    { char * ptr;
    
      ptr = str;  // MUST produce WARNING
    
      *ptr = 'B'; // LEGAL
      *str = 'A'; // ILLEGAL
    
      ccc.y = 5;  // LEGAL
      ccc.x = 2;  // ILLEGAL
    }
    


    In example above, how possible solid object like 'struct' divide to different memory classes ?

    'x' member to 'code' memory but
    'y' member to 'data/xdata' memory ?

    Obviously, this is absurd.

    How work IAR in this case ?

  • The compiler should not place the data in ROM because you may want to place a memory mapped read-only register in XDATA space. Thus if you were force into code space you could not read the register. By allowing const to do exactly what it does in ISO/ANSI C, Keil has allowed us to enforce compile-time read-only attributes while having the freedom of placing the read-only variable in any data space.

    Another example, in the assembler startup routine you calculate a "first available memory" location for malloc and write it to an address for malloc to use. Malloc() declares that external variable as const but the variable must be in a writable memory space for the C startup module to be able to set it.

    In the end, tell C51 exactly where you want everything to go. I put memory space qualifiers on every single variable I define. I am never surprised when I look in the map file.

    - Mark

  • Hello Sergey,
    many thanks for your example, I didn't consider this situation.

    Vladimir

  • Thank you Tom,

    may be you are right. At least it's supported by other compilers too. But I just wish to have an option at IDE for allocating cont in ROM area. Such options are exist for some compilers.

    Regards,
    Vladimir

  • Thank you Mark,

    it really gives flexibility, and as it acceptable for many cross C-compilers I don't care any more.

    Regards,
    Vladimir