打印
[8/16-bit MCU]

cotex_M4 裸机时有关malloc的使用。

[复制链接]
1741|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

请问大神们,我用了一块ARM,M4的,在编程时由于前面需要定义两个数组,各位10000个浮点数,我想用malloc然后使用完后在释放,
可是问题是程序根本就不会动。
而我改变分配的大小时倒是可以?为什么?是内存不够用吗?

相关帖子

沙发
Tennasi| | 2015-10-15 21:21 | 只看该作者
应该不是内存分配的问题

使用特权

评论回复
板凳
ianhom| | 2015-10-16 09:09 | 只看该作者
不知道你的堆区域设置了多大,如果你用的是iar的话可以看一下.icf文件中heap的size,一般malloc失败都是堆空间不够造成的,可以适当调大堆区域再试试看

使用特权

评论回复
评论
hdp7891000 2015-10-16 12:36 回复TA
顶! 
地板
lovecat2015| | 2015-10-16 09:15 | 只看该作者
这个得看你申请的堆区有多大了

使用特权

评论回复
5
FSL_TICS_Jeremy| | 2015-10-16 09:20 | 只看该作者
不太明白你的问题,请描述清楚一点

使用特权

评论回复
6
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里设置一下?还是在头文件哪里改?

使用特权

评论回复
7
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

使用特权

评论回复
8
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

使用特权

评论回复
9
nolanpeers|  楼主 | 2015-10-16 16:51 | 只看该作者
ianhom 发表于 2015-10-16 14:43
heap设置的小,内存再大也没有用,你上网搜一下keil在哪里设置heap的size

大神说得对。可是飞思卡尔的heap的size在那个文件里知道吗?找了半天不知道地方:L

使用特权

评论回复
10
ianhom| | 2015-10-16 17:54 | 只看该作者
本帖最后由 ianhom 于 2015-10-17 08:49 编辑
nolanpeers 发表于 2015-10-16 16:51
大神说得对。可是飞思卡尔的heap的size在那个文件里知道吗?找了半天不知道地方 ...

你可以找找启动文件,看看Heap

使用特权

评论回复
11
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

使用特权

评论回复
12
FSL_TICS_Jeremy| | 2015-10-19 15:27 | 只看该作者
nolanpeers 发表于 2015-10-19 09:40
我这里只有Flash Configuration一个选项,其余的都没有跳出来,是不是禁掉了?如何解决,您知道吗?@FSL_T ...

你可以打开启动文件,然后在里面找到Heap_Size   EQU , 然后直接修改也是可以的

使用特权

评论回复
13
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 (987.57 KB )

11.jpg

12.bmp (529.26 KB )

12.bmp

使用特权

评论回复
14
FSL_TICS_Jeremy| | 2015-10-20 13:40 | 只看该作者
nolanpeers 发表于 2015-10-20 09:33
没有找到那句,反而,找到了这么一句话using ::std::__use_no_heap;

      using ::std::__use_realtime ...

没找到啊!
那你的启动文件是什么样子的嫩?

使用特权

评论回复
15
nolanpeers|  楼主 | 2015-10-20 16:28 | 只看该作者
FSL_TICS_Jeremy 发表于 2015-10-20 13:40
没找到啊!
那你的启动文件是什么样子的嫩?

用的是KSDK_1.2.0自带的启动文件,想修改heap_size大小,想用malloc来分配内存大小,可是分配太大程序也不报错,只是不执行。改小一点就正常运行了

使用特权

评论回复
16
nolanpeers|  楼主 | 2015-10-22 10:55 | 只看该作者
FSL_TICS_Jeremy 发表于 2015-10-20 13:40
没找到啊!
那你的启动文件是什么样子的嫩?

请问大神,有解决办法吗?

使用特权

评论回复
17
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文件中配置也是可以的

使用特权

评论回复
18
nolanpeers|  楼主 | 2015-10-22 17:03 | 只看该作者
FSL_TICS_Jeremy 发表于 2015-10-22 15:44
启动文件不同,在KSDK中启动文件没有Heap size定义,你可以在linker 文件scf文件中配置也是可以的  ...

在scf中可以?

使用特权

评论回复
19
FSL_TICS_Jeremy| | 2015-11-3 15:05 | 只看该作者

对的

使用特权

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

本版积分规则

14

主题

80

帖子

0

粉丝