Keil Logo

Memory Types

The C251 Compiler provides access to all 251 memory areas. Variables may be explicitly assigned to a specific memory space (by including a memory type specifier in the declaration) or implicitly assigned (based on the memory model).

The following table summarizes the memory type specifiers you may use.

Memory Type Description
bdata Bit-addressable internal data memory (16 bytes).
Supports mixed bit and byte access.
code Program memory (64 KBytes).
Accessed by opcode MOVC @A+DPTR.
data Directly addressable internal data memory (128 bytes).
Provides fastest access to variables.
ebdata Bit-addressable internal data memory.
Allows mixed bit and byte access.
Address range is 20H-7FH.
idata Indirectly addressable internal data memory (256 bytes).
Accessed across the full internal address space.
near 64 KByte directly/indirectly addressable memory.
Overlaps the data and idata spaces.
Accessed with MOV @WRj or MOV dir16 instructions.
If applied to a function, an LCALL or ACALL (16-bit call) instruction is generated.
far Provides access to the full 16 MByte address space.
Indirectly addressed by MOV @DRk instructions.
Address calculation is performed with 16-bit operations (this limits the size of a single object, array, or structure to 64 KBytes.
If applied to a function, an ECALL (24-bit call) instruction is generated.
huge Provides access to the full 16 MByte address space.
Indirectly addressed by MOV @DRk instructions.
Address calculation is performed with 32-bit operations (this supports objects of unlimited size).
xdata External data memory (64 KBytes).
Accessed by MOVX @DPTR.

As with the signed and unsigned attributes, you may include memory type specifiers in the variable declaration. For example:

char data var1;
char code text[] = "ENTER PARAMETER:";
unsigned long xdata array[100];
float idata x,y,z;
unsigned char xdata vector[10][4][4];
char bdata flags;

Note

  • For compatibility with previous versions of the C251 Compiler, you may specify the memory area before the data type. For example, the following two declarations are equivalent:

    data char x;   // Old-Style Memory Type Declaration
    char data x;   // New-Style Memory Type Declaration
    

    Nonetheless, this feature should not be used in new programs because it may not be supported in future versions of the C251 Compiler. Be careful when using the old C251 syntax with memory-specific pointers. For example, the following two declarations are equivalent:

    data char *x;   // Old-Style Memory Type Declaration
    char *data x;   // New-Style Memory Type Declaration
    
  • Accessing the internal data memory is considerably faster than accessing the external data memory. For this reason, place frequently used variables in internal data memory. Place larger, less frequently used variables in external data memory.

If no memory type is specified for a variable, the compiler implicitly locates the variable in the default memory space determined by the memory model: TINY, XTINY, SMALL, XSMALL, or LARGE. Function arguments and automatic variables that cannot be located in registers are also stored in the default memory area. Refer to Memory Models for more information.

  Arm logo
Important information

This site uses cookies to store information on your computer. By continuing to use our site, you consent to our cookies.

Change Settings

Privacy Policy Update

Arm’s Privacy Policy has been updated. By continuing to use our site, you consent to Arm’s Privacy Policy. Please review our Privacy Policy to learn more about our collection, use and transfers
of your data.