CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

PIC24 Stack questions

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
sharethl



Joined: 05 Apr 2010
Posts: 4

View user's profile Send private message

PIC24 Stack questions
PostPosted: Thu Aug 09, 2012 10:10 am     Reply with quote

PIC24 has 31 stacks, but CCS compiler could set #build{stack =512}
what is this 512 means?
Is it means in the 31 layers of functions calls, it could hold 512 bytes local variables totally?

Here is the example, Am I right?


eg: ignore the returns, here is a 2 layers function, total have 3 local variables, so #build{stack =3}, and PIC24's 31 stacks could support 2 layers.
Code:

fun1(){
   int a,b=0;
   fun2();
}

fun2(){
   int b=0;
}

Thanks
Ttelmah



Joined: 11 Mar 2010
Posts: 19504

View user's profile Send private message

PostPosted: Thu Aug 09, 2012 1:56 pm     Reply with quote

I don't know where you get '31' from?.

Study the data sheet. The PIC24's, have a _16_ register hardware stack, but then have the extra instructions to extend this into the RAM:

"In addition to its use as a working register, the W15 register
in PIC24F devices is also used as a Software
Stack Pointer. The pointer always points to the first
available free word and grows from lower to higher
addresses. It predecrements for stack pops and
post-increments for stack pushes, as shown in
Figure 4-4. Note that for a PC push during any CALL
instruction, the MSB of the PC is zero-extended before
the push, ensuring that the MSB is always clear.
The Stack Pointer Limit Value (SPLIM) register, associated
with the Stack Pointer, sets an upper address
boundary for the stack. SPLIM is uninitialized at Reset.
As is the case for the Stack Pointer, SPLIM<0> is
forced to ‘0’ because all stack operations must be
word-aligned. Whenever an EA is generated using
W15 as a source or destination pointer, the resulting
address is compared with the value in SPLIM. If the
contents of the Stack Pointer (W15) and the SPLIM
register are equal, and a push operation is performed,
a stack error trap will not occur. The stack error trap will
occur on a subsequent push operation. Thus, for
example, if it is desirable to cause a stack error trap
when the stack grows beyond address 2000h in RAM,
initialize the SPLIM with the value, 1FFEh.
Similarly, a Stack Pointer underflow (stack error) trap is
generated when the Stack Pointer address is found to
be less than 0800h. This prevents the stack from
interfering with the Special Function Register (SFR)
space.
A write to the SPLIM register should not be immediately
followed by an indirect read operation using W15."

Unlike the smaller PIC models, this is a register stack, rather than just a call/return stack. Hence much more use is made of it (why the larger size is particularly needed).

Best Wishes
sharethl



Joined: 05 Apr 2010
Posts: 4

View user's profile Send private message

PostPosted: Fri Aug 10, 2012 11:15 am     Reply with quote

Sorry, not 31, but it should be in range 2-31, right?
One function consumes a stack.

Ttelmah wrote:
I don't know where you get '31' from?.

Study the data sheet. The PIC24's, have a _16_ register hardware stack, but then have the extra instructions to extend this into the RAM:

"In addition to its use as a working register, the W15 register
in PIC24F devices is also used as a Software
Stack Pointer. The pointer always points to the first
available free word and grows from lower to higher
addresses. It predecrements for stack pops and
post-increments for stack pushes, as shown in
Figure 4-4. Note that for a PC push during any CALL
instruction, the MSB of the PC is zero-extended before
the push, ensuring that the MSB is always clear.
The Stack Pointer Limit Value (SPLIM) register, associated
with the Stack Pointer, sets an upper address
boundary for the stack. SPLIM is uninitialized at Reset.
As is the case for the Stack Pointer, SPLIM<0> is
forced to ‘0’ because all stack operations must be
word-aligned. Whenever an EA is generated using
W15 as a source or destination pointer, the resulting
address is compared with the value in SPLIM. If the
contents of the Stack Pointer (W15) and the SPLIM
register are equal, and a push operation is performed,
a stack error trap will not occur. The stack error trap will
occur on a subsequent push operation. Thus, for
example, if it is desirable to cause a stack error trap
when the stack grows beyond address 2000h in RAM,
initialize the SPLIM with the value, 1FFEh.
Similarly, a Stack Pointer underflow (stack error) trap is
generated when the Stack Pointer address is found to
be less than 0800h. This prevents the stack from
interfering with the Special Function Register (SFR)
space.
A write to the SPLIM register should not be immediately
followed by an indirect read operation using W15."

Unlike the smaller PIC models, this is a register stack, rather than just a call/return stack. Hence much more use is made of it (why the larger size is particularly needed).

Best Wishes
Ttelmah



Joined: 11 Mar 2010
Posts: 19504

View user's profile Send private message

PostPosted: Fri Aug 10, 2012 3:07 pm     Reply with quote

A basic 'call', occupies one stack level, but as I said, it is a _register_ stack as well, So the contents of registers used inside the functions are also pushed onto this, so a single function call can often use a dozen stack levels...

Best Wishes
FvM



Joined: 27 Aug 2008
Posts: 2337
Location: Germany

View user's profile Send private message

PostPosted: Sat Aug 11, 2012 3:30 am     Reply with quote

The number 31 thing is still a misunderstanding. There's no particularly limitation in PIC24 call depth,
except the limitation data memory available for stack usage.

As said, stack is used for various temporary data storage purposes, a larger amount is e.g. used for
printf() with float variables. The standard PCD interrupt handler uses e.g. 36 bytes of stack.

The present CCS default settings auf 512 byte should be usually sufficient, a stack size of 256
as mentioned in the manual has been frequently reported to cause stack overflows.
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group