查看: 18354|回复: 7

[已解决] Keil下分配K10内部64KRAM出错?(已解决)

[复制链接]

该用户从未签到

27

主题

71

帖子

0

中级会员

Rank: 3Rank: 3

积分
262
最后登录
1970-1-1
发表于 2014-5-14 10:58:45 | 显示全部楼层 |阅读模式
请教高手,我在K10中移植freertos, 设置堆大小超过32K就报错了
#define configTOTAL_HEAP_SIZE                ( ( size_t ) ( 35 * 1024 ) )
KEIL下编译显示结果如下,而实际上BIN文件使用内存远小于64K. 请问是哪里出错?
 linking...
.\output\socket.axf: Error: L6406E: No space in execution regions with .ANY selector matching heap_4.o(.bss).
.\output\socket.axf: Error: L6407E: Sections of aggregate size 0xc800 bytes could not fit into .ANY selector(s).
".\output\socket.axf" - 2 Errors, 15 Warning(s).
Target not created
我知道答案 目前已有7人回答
回复

使用道具 举报

该用户从未签到

27

主题

71

帖子

0

中级会员

Rank: 3Rank: 3

积分
262
最后登录
1970-1-1
 楼主| 发表于 2014-5-14 13:00:36 | 显示全部楼层

RE:Keil下分配K10内部64KRAM出错?

看了手册,说为了提高同步性,SRAM分两部分;上半部分只能system bus访问。是否说程序能用的SRAM只能是下半部分?
3.5.3.4 SRAM accesses
The SRAM is split into two logical arrays that are 32-bits wide.
• SRAM_L — Accessible by the code bus of the Cortex-M4 core and by the backdoor
port.
• SRAM_U — Accessible by the system bus of the Cortex-M4 core and by the backdoor port.
回复 支持 反对

使用道具 举报

该用户从未签到

35

主题

508

帖子

0

金牌会员

Rank: 6Rank: 6

积分
2167
最后登录
1970-1-1
发表于 2014-5-14 14:29:23 | 显示全部楼层

回复:Keil下分配K10内部64KRAM出错?

由于Kinetis K系列芯片使用的是ARM Cortex M4内核,其使用哈弗架构,内部的SRAM被分成了两部分,通过不同的总线访问。也就是说,SRAM分成了两部分,虽然逻辑地址是连续的,但是这两部分SRAM不能当成一个连续空间来使用。因此,请避免将heap大小设置超过1/2 SRAM大小,否则在使用过程中会产生错误。
回复 支持 反对

使用道具 举报

该用户从未签到

27

主题

71

帖子

0

中级会员

Rank: 3Rank: 3

积分
262
最后登录
1970-1-1
 楼主| 发表于 2014-5-14 22:40:01 | 显示全部楼层

回复:Keil下分配K10内部64KRAM出错?

回复第 3 楼 于2014-05-14 14:29:23发表:
由于Kinetis K系列芯片使用的是ARM Cortex M4内核,其使用哈弗架构,内部的SRAM被分成了两部分,通过不同的总线访问。也就是说,SRAM分成了两部分,虽然逻辑地址是连续的,但是这两部分SRAM不能当成一个连续空间来使用。因此,请避免将heap大小设置超过1/2 SRAM大小,否则在使用过程中会产生错误。
 
谢谢回复。这样有个问题,全局变量包括heap 都是占用SRAM_L内存;如何使用SRAM_U内存?
 
回复 支持 反对

使用道具 举报

该用户从未签到

35

主题

508

帖子

0

金牌会员

Rank: 6Rank: 6

积分
2167
最后登录
1970-1-1
发表于 2014-5-16 11:20:04 | 显示全部楼层

回复:Keil下分配K10内部64KRAM出错?

回复第 4 楼 于2014-05-14 22:40:01发表:
回复第 3 楼 于2014-05-14 14:29:23发表:
由于Kinetis K系列芯片使用的是ARM Cortex M4内核,其使用哈弗架构,内部的SRAM被分成了两部分,通过不同的总线访问。也就是说,SRAM分成了两部分,虽然逻辑地址是连续的,但是这两部分SRAM不能当成一个连续空间来使用。因此,请避免将heap大小设置超过1/2 SRAM大小,否则在使用过程中会产生错误。
 
