半熟 发表于 2020-3-3 16:40:05

关于单片机的两个细节

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个字节.

分分合 发表于 2020-9-29 10:43:29


https://fj.zhjlfx.cn/img/2020/09/29/71671025_202009241017390441833740.png
https://www.wzbh.org/data/attachment/forum/202009/26/114414xa66mhoqnnfpdo6p.png

页: [1]
查看完整版本: 关于单片机的两个细节