打印
[Kinetis]

Kinetis图形化显示stack堆栈使用情况

[复制链接]
885|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
energy1|  楼主 | 2015-3-25 20:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
energy1|  楼主 | 2015-3-25 20:05 | 只看该作者
如果我们是在使用内存空间有限的MCU(内存空间足够大的话,我们常常就把stack分配足够大就是了,反正够用就是了,呵呵),那么我们必须要控制堆栈必须足够大但不能太大(足够大是要满足程序功能的实现,而不能太大是满足内存空间的限制)。传统方法是根据一定猜测和经验来解决这个问题,或者跟踪每个函数以及它所需的空间,这种方法是麻烦的,所以IAR提供了功能强大的stack调试插件帮助我们查看stack使用情况,同时也可以跟踪一些在堆栈中分配空间的局部变量的值及其分配和释放情况(是不是很NB,哈哈)。不过这里就遇到本篇博客所要谈到的问题了,那就是在使用飞思卡尔Kinetis的Demo进行调试的时候是没法子使用这个插件的(可以调出stack window,但却看不到任何数据),而经过我的实测在STM32和NXP的Demo例程中是可以使用的且功能真的很强大。哎,我们这些飞丝们眼馋不,答案是肯定也是必须的。既然出现问题了就要解决问题,这个是不能逃避的,下面我给出了一种解决方案,当然如果有更好的方法欢迎在博客里留言,万分感谢

使用特权

评论回复
板凳
energy1|  楼主 | 2015-3-25 20:05 | 只看该作者
1.经过对比Kinetis和STM32的demo,我发现在Kinetis的demo里没有对“CSTACK”段进行实例化(“CSTACK”段,系统默认的stack地址空间,是编译器编译之后系统自己分配的,当然大小是用户自己定义的)而是在中断向量表里以__BOOT_STACK_ADDRESS标识符(在icf文件里定义,在vectors.h里调用)代替了,这样的好处是可以用户自定义堆栈指针,但是由于没有实例化”CSTACK“所以在编译之后系统把该段优化掉了,而stack window插件又刚刚好要用到CSTACK段,哎,CSTACK有种”既生瑜何生亮“的感脚啊有木有,悲剧的CSTACK就这样被优化掉了(气也被气死了)很惨啊有木有,飞思卡尔躺着中枪了有木有啊有木有。咳咳,不小心用出了有木有的排比句,自己很气愤的冲动了有木有~

使用特权

评论回复
地板
energy1|  楼主 | 2015-3-25 20:05 | 只看该作者

2.找到问题所在了就好办了(大多数情况下,出现问题了不可怕,可怕的是找不到问题的所在,呵呵),那我们就可以用”CSTACK“来替代__BOOT_STACK_ADDRESS 这个标识符了。我们打开vectors.h文件,修改如下:


使用特权

评论回复
5
energy1|  楼主 | 2015-3-25 20:06 | 只看该作者

3.之后还需要对IAR进行相应的设置,设置路径为Tools->Options->Stack,然后具体设置如下图:


使用特权

评论回复
6
energy1|  楼主 | 2015-3-25 20:06 | 只看该作者

4.其实从具体功能实现上来看,像上面更改之后就可以了,不过在之后的stack window(注意只有在调试环境下才能看到)插件中会显示stack溢出(虽然实际上堆栈指针没有溢出,具体原因我还没弄清楚),所以索性让我把Ram迁移至RAM2里(为权宜之际),在icf文件修改如下:

5.在经过以上修改之后,基本问题就解决了。先不着急调试试验,在编译通过之后,我们打开.map文件,在Entry list一栏里可以找到系统已经为CSTACK分配了地址空间和所占空间大小(空间大小为icf文件里自定义的),如下图:


使用特权

评论回复
7
energy1|  楼主 | 2015-3-25 20:06 | 只看该作者

6.在经过我们如上一番折腾之后就”柳暗花明“了。点击调试,把程序通过J-Link下载到片子之后,在调试窗口下打开View->Stack1(或者stack2),然后点击运行,之后通过暂停、单步或者自己设置断点,查看堆栈使用情况和栈空间里面的内容,非常方便,效果如下图:



使用特权

评论回复
8
598330983| | 2015-3-27 22:00 | 只看该作者
没用过,谢谢分享

使用特权

评论回复
9
FSL_TICS_ZJJ| | 2015-4-10 15:39 | 只看该作者
非常感谢你关于Kinetis的经验分享 !

使用特权

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

本版积分规则

94

主题

422

帖子

10

粉丝