啊,内存神马的最为烦人了,这个函数跟IAR编译器还相关,不怎么好懂,功能就是初始化STACK以及指针
static void zmain_ram_init( void )
{
uint8 *end;
uint8 *ptr;
// Initialize the call (parameter) stack
end = (uint8*)CSTK_BEG; // Lower end
ptr = (uint8*)(*( __idata uint16*)(CSTK_PTR)); // Upper end
while ( --ptr > end )
*ptr = STACK_INIT_VALUE;
// Initialize the return (address) stack
ptr = (uint8*)RSTK_END - 1; // Upper end
while ( --ptr > (uint8*)SP )
*(__idata uint8*)ptr = STACK_INIT_VALUE;
}
看着短短几行,挺简单的,里面有几个宏定义,查看一下
// Internal (MCU) Stack addresses
#define CSTK_PTR _Pragma("segment=\"XSP\"") __segment_begin("XSP")
#define CSTK_BEG _Pragma("segment=\"XSTACK\"") __segment_begin("XSTACK")
#define RSTK_END _Pragma("segment=\"ISTACK\"") __segment_end("ISTACK")
// Stack Initialization Value
#define STACK_INIT_VALUE 0xCD
这么一大坨东西貌似就是与编译器相关的语句了,下面就是查看存储器映射了,先看下options里面的堆栈设置
感觉XSP、XSTACK以及ISTACK跟这几个相关。IAR编辑器在编译的时候会生成一个map文件,里面有这些值,与我们的配置相关,如下
从中可以看到XSTACK起始地址为0x00000100,ISTACK的结束地址为0x000000FF,XSP地址为0x00000010,程序里面用到了两个栈区,一个XSTACK用于存调用参数,一个ISTACK用于存放返回的地址,感觉就是在调整栈指针,以及规划两个栈空间。
PS:希望大牛批评指正。