你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

(已解决)STM32内存溢出错误:unable to allocate space for section...

[复制链接]
与龙共舞 提问时间:2018-8-20 17:18 /
本帖最后由 与龙共舞 于 2018-8-21 13:48 编辑

hi遇到问题,网上找了找,还是无果,拿出来问问。
工程师IAR的 我现在加入可一个加密解密的.C.H进去,里面很多u8【64】这样的全局变量吧 编译报错了:
unable to allocate space for sections/blocks with a total
estimated minimum size of 0x18427 bytes (max align 0x8) in
<[0x20000000-0x20017fff]> (total uncommitted  space 0x18000).


现在该怎么分配呢?
参考:http://blog.csdn.net/Thinkcortex/article/details/51712524   好像懂一点 但又写不好
4. 当定义了一个超大的全局数组时,IAR编译报错         

unable to allocate space for sections/blocks with a total estimated minimum size of 0xfcac bytes (max align 0x8) in <[0x20000000-0x2000bfff]> (total uncommitted

内存范围超出了STM32的RAM  ,但是MDK并没有报错


5.在MDK中可使用   __attribute__ ((at(0X20001000))) 指定变量位置,在IAR中使用@(0X2001000)

+++++++++++++++++++20180821解决之路+++++++++++++++

网上找到 办法都很高级 我能力不行 看不懂

主要思想是修改.icf文件 确定一个区域给你内存去用吧


我先用第一种方法:malloc 发现如下这写法在VS可以通过 在IAR报错了:Error[Pe059]: function call is not allowed in a constant expression!

  1. #include "stdafx.h"
  2. #include <malloc.h>
  3. int *arr= (int *)malloc(10 * sizeof(int));
  4. int main()
  5. {

  6.     arr[1] = { 3 };
  7.     printf("%d\n",*(arr+1));
  8.     while (1);
  9.     return 0;
  10. }
复制代码

此方法 放弃 IAR不支持全局变量用malloc只能写数组。。。
用第二种土方法,把我的两个全局变量写死:
//BoolType Temp[65]@"u_boot_cmd";
//BoolType SubKey[16][48]@"u_boot_cmd";
修改为:
static BoolType *Temp =(BoolType *)0x20002000 ;//{ ( BoolType ) 0};
static BoolType *SubKey=(BoolType *)0x20002050 ;

写到这里代码也要改了 恨的牙痒痒的 搞个什么二维数组 费劲儿
代码替换

    //    TablePermute ( SubKey, KeyBit, PC2_Table, 48 );  //PC-2置换-- OK
          TablePermute (   SubKey+(BoolType)(i)*48, KeyBit, PC2_Table, 48 );  //PC-2置换-- OK

算是二维数组的指针表示吧 简单到爆炸

再次编译 还是有问题 标题的问题还在 但是我注意到我的内存已经降下来 之前我需要0X18427 现在是0X183E3了
加油
在找头文件的
  1. /*------------- F函数 备用A和备用B 异或 得到48位输出 ---------------*/

  2. // 异或后的结果48位分为8组,每组6位,作为8个S盒的输入             [组合操作]
  3. // S盒以6位作为输入(8组),4位作为输出(4*(8组)=32位)
  4. // S工作原理 假设输入为A=abcdef ,则bcde所代表的数是0-15之间的
  5. // 一个数记为 X=bcde ,af代表的是0-3之间的一个数,记为 Y=af
  6. // 在S1的X列,Y行找到一个数Value,它在0-15之间,可以用二进制表示
  7. // 所以为4bit (共32位)
  8. static const unsigned char S_Box[8][4][16] =
  9. {
  10.     //S1
  11.     14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,
  12.     0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,
  13.     4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,
  14.     15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13,
  15.     //S2
  16.     15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,
  17.     3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,
  18.     0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,
  19.     13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9,
  20.     //S3
  21.     10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,
  22.     13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,
  23.     13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,
  24.     1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12,
  25.     //S4
  26.     7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,
  27.     13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,
  28.     10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,
  29.     3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14,
  30.     //S5
  31.     2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,
  32.     14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,
  33.     4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,
  34.     11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3,
  35.     //S6
  36.     12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,
  37.     10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8, //S6表错误
  38.     9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,
  39.     4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13,
  40.     //S7
  41.     4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,
  42.     13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,
  43.     1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,
  44.     6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12,
  45.     //S8
  46.     13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,
  47.     1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,
  48.     7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,
  49.     2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11
  50. };
复制代码
这个巨无霸的前面以前是static的  我再加了一个const  然后 神奇的编译过了
收藏 评论5 发布时间:2018-8-20 17:18

举报

5个回答
smallcsduck 回答时间:2018-8-20 19:31:49
RAM不够了呗 不改变的变量可以用const变成data段放在flash里面

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

cugxiao 回答时间:2018-8-20 19:52:28
需要大内存的时候最好使用内存管理,这个有很多实现的例子的,大数组最好是自己用malloc管理,而不是交给编译器自己分配

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

feixiang20 回答时间:2018-8-20 23:54:09
分配不够用,没有足够的内存空间供其使用,换个变量最大数值限制看看

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

zero99 回答时间:2018-8-22 13:16:47
怎么解决的啊,大佬
与龙共舞 回答时间:2018-8-24 16:47:57
zero99 发表于 2018-8-22 13:16
怎么解决的啊,大佬

答案在原文中 20180821解决之路++
关于 意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
13245底部标题123相同标题
12底部标题123相同标题
33333底部标题123相同序号
3435底部标题-无链接
关注我们
st-img 微信公众号
st-img 手机版