4.7.6 Pragmas
Keywords: sdccman

##
4.7.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.2
  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 without 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.

config
  The pragma config instructs the compiler to emit config directive.
  The format is as follows:

  #pragma config setting=value [, setting=value]

Multiple settings may be defined on a single line, separated by commas. Settings for a single configuration byte may also be defined on separate lines.

  Example:

  #pragma config CP0=OFF,OSCS=ON,OSC=LP,BOR=ON,BORV=25,WDT=ON,WDTPS=128,CCP2MUX=ON

  #pragma config STVR=ON