1.4.2. calc stack

#ifdef CONFIG_USE_IRQ
	sub	r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)1
#endif
	sub	sp, r0, #122		/* leave 3 words for abort-stack    */
        

1

如果定义了CONFIG_USE_IRQ,即如果使用中断的话,那么再把r0的值减去IRQ和FIQ的堆栈的值,

而对应的宏的值也是在

u-boot-1.1.6_20100601\opt\EmbedSky\u-boot-1.1.6\include\configs\EmbedSky.h

中:

/*-------------------------------------------------------------------
 * Stack sizes
 *
 * The stack sizes are set up in start.S using the settings below
 */
#define CONFIG_STACKSIZE		(128*1024)	/* regular stack */
#ifdef CONFIG_USE_IRQ
#define CONFIG_STACKSIZE_IRQ		(4*1024)	/* IRQ stack */
#define CONFIG_STACKSIZE_FIQ		(4*1024)	/* FIQ stack */
#endif
                

所以,此时r0的值就是:

#ifdef CONFIG_USE_IRQ

r0

= r0 - #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)

= r0 – (4*1024 + 4*1024)

= r0 – 8*1024

= 33CBFF80 – 8*1024

= 33CBDF80

#endif

2

最后,再减去终止异常所用到的堆栈大小,即12个字节。

现在r0的值为:

#ifdef CONFIG_USE_IRQ

r0

= r0 – 12

= 33CBDF80 - 12

= 33CBDF74

#else

r0

= r0 – 12

= 33CBFF80 - 12

= 33CBFF74

#endif

然后将r0的值赋值给sp,即堆栈指针。

关于:

sp代表stack pointer,堆栈指针;

和后面要提到的ip寄存器:

ip代表instruction pointer,指令指针。

更多详情参见下面的解释。

关于ARM的寄存器的别名和相关的APCS,参见本文后面的内容:第 3.5 节 “AMR寄存器的别名 + APCS”