谢谢回复。这样有个问题,全局变量包括heap 都是占用SRAM_L内存;如何使用SRAM_U内存?
 
 
需要评估全局变量大小,栈和堆的大小,不要跨界使用就可以。
客户可以参考IAR工程的链接配置文件,将RAM区域分成两部分,根据实际使用情况选择合适的放置区域:
/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 0x1000;
define symbol __ICFEDIT_size_heap__   = 0x200;
define symbol __ICFEDIT_region_RAM_start__ = 0x1FFF0410;
define symbol __ICFEDIT_region_RAM_end__   = 0x20000000;
define symbol __region_RAM2_start__ = 0x20000000;
define symbol __region_RAM2_end__ = 0x20010000;
define region RAM_region   = mem:[from __ICFEDIT_region_RAM_start__   to __ICFEDIT_region_RAM_end__] | mem:[from __region_RAM2_start__ to __region_RAM2_end__];
place in RAM_region   { readwrite, block CodeRelocateRam,
                        block CSTACK, block HEAP };
一般的工程只需要使用使用SRAM_L,客户需要根据实际使用情况来调整,同一个函数或者变量不要跨界(0x2000_0000)就行。
祝顺利。

 
回复 支持 反对

使用道具 举报

该用户从未签到

27

主题

71

帖子

0

中级会员

Rank: 3Rank: 3

积分
262
最后登录
1970-1-1
 楼主| 发表于 2014-5-23 16:53:54 | 显示全部楼层

回复:Keil下分配K10内部64KRAM出错?

回复第 5 楼 于2014-05-16 11:20:04发表:
回复第 4 楼 于2014-05-14 22:40:01发表:
回复第 3 楼 于2014-05-14 14:29:23发表:
由于Kinetis K系列芯片使用的是ARM Cortex M4内核,其使用哈弗架构,内部的SRAM被分成了两部分,通过不同的总线访问。也就是说,SRAM分成了两部分,虽然逻辑地址是连续的,但是这两部分SRAM不能当成一个连续空间来使用。因此,请避免将heap大小设置超过1/2 SRAM大小,否则在使用过程中会产生错误。
 
谢谢回复。这样有个问题,全局变量包括heap 都是占用SRAM_L内存;如何使用SRAM_U内存?
 
 
需要评估全局变量大小,栈和堆的大小,不要跨界使用就可以。
客户可以参考IAR工程的链接配置文件,将RAM区域分成两部分,根据实际使用情况选择合适的放置区域:
/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 0x1000;
define symbol __ICFEDIT_size_heap__   = 0x200;
define symbol __ICFEDIT_region_RAM_start__ = 0x1FFF0410;
define symbol __ICFEDIT_region_RAM_end__   = 0x20000000;
define symbol __region_RAM2_start__ = 0x20000000;
define symbol __region_RAM2_end__ = 0x20010000;
define region RAM_region   = mem:[from __ICFEDIT_region_RAM_start__   to __ICFEDIT_region_RAM_end__] | mem:[from __region_RAM2_start__ to __region_RAM2_end__];
place in RAM_region   { readwrite, block CodeRelocateRam,
                        block CSTACK, block HEAP };
一般的工程只需要使用使用SRAM_L,客户需要根据实际使用情况来调整,同一个函数或者变量不要跨界(0x2000_0000)就行。
祝顺利。

 
Good answer. thanks.

 
回复 支持 反对

使用道具 举报

  • TA的每日心情
    开心
    2018-7-2 06:04
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    59

    主题

    2888

    帖子

    10

    金牌会员

    Rank: 6Rank: 6

    积分
    6020
    最后登录
    2020-9-28
    发表于 2014-5-27 09:28:26 | 显示全部楼层

    RE:Keil下分配K10内部64KRAM出错?(已解决)

    感谢你对飞思卡尔产品的关注!
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    8

    主题

    58

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    267
    最后登录
    2016-8-24
    发表于 2015-5-13 18:48:06 | 显示全部楼层
    FSL_TICS_MAHUI 发表于 2014-5-16 11:20
    回复第 4 楼 于2014-05-14 22:40:01发表:
    回复第 3 楼 于2014-05-14 14:29:23发表:
    由于Kinetis K系列芯片 ...

    我怎么不能用SRAM_U?我已经把我的结构体 分成了2个 按大小算是不超的 怎么还不行?
    Error[Lp014]: cannot fit "Block .bss" (min size 0x4654, alignment 0x4) into any of the ranges <[0x1fffc410-0x1fffffff],  [0x20000000-0x20003fff]>

    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-21 21:36 , Processed in 0.098331 second(s), 27 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表