next up previous contents index
Next: 4.6.7 Header Files Up: 4.6 The PIC16 port Previous: 4.6.5 Directories   Contents   Index


4.6.6 Pragmas

The PIC16 port currently supports the following pragmas:

stack
This forces the code generator to initialize the stack & frame pointers at a specific address. This is an ad hoc solution for cases where no STACK directive is available in the linker script or gplink is not instructed to create a stack section.
The stack pragma should be used only once in a project. Multiple pragmas may result in indeterminate behaviour of the program.4.1
The format is as follows:

#pragma stack bottom_address [stack_size] 

bottom_address is the lower bound of the stack section. The stack pointer initially will point at address (bottom_address+stack_size-1).

Example:

/* initializes stack of 100 bytes at RAM address 0x200 */

#pragma stack 0x200 100

If the stack_size field is omitted then a stack is created with the default size of 64. This size might be enough for most programs, but its not enough for operations with deep function nesting or excessive stack usage.

code
Force a function to a static FLASH address.
Example:

/* place function test_func at 0x4000 */

#pragma code test_func 0x4000

library
instructs the linker to use a library module.
Usage:
#pragma library module_name
module_name can be any library or object file (including its path). Note that there are four reserved keywords which have special meaning. These are:

Keyword Description Module to link
ignore ignore all library pragmas (none)
c link the C library libc18f.lib
math link the Math libarary libm18f.lib
io link the I/O library libio18f*.lib
debug link the debug library libdebug.lib

* is the device number, i.e. 452 for PIC18F452 MCU.

This feature allows for linking with specific libraries withoug having to explicit name them in the command line. Note that the IGNORE keyword will reject all modules specified by the library pragma.

udata
The pragma udata instructs the compiler to emit code so that linker will place a variable at a specific memory bank.
Example:

/* places variable foo at bank2 */

#pragma udata bank2 foo

char foo;

In order for this pragma to work extra SECTION directives should be added in the .lkr script. In the following example a sample .lkr file is shown:

// Sample linker script for the PIC18F452 processor

LIBPATH .

CODEPAGE   NAME=vectors    START=0x0            END=0x29           PROTECTED

CODEPAGE   NAME=page       START=0x2A           END=0x7FFF

CODEPAGE   NAME=idlocs     START=0x200000       END=0x200007       PROTECTED

CODEPAGE   NAME=config     START=0x300000       END=0x30000D       PROTECTED

CODEPAGE   NAME=devid      START=0x3FFFFE       END=0x3FFFFF       PROTECTED

CODEPAGE   NAME=eedata     START=0xF00000       END=0xF000FF       PROTECTED

ACCESSBANK NAME=accessram  START=0x0            END=0x7F

DATABANK   NAME=gpr0       START=0x80           END=0xFF

DATABANK   NAME=gpr1       START=0x100          END=0x1FF

DATABANK   NAME=gpr2       START=0x200          END=0x2FF

DATABANK   NAME=gpr3       START=0x300          END=0x3FF

DATABANK   NAME=gpr4       START=0x400          END=0x4FF

DATABANK   NAME=gpr5       START=0x500          END=0x5FF

ACCESSBANK NAME=accesssfr  START=0xF80          END=0xFFF          PROTECTED

SECTION    NAME=CONFIG     ROM=config

SECTION    NAME=bank0      RAM=gpr0       # these SECTION directives

SECTION    NAME=bank1      RAM=gpr1       # should be added to link

SECTION    NAME=bank2      RAM=gpr2       # section name 'bank?' with

SECTION    NAME=bank3      RAM=gpr3       # a specific DATABANK name

SECTION    NAME=bank4      RAM=gpr4

SECTION    NAME=bank5      RAM=gpr5

The linker will recognise the section name set in the pragma statement and will position the variable at the memory bank set with the RAM field at the SECTION line in the linker script file.


next up previous contents index
Next: 4.6.7 Header Files Up: 4.6 The PIC16 port Previous: 4.6.5 Directories   Contents   Index
2008-12-05