Address allocation

The address of each global entity is determined during final assembly and depends on link process, so you cannot make any assumption about regular variable/function locations.

However, each entity can be manually placed at any address, using the @$ address$ extension. For example:

int x@0x12 ;  // manually located definition
extern unsigned char STATUS@0xFD8 ; // manually located declaration

This feature is very handy to access Special Function Registers. cpik provides a set of header files containing the declaration of each SFR register, for each processor. These headers are automatically generated by a program that takes the informations from Microchip's «.inc» files. For example, here is the beginning of the p18f2525.h header file:

#ifndef DEVICE
#define DEVICE p18f2525
#define p18f2525

// ======================================
//         PROCESSOR : p18f2525
// ======================================

// This file has been automatically generated from Microchip's "p18f2525.inc" file.
// with the inc2h-v2 utility.             Please do not edit by hand.
// Do not use with cpik versions prior V0.7, report problems to author.
// (C) Alain Gibaud  2012    (alain.gibaud@free.fr)

#pragma firstsfr 0xf80
// ------------------------------
//        PORTA
// ------------------------------
unsigned int PORTA@0xf80 ;
union
{

struct 
{
  unsigned int 
  RA0 : 1 ,
  RA1 : 1 ,
  RA2 : 1 ,
  RA3 : 1 ,
  RA4 : 1 ,
  RA5 : 1 ,
  RA6 : 1 ,
  RA7 : 1 ;
} ; 

struct 
{
  unsigned int 
  : 4,
  T0CKI : 1 ,
  AN4 : 1 ;
} ; 

struct 
{
  unsigned int 
  : 5,
  SS : 1 ;
} ; 

struct 
{
  unsigned int 
  : 5,
  NOT_SS : 1 ;
} ; 

struct 
{
  unsigned int 
  : 5,
  LVDIN : 1 ;
} ; 

struct 
{
  unsigned int 
  : 5,
  HLVDIN : 1 ;
} ; 

} PORTAbits@0xf80  ;
...

\fbox{\parbox{\linewidth-2\fboxrule-2\fboxsep}
{
Please note that {\bf cpik} {\i...
... to insure that
the specified location really corresponds to usable memory.
} }



gibaud 2013-10-30