查看: 2898|回复: 6

[分享] 发现KDS的一个BUG,请FAE确认看看

[复制链接]

该用户从未签到

3

主题

143

帖子

0

中级会员

Rank: 3Rank: 3

积分
443
最后登录
2020-10-29
发表于 2014-12-27 18:03:59 | 显示全部楼层 |阅读模式

用PE生成的一个基于k64f的工程,运行平台是FRDM-K64F。
很简单的配置,注意HEAP那里配置的允许的最大值0xffff:
QQ图片20141227175329.jpg
串口输出是uart0, PTB16和PTB17脚。
然后在main.c里面添加如下
  /* Write your code here */
  /* For example: for(;;) { } */
  printf("hello\n");


运行得到这个结果(仿真器烧成的jlink)
QQ图片20141227163015.jpg
随后把heap改为0,可以正常printf打印,当然malloc就不能用了。随后把heap逐步调大比如0x1000,也会得到以上的异常结果。
出现异常之后,FRDM的小板子断电再上电出现以下现象:
DSC_0162.JPG
注意绿灯上面的红灯微亮,大约1.5v电压的亮度,手机镜头不好表现不出来,偶尔这种情况KDS会提示被锁定,需要解锁。

请有经验的确认一下heap设置导致的库异常是否是bug?红灯微亮表达仿真器是一种什么状态?
回复

使用道具 举报

该用户从未签到

3

主题

143

帖子

0

中级会员

Rank: 3Rank: 3

积分
443
最后登录
2020-10-29
 楼主| 发表于 2014-12-29 12:38:21 | 显示全部楼层
请FAE确认一下是程序问题还是kds的问题。
回复 支持 反对

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2014-12-29 14:21:54 | 显示全部楼层
bsdpgsql 发表于 2014-12-29 12:38
请FAE确认一下是程序问题还是kds的问题。

楼主把m_data的size改为0X20000,0X30000越界了。
40.jpg
修改之后,我这边打印都没有问题。

回复 支持 反对

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2014-12-29 14:29:22 | 显示全部楼层
附件是我的测试代码,仅供参考:
K64_TEST.rar (489.97 KB, 下载次数: 2)
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

143

帖子

0

中级会员

Rank: 3Rank: 3

积分
443
最后登录
2020-10-29
 楼主| 发表于 2014-12-29 20:45:15 | 显示全部楼层
本帖最后由 bsdpgsql 于 2014-12-29 21:00 编辑
FSL_TICS_ZJJ 发表于 2014-12-29 14:29
附件是我的测试代码,仅供参考:

QQ图片20141229202645.png


找到复现方式了,我的工程里调试的时候是把semihosting关闭了,上图所示。
这时候再把heap size 从0换到0xffff会产生上面的异常。如果再换到0是没有异常的。
然后检测了heap size设置成0x100是正常的,可以malloc,可以printf,
随机再调高到0x1000,就又异常了,中间的临界我就没有测试了。

另外,我以为是调试器的问题,我把heap size=0x1000这样出现异常的二进制下载之后,断开仿真器,按frdm-k64f上的reset后终端无打印,
把heap size调下来不出现异常比如=0x0 的二进制下载之后,reset终端能正常显示。
所以我猜测是个BUG呢,毕竟heap size这个针对heap的改变,在=0, =0x100, =0x1000以上的各种改变而导致的printf给出的结果不一,就算是printf里面有malloc的需求,可heap空闲空间越多反而出了问题,这不应该是heap不足导致。

代码还是您的代码,我只是把enable semihosting去掉了,另外把usart0的波特率改成115200,另外,把printf改成
  /* Write your code here */
  /* For example: for(;;) { } */
  int *p = malloc(24);
  printf("K64_TEST %p!\n", p);
以测试malloc是否能正常。
在您的工程基础上就改了这三个地方。
麻烦您再看看。



回复 支持 反对

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2014-12-30 15:36:56 | 显示全部楼层
bsdpgsql 发表于 2014-12-29 20:45
找到复现方式了,我的工程里调试的时候是把semihosting关闭了,上图所示。
这时候再把heap size 从0换 ...

楼主,你的semihosting在哪里去掉的?
semihosting应该是和串口打印相关的。
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

143

帖子

0

中级会员

Rank: 3Rank: 3

积分
443
最后登录
2020-10-29
 楼主| 发表于 2014-12-30 15:58:23 | 显示全部楼层
FSL_TICS_ZJJ 发表于 2014-12-30 15:36
楼主,你的semihosting在哪里去掉的?
semihosting应该是和串口打印相关的。



QQ图片20141230155441.jpg

调试器里设置的。
semihosting确实和打印调试相关,问题是heap设置小的时候(甚至等于0的时候)功能正确,反而往大了调整出问题。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-7-20 14:01 , Processed in 0.106579 second(s), 26 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表