打印
[Kinetis]

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

[复制链接]
1183|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小智匠|  楼主 | 2015-10-15 11:01 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 小智匠 于 2015-11-6 14:09 编辑

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



新建工程,不添加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,查出进入异常的代码位置。

可以得知中断前mcu在执行_sinit:程序中调用std.isra.0的子程序:

进入子程序后,在下图中选中处进入硬异常:

请各位大神帮忙解答下。


相关帖子

沙发
小智匠|  楼主 | 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。

使用特权

评论回复
5
FSL_TICS_ZJJ| | 2015-11-5 13:18 | 只看该作者
小智匠 发表于 2015-11-5 11:05
kds里的MqxLite,没有用SDK。

那么你的串口console你配置了没有?

使用特权

评论回复
6
小智匠|  楼主 | 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文件。

使用特权

评论回复
7
小智匠|  楼主 | 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(),都可以申请到。

使用特权

评论回复
8
FSL_TICS_ZJJ| | 2015-11-6 13:38 | 只看该作者
小智匠 发表于 2015-11-6 12:23
刚刚测试了下,在Mqxlite没START前,申请是可以申请到,但是在mqxlite启动后的任务里或者中断里,都malloc ...

你现在添加几个任务,你用一个任务试试,看能申请到吗?

使用特权

评论回复
9
小智匠|  楼主 | 2015-11-6 13:59 | 只看该作者
FSL_TICS_ZJJ 发表于 2015-11-6 13:38
你现在添加几个任务,你用一个任务试试,看能申请到吗?

只有一个Task1为啥申请不到,你知道mallc的原理吗?有堆空间,为啥申请不到,是因为mqx把这个堆空间保护起来了?

使用特权

评论回复
10
FSL_TICS_ZJJ| | 2015-11-6 16:06 | 只看该作者
小智匠 发表于 2015-11-6 13:59
只有一个Task1为啥申请不到,你知道mallc的原理吗?有堆空间,为啥申请不到,是因为mqx把这个堆空间保护 ...

我帮你转给MQX工程师,让他帮你看看,所以还请耐心等待下。

使用特权

评论回复
11
FSL_TICS_DANIEL| | 2015-11-6 16:45 | 只看该作者
MQX_Lite 并不像标准版MQX那样提供动态内存分配。 MQX-Lite的内存都是在编译时静态分配的。

使用特权

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

使用特权

评论回复
13
小智匠|  楼主 | 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申请?

多谢。

使用特权

评论回复
14
小智匠|  楼主 | 2015-11-10 20:13 | 只看该作者
FSL_TICS_DANIEL 发表于 2015-11-6 17:04
楼主说的 lightweight 内存分配模块, 分配过程和标准的malloc/free类似。
默认情况下, 轻量型内存分配特 ...

在忙吗?能帮忙回答下上面的问题吗?

使用特权

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

本版积分规则

3

主题

28

帖子

0

粉丝