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

Writing constant to ROM

Maybe this is a simple question, but I just couldn't figure it out. Can someone tell me how to place a constant variable into the specific ROM area? I would like to be able to set a constant value at a particualr ROM area and use a pointer to get it whenever I need it.

Cheers,
Tang

Parents Reply Children
  • Here is how I do it:

    1. I define the code version in the header file:

    /*********************** FIRMWARE CODE VERSION	*****************************/
    
    #define CODE_VERSION	3		// 10 is version 1.0
    

    In the source module, I put the variable into the codespace (into the gap just behind external interrupt 0 LJMP instruction):

    unsigned char code version _at_ 0x0006 = CODE_VERSION;
    

    This value can be accessed by the system flash upgrade software at location 6 of the code region 0xFF. So The software displays the new version at file opening time and before actual downloading to the target system.

    Franc

  • 
    unsigned char code version _at_ 0x0006 = CODE_VERSION;
    But that's not allowed - you can't use an initialiser with the _at_ keyword.

    See p79 in the C51 User's Guide, 03.2000:
    "The following restrictions apply to absolute variable location:
    1. Absolute variables cannot be initialized.
    2. Functions and variables of type bit cannot be located at an absolute address."

  • That's what I thought. I'm still dreaming of this feature for the C51.

    - Mark

  • Why does Keil have this restriction? You can do this with Raisonance and I would like to have my code be compatible with both. For Raisonance you just use:
    at 0x803d code char my_char = 0x55;

    I don't need to have a variable name created, but I would like to be able to set a byte that configures the hardware. This is a hardware configuration byte that needs to be programmed when the program is loaded. If I understand correctly there is no way to add a single statement to the Keil C program for this function. I have to link an assembly language file to do that with Keil. Is that correct?

  • "Why does Keil have this restriction?"

    Although it seems a simple enough addition apparently it will involve a major rewrite of part of the compiler.

    You can put the 'variable' in its own 'C' source file then link that as a 'user segment'. There's an example in the knowledgebase somewhere.