打印

iar中堆栈设置问题。

[复制链接]
4584|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
LSQHHH|  楼主 | 2013-11-12 12:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*###ICF### Section handled by ICF editor, don't touch! ****/
/*-Editor annotation file-*/
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
/*-Specials-*/
define symbol __ICFEDIT_intvec_start__ = 0x08010000;
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__    = 0x08010000;
define symbol __ICFEDIT_region_ROM_end__      = 0x080FFFFF;
define symbol __ICFEDIT_region_RAM_start__    = 0x68000000;
define symbol __ICFEDIT_region_RAM_end__      = 0x681FFFFF;
define symbol __ICFEDIT_region_CCMRAM_start__ = 0x10000000;
define symbol __ICFEDIT_region_CCMRAM_end__   = 0x1000FFFF;
/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 0x800;
define symbol __ICFEDIT_size_heap__   = 0x400;
/**** End of ICF editor section. ###ICF###*/

define memory mem with size = 4G;
define region ROM_region      = mem:[from __ICFEDIT_region_ROM_start__   to __ICFEDIT_region_ROM_end__];
/*define region RAM_region      = mem:[from __ICFEDIT_region_RAM_start__   to __ICFEDIT_region_RAM_end__];*/
define region RAM_region      = mem:[from 0x20000000 to 0x681fffff]-mem:[from 0x20020000 to 0x68000000];

define region CCMRAM_region   = mem:[from __ICFEDIT_region_CCMRAM_start__   to __ICFEDIT_region_CCMRAM_end__];


define block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };
define block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };

initialize by copy { readwrite };
do not initialize  { section .noinit };

place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };

place in ROM_region   { readonly };
place in RAM_region   { readwrite,block CSTACK, block HEAP };
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
这是我的ICF文件,因为外部扩展了2M的SRAM,问题是编译器将堆栈自动放在了外部SRAM,这样程序启动时外部端口还没有初始化根本读写不了RAM,造成启动失败。假如改成这样
define symbol __ICFEDIT_region_RAM_end__      = 0x680FFFFF;
define region RAM_region      = mem:[from 0x20000000 to 0x680fffff]-mem:[from 0x20020000 to 0x68000000];
只使用1M sram,就会自动将堆栈放在芯片的内部RAM中,这样就完全没问题。
如何设置将CSTACK强制放在内部ram中?




沙发
戈卫东| | 2013-11-12 15:17 | 只看该作者
似乎很复杂的样子....我都是在它的IDE里面编辑的,没搞过这么复杂的....

使用特权

评论回复
板凳
LSQHHH|  楼主 | 2013-12-8 10:51 | 只看该作者
再说明一下情况:定义了外部SRAM,编译时会将堆栈地址分配在外部SRAM中,比如0X68001000开始,这样程序启动时系统调用初始化程序system_stm32f4xx.c中的函数 SystemInit();会将堆栈压入0X68001000,但此时外部sram还没有初始化,是不能存储数据的。此函数返回就会堆栈出错。只要能将系统堆栈强壮设置在CPU的ram中(0x20000000开始)应该就可以解决,但不知道怎么定义。
难道没人给个意见?

使用特权

评论回复
地板
jjjkkk00| | 2013-12-10 15:14 | 只看该作者
你尝试下,修改起始地址?只是建议试试看。
/*-Specials-*/
define symbol __ICFEDIT_intvec_start__ = 0x20000000;

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

59

帖子

3

粉丝