[8/16-bit MCU] cotex_M4 裸机时有关malloc的使用。

[复制链接]
 楼主| nolanpeers 发表于 2015-10-15 20:44 | 显示全部楼层 |阅读模式

请问大神们,我用了一块ARM,M4的,在编程时由于前面需要定义两个数组,各位10000个浮点数,我想用malloc然后使用完后在释放,
可是问题是程序根本就不会动。
而我改变分配的大小时倒是可以?为什么?是内存不够用吗?
Tennasi 发表于 2015-10-15 21:21 | 显示全部楼层
应该不是内存分配的问题
ianhom 发表于 2015-10-16 09:09 来自手机 | 显示全部楼层
不知道你的堆区域设置了多大,如果你用的是iar的话可以看一下.icf文件中heap的size,一般malloc失败都是堆空间不够造成的,可以适当调大堆区域再试试看

评论

顶!  发表于 2015-10-16 12:36
lovecat2015 发表于 2015-10-16 09:15 | 显示全部楼层
这个得看你申请的堆区有多大了
FSL_TICS_Jeremy 发表于 2015-10-16 09:20 | 显示全部楼层
不太明白你的问题,请描述清楚一点
 楼主| nolanpeers 发表于 2015-10-16 14:10 | 显示全部楼层
本帖最后由 nolanpeers 于 2015-10-16 14:13 编辑
FSL_TICS_Jeremy 发表于 2015-10-16 09:20
不太明白你的问题,请描述清楚一点

我用的开发板是FRDM-K22F,环境是:keil,RAM是128KB,一开始程序里需要定义两个数组,每个数组10000个元素,后面就不会再用到这两个数组。所以我想一开始分配两个大小合适的内存,用完之后释放掉,可是我分配了1000个数大小的内存后,如
p1=(fp32 *)malloc(sizeof(fp32)*10000);
p2=(fp32 *)malloc(sizeof(fp32)*10000);
,程序不执行。而我改成
p1=(fp32 *)malloc(sizeof(fp32)*100);
p2=(fp32 *)malloc(sizeof(fp32)*100);
就可以执行了,为什么?是内存大小不够的原因吗?我计算了一下,应该够的。请问怎么在keil里设置一下?还是在头文件哪里改?
 楼主| nolanpeers 发表于 2015-10-16 14:12 | 显示全部楼层
lovecat2015 发表于 2015-10-16 09:15
这个得看你申请的堆区有多大了

如何申请?这样吗?
p1=(fp32 *)malloc(sizeof(fp32)*10000);
p2=(fp32 *)malloc(sizeof(fp32)*10000);
可是运行不了唉。我用的是keil,芯片RAM128kb
ianhom 发表于 2015-10-16 14:43 | 显示全部楼层
nolanpeers 发表于 2015-10-16 14:12
如何申请?这样吗?
p1=(fp32 *)malloc(sizeof(fp32)*10000);
p2=(fp32 *)malloc(sizeof(fp32)*10000);

heap设置的小,内存再大也没有用,你上网搜一下keil在哪里设置heap的size
 楼主| nolanpeers 发表于 2015-10-16 16:51 | 显示全部楼层
ianhom 发表于 2015-10-16 14:43
heap设置的小,内存再大也没有用,你上网搜一下keil在哪里设置heap的size

大神说得对。可是飞思卡尔的heap的size在那个文件里知道吗?找了半天不知道地方:L
ianhom 发表于 2015-10-16 17:54 | 显示全部楼层
本帖最后由 ianhom 于 2015-10-17 08:49 编辑
nolanpeers 发表于 2015-10-16 16:51
大神说得对。可是飞思卡尔的heap的size在那个文件里知道吗?找了半天不知道地方 ...
QQ截图20151017084723.png
你可以找找启动文件,看看Heap
 楼主| nolanpeers 发表于 2015-10-19 09:40 | 显示全部楼层
本帖最后由 nolanpeers 于 2015-10-19 09:57 编辑
ianhom 发表于 2015-10-16 17:54
你可以找找启动文件,看看Heap

我这里只有Flash Configuration一个选项,其余的都没有跳出来,是不是禁掉了?如何解决,您知道吗?@FSL_TICS_Jeremy @FSL_TICS_ZJJ

FSL_TICS_Jeremy 发表于 2015-10-19 15:27 | 显示全部楼层
nolanpeers 发表于 2015-10-19 09:40
我这里只有Flash Configuration一个选项,其余的都没有跳出来,是不是禁掉了?如何解决,您知道吗?@FSL_T ...

你可以打开启动文件,然后在里面找到Heap_Size   EQU , 然后直接修改也是可以的
 楼主| nolanpeers 发表于 2015-10-20 09:33 | 显示全部楼层
FSL_TICS_Jeremy 发表于 2015-10-19 15:27
你可以打开启动文件,然后在里面找到Heap_Size   EQU , 然后直接修改也是可以的 ...

没有找到那句,反而,找到了这么一句话using ::std::__use_no_heap;

      using ::std::__use_realtime_heap;
      using ::std::__use_realtime_division;
      using ::std::__use_two_region_memory;
      using ::std::__use_no_heap;
      using ::std::__use_no_heap_region;
找不到设置的地方,在路径:C:\Freescale\KSDK_1.2.0\platform\devices\MK22F51212\linker\arm下面找到了MK22FN512xxx12_ram和MK22FN512xxx12_ram.scf.bak两个文件,里面有heap_size,可是改了后没有用,貌似工程里不包含这两个文件
11.jpg
12.bmp
FSL_TICS_Jeremy 发表于 2015-10-20 13:40 | 显示全部楼层
nolanpeers 发表于 2015-10-20 09:33
没有找到那句,反而,找到了这么一句话using ::std::__use_no_heap;

      using ::std::__use_realtime ...

没找到啊!
那你的启动文件是什么样子的嫩?
 楼主| nolanpeers 发表于 2015-10-20 16:28 | 显示全部楼层
FSL_TICS_Jeremy 发表于 2015-10-20 13:40
没找到啊!
那你的启动文件是什么样子的嫩?

用的是KSDK_1.2.0自带的启动文件,想修改heap_size大小,想用malloc来分配内存大小,可是分配太大程序也不报错,只是不执行。改小一点就正常运行了
 楼主| nolanpeers 发表于 2015-10-22 10:55 | 显示全部楼层
FSL_TICS_Jeremy 发表于 2015-10-20 13:40
没找到啊!
那你的启动文件是什么样子的嫩?

请问大神,有解决办法吗?
FSL_TICS_Jeremy 发表于 2015-10-22 15:44 | 显示全部楼层
nolanpeers 发表于 2015-10-20 09:33
没有找到那句,反而,找到了这么一句话using ::std::__use_no_heap;

      using ::std::__use_realtime ...

启动文件不同,在KSDK中启动文件没有Heap size定义,你可以在linker 文件scf文件中配置也是可以的
 楼主| nolanpeers 发表于 2015-10-22 17:03 | 显示全部楼层
FSL_TICS_Jeremy 发表于 2015-10-22 15:44
启动文件不同,在KSDK中启动文件没有Heap size定义,你可以在linker 文件scf文件中配置也是可以的  ...

在scf中可以?
FSL_TICS_Jeremy 发表于 2015-11-3 15:05 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

80

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

14

主题

80

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部