Stack分配到RAM的哪个地方?
keil MDK中,我们只需要定义各个模式下的堆栈大小,编译器会自动在RAM的空闲区域选择一块合适的地方来分配给我们定义的堆栈,这个地方位于RAM的那个地方呢?通过查看编译列表文件,原来MDK将堆栈放到程序使用到的RAM空间的后面,比如你的RAM空间从0x4000 0000开始,你的程序用掉了0x200字节RAM,那么堆栈空间就从0x4000 0200处开始。具体的RAM分配,其实你可以从编译后生成的列表文件“工程名.map”文件中查看。
关于float类型
在keil中,在不选择"Optimize for time"编译选项时,局部float变量占用8个字节(编译器默认自动扩展成double类型),如果你从Flash中读取一个float类型常量并放在局部float型变量中时,有可能发生意想不到的错误:Cortex-M3中可能会出现硬fault.因为字节对齐问题.
但有趣的是,一旦你使用"Optimize for time"编译选项,局部float变量只会占用4个字节.
|