7.3 Stack
The 32-bit DSC dsPIC33A devices use what is referred to in this user’s guide as a “software stack.” This is the typical stack arrangement employed by most computers and is ordinary data memory accessed by a push-and-pop type instruction and a stack pointer register. The term “hardware stack” is used to describe the stack employed by Microchip 8-bit devices, which is only used for storing function return addresses.
The 32-bit DSC dsPIC33A devices dedicate register W15 for use as a software Stack Pointer. All processor stack operations, including function calls, interrupts and exceptions, use the software stack. The stack grows upward, towards higher memory addresses.
The 32-bit DSC
dsPIC33A device also supports stack overflow
detection. If the Stack Pointer Limit register, SPLIM, is initialized, the device will test
for overflow on all stack operations. If an overflow should occur, the processor will
initiate a stack error exception. By default, this will result in a processor Reset.
Applications may also install a stack error exception handler by defining an interrupt
function named _StackError. See 15 Interrupts for details.
The C/C++ run-time startup module initializes the Stack Pointer (W15) and
the Stack Pointer Limit register during the startup and initialization sequence. The
initial values are normally provided by the linker, which allocates the largest stack
possible from unused data memory. The location of the stack is reported in the link map
output file. Applications can ensure that at least a minimum-sized stack is available with
the --stack linker command-line option. See the “MPLAB®XC-DSC
Assembler, Linker and Utilities User’s Guide for dsPIC33A
DSC” (DS-50003919) for details.
Alternatively, a stack of specific size may be allocated with a user-defined section from an assembly source file. In the following example, 0x100 bytes of data memory are reserved for the stack:
.section *,data,stack
.space 0x100
The linker will allocate an appropriately sized section and initialize
__SP_init and __SPLIM_init so that the run-time
startup code can properly initialize the stack. Note that since this is a normal assembly
code section, attributes such as address may be used to further define the
stack. Please see the “MPLAB®XC-DSC
Assembler, Linker and Utilities User’s Guide for dsPIC33A
DSC” (DS-50003919) for more information.
