Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
此处的含义很好理解,就是把地址为IRQ_STACK_START中的值赋值给sp。<br />
即获得IRQ的堆栈的起始地址。<br />
而对于IRQ_STACK_START,是我们前面这里cpu_init源码(点击可掉转到对应位置)<br />
就提到过的:<br />
┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳<br />
int cpu_init (void)<br />
{<br />
/*<br />
* setup up stacks if necessary<br />
*/<br />
#ifdef CONFIG_USE_IRQ<br />
- 4;<br />
IRQ_STACK_START = _armboot_start - CFG_MALLOC_LEN - CFG_GBL_DATA_SIZE<br />
FIQ_STACK_START = IRQ_STACK_START - CONFIG_STACKSIZE_IRQ;<br />
FREE_RAM_END = FIQ_STACK_START - CONFIG_STACKSIZE_FIQ -<br />
CONFIG_STACKSIZE;<br />
#else<br />
FREE_RAM_SIZE = FREE_RAM_END - PHYS_SDRAM_1;<br />
FREE_RAM_END = _armboot_start - CFG_MALLOC_LEN - CFG_GBL_DATA_SIZE<br />
- 4 - CONFIG_STACKSIZE;<br />
#endif<br />
}<br />
FREE_RAM_SIZE = FREE_RAM_END - PHYS_SDRAM_1;<br />
return 0;<br />
┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻<br />
而此处,就是用到了,前面已经在cpu_init()中重新计算正确的值了。<br />
即算出IRQ堆栈的起始地址,其算法很简单,就是:<br />
- 4;<br />
IRQ_STACK_START = _armboot_start - CFG_MALLOC_LEN - CFG_GBL_DATA_SIZE<br />
即,先减去malloc预留的空间,和global data,即<br />
在<br />
u-boot-1.1.6_20100601\opt\EmbedSky\u-boot-1.1.6\board\EmbedSky\board.c<br />
中定义的全局变量:<br />
DECLARE_GLOBAL_DATA_PTR;<br />
而此宏对应的值在:<br />
u-boot-1.1.6_20100601\opt\EmbedSky\u-boot-1.1.6\include\asm-arm\global_data.<br />
h<br />
中:<br />
#define DECLARE_GLOBAL_DATA_PTR register volatile gd_t *gd asm ("r8")<br />
即,用一个固定的寄存器r8来存放此结构体的指针。<br />
(注:这也对应着编译uboot的时候,你所看到的编译参数-ffixed-r8)<br />
此gd_t的结构体,不同体系结构,用的不一样。<br />
而此处arm的平台中,gd_t的定义在同一文件中: