打印
[STM32F4]

F407有两块SRAM,想把部分变量定位到另一块,求语法!

[复制链接]
5989|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
玄德|  楼主 | 2014-5-19 16:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 玄德 于 2014-5-20 11:18 编辑

F407有两块(或者说三块)SRAM,112K + 16K,和一块CCM,64K。
现在编译之后,所有变量都定位在前一块,CCM这块空闲。

想把变量 a 放在128K里面, b 放在CCM里面。
查找过IAR的帮助文档,place in 似乎不能实现这目的。

看哪个文档呢?
求指教!


ps:
多谢各位,摸索成功,见另一帖子:https://bbs.21ic.com/icview-734728-1-1.html


沙发
prayerwind| | 2014-5-19 17:47 | 只看该作者
http://www.stmcu.org/download/index.php?act=ziliao&id=657#762
<在IAR 6.5下如何把数据放在Flash指定位置>
这篇**有介绍,参考下IAR—help中的Guide。
不难的。

使用特权

评论回复
板凳
玄德|  楼主 | 2014-5-19 18:20 | 只看该作者
prayerwind 发表于 2014-5-19 17:47
http://www.stmcu.org/download/index.php?act=ziliao&id=657#762

这篇**有介绍,参考下IAR—help中的Gu ...

但我要找的是SRAM定位方法,这个文档有答案吗?
看看有没有答案。

先谢谢。

使用特权

评论回复
地板
wallace_tsou| | 2014-5-19 18:59 | 只看该作者
CCM RAM不支持DMA,所以許多變數無法放在此區。
可以放的是STACK及HEAP。
修改ICF檔案將STACK及HEAP放入,可以使用。
HEAP區可以使用malloc()取出來使用。

使用特权

评论回复
5
airwill| | 2014-5-19 19:45 | 只看该作者
不就是的变量定义嘛, 用绝对地址定义 at 就能搞定. 具体的, 翻一下手册.
上传一份 Keil MDK的编译手册中文版.
编译参考.PDF (2.05 MB)

使用特权

评论回复
6
wallace_tsou| | 2014-5-19 20:08 | 只看该作者
/*###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__ = 0x08000000;
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__    = 0x08000000;
define symbol __ICFEDIT_region_ROM_end__      = 0x080FFFFF;
define symbol __ICFEDIT_region_RAM_start__    = 0x20000000;
define symbol __ICFEDIT_region_RAM_end__      = 0x2001FFFF;
define symbol __ICFEDIT_region_CCMRAM_start__ = 0x10000000;
define symbol __ICFEDIT_region_CCMRAM_end__   = 0x1000FFFF;
/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 0x200;
define symbol __ICFEDIT_size_heap__   = 0x800;
/**** 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 CCMRAM_region   = mem:[from __ICFEDIT_region_CCMRAM_start__   to __ICFEDIT_region_CCMRAM_end__];
define region ExtSRAM         = mem:[from 0x60000000 size 0x200000];

define block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };
define block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };
define block SRAM      with alignment = 4  { section .sram };

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

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

place in ROM_region    { readonly };
/* place in RAM_region    { readwrite, block CSTACK, block HEAP }; */
/* place in CCMRAM_region { section .ccmram }; */
place in RAM_region    { readwrite, block HEAP  };
place in CCMRAM_region { section .ccmram, block CSTACK };
place in ExtSRAM       { block SRAM };                        

配置CSTACK到CCM RAM,HEAP留下來做為DMA Buffer使用。因為使用FreeRTOS,開了多個Task來用。

使用特权

评论回复
7
wallace_tsou| | 2014-5-19 20:09 | 只看该作者
FreeRTOS內Heap_2.c加入
#ifdef STM32F40XX
static unsigned char ucHeap[ configTOTAL_HEAP_SIZE ] @ ".ccmram";
// static unsigned char ucHeap[ configTOTAL_HEAP_SIZE ];
#else
static unsigned char ucHeap[ configTOTAL_HEAP_SIZE ];
#endif

使用特权

评论回复
8
玄德|  楼主 | 2014-5-19 22:08 | 只看该作者
airwill 发表于 2014-5-19 19:45
不就是的变量定义嘛, 用绝对地址定义 at 就能搞定. 具体的, 翻一下手册.
上传一份 Keil MDK的编译手册中文 ...

unsigned char str[] __attribute__((at(0x02001000)));
是这样的语法吗?
IAR 和 KEIL,语法一样吗?

明天试试看,多谢。

使用特权

评论回复
9
玄德|  楼主 | 2014-5-19 22:09 | 只看该作者
wallace_tsou 发表于 2014-5-19 20:08
/*###ICF### Section handled by ICF editor, don't touch! ****/
/*-Editor annotation file-*/
/* IcfEdi ...


多谢,明天试试看。

使用特权

评论回复
10
wallace_tsou| | 2014-5-20 09:14 | 只看该作者
unsigned char ucHeap[ configTOTAL_HEAP_SIZE ] @ ".ccmram";

使用特权

评论回复
11
icecut| | 2014-5-20 09:38 | 只看该作者
icf文件

使用特权

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

本版积分规则

个人签名:有事请找 xuander

153

主题

5927

帖子

44

粉丝