[Kinetis] KDS的PE生成MqxLite代码Printf中malloc失败

[复制链接]
1912|13
 楼主| 小智匠 发表于 2015-10-15 11:01 | 显示全部楼层 |阅读模式
本帖最后由 小智匠 于 2015-11-6 14:09 编辑

使用KDS3.0.0的PE,生成Mqx和ConsoleIO的工程,用Printf打印会进入硬异常,打印部分代码和异常见下图:
360截图20151015102039064.jpg

图中的点.jpg
新建工程,不添加Mqx单独用ConsoleIO时,Printf能正常打印。
问题原因可能与该提问一致 [Kinetis] 如何解决printf从串口打印输出https://bbs.21ic.com/icview-994108-1-1.html,但是该问题没有给出解决方案。
参考【经验分享】CW10.x编译环境查找HardFault异常原因http://www.freescaleic.org/module/forum/thread-596127-1-1.html,查出进入异常的代码位置。
360截图20151015095637448.jpg
可以得知中断前mcu在执行_sinit:程序中调用std.isra.0的子程序:
360截图20151015100256921.jpg
进入子程序后,在下图中选中处进入硬异常:
360截图20151015100701303.jpg
请各位大神帮忙解答下。


 楼主| 小智匠 发表于 2015-10-16 14:22 | 显示全部楼层
没有人遇到过吗,在CW中用同样步骤是能够使用的。
FSL_TICS_DANIEL 发表于 2015-11-3 15:22 | 显示全部楼层
楼主用的是MQX那个版本啊, 还是KSDK中的MQX?
 楼主| 小智匠 发表于 2015-11-5 11:05 | 显示全部楼层
FSL_TICS_DANIEL 发表于 2015-11-3 15:22
楼主用的是MQX那个版本啊, 还是KSDK中的MQX?

kds里的MqxLite,没有用SDK。 惺惺惜惺惺.jpg
FSL_TICS_ZJJ 发表于 2015-11-5 13:18 | 显示全部楼层
小智匠 发表于 2015-11-5 11:05
kds里的MqxLite,没有用SDK。

那么你的串口console你配置了没有?
 楼主| 小智匠 发表于 2015-11-6 11:18 | 显示全部楼层
本帖最后由 小智匠 于 2015-11-6 11:19 编辑
FSL_TICS_ZJJ 发表于 2015-11-5 13:18
那么你的串口console你配置了没有?

单用PEx生成的_write(),是可以串口输出的。

刚刚发现是Printf()调用的_malloc_r()没有申请到内存空间。

但是。我的确有堆空间剩余的啊。下图使我的LD文件。 撒旦法.jpg
 楼主| 小智匠 发表于 2015-11-6 12:23 | 显示全部楼层
本帖最后由 小智匠 于 2015-11-6 12:24 编辑
FSL_TICS_ZJJ 发表于 2015-11-5 13:18
那么你的串口console你配置了没有?

刚刚测试了下,在Mqxlite没START前,申请是可以申请到,但是在mqxlite启动后的任务里或者中断里,都malloc不到。但是用Mqx本身自带的轻量级内存管理,的 _lwmem_alloc(),都可以申请到。
FSL_TICS_ZJJ 发表于 2015-11-6 13:38 | 显示全部楼层
小智匠 发表于 2015-11-6 12:23
刚刚测试了下,在Mqxlite没START前,申请是可以申请到,但是在mqxlite启动后的任务里或者中断里,都malloc ...

你现在添加几个任务,你用一个任务试试,看能申请到吗?
 楼主| 小智匠 发表于 2015-11-6 13:59 | 显示全部楼层
FSL_TICS_ZJJ 发表于 2015-11-6 13:38
你现在添加几个任务,你用一个任务试试,看能申请到吗?

只有一个Task1为啥申请不到,你知道mallc的原理吗?有堆空间,为啥申请不到,是因为mqx把这个堆空间保护起来了?
FSL_TICS_ZJJ 发表于 2015-11-6 16:06 | 显示全部楼层
小智匠 发表于 2015-11-6 13:59
只有一个Task1为啥申请不到,你知道mallc的原理吗?有堆空间,为啥申请不到,是因为mqx把这个堆空间保护 ...

我帮你转给MQX工程师,让他帮你看看,所以还请耐心等待下。
FSL_TICS_DANIEL 发表于 2015-11-6 16:45 | 显示全部楼层
MQX_Lite 并不像标准版MQX那样提供动态内存分配。 MQX-Lite的内存都是在编译时静态分配的。
FSL_TICS_DANIEL 发表于 2015-11-6 17:04 | 显示全部楼层
楼主说的 lightweight 内存分配模块, 分配过程和标准的malloc/free类似。
默认情况下, 轻量型内存分配特性是关闭的。可以用以下步骤开启
1 在MQX lite component properties 中设置 Lihtweight  memory allocation option  为 yes.
2 设置一个 heap size
3 右击 CPU component -> Build options-> heap size
 楼主| 小智匠 发表于 2015-11-9 17:09 | 显示全部楼层
FSL_TICS_DANIEL 发表于 2015-11-6 17:04
楼主说的 lightweight 内存分配模块, 分配过程和标准的malloc/free类似。
默认情况下, 轻量型内存分配特 ...

1、是不是意味着MqxLite使用的情况下,标准库里只要会调用malloc的函数都是不能用的?像printf(),rang();等等函数。
2、内存的静态分配是在哪里分配的啊?是LD文件里吗?还是代码里?
3、有没有办法强制使用malloc?例如静态少分配些,然后把剩余的给malloc申请?

多谢。
 楼主| 小智匠 发表于 2015-11-10 20:13 | 显示全部楼层
FSL_TICS_DANIEL 发表于 2015-11-6 17:04
楼主说的 lightweight 内存分配模块, 分配过程和标准的malloc/free类似。
默认情况下, 轻量型内存分配特 ...

在忙吗?能帮忙回答下上面的问题吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

28

帖子

0

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