jicheng0622

【原创猛料】妙手回春之Kinetis图形化显示stack堆栈使用情况

0
阅读(4330)

    哎。。。我真想仰天长叹一下,唏嘘这几天是怎么过来的,去了北京几天,过了几天苦逼的日子。似乎每次去帝都陌生感都会增加几分呢,等回到济南的时候第一个想法就是回家了真好,还是脚踩自己的地盘爽啊,哈哈~

    本来有一肚子话要说的(本来脑子里想了很多东西),不过还是忍住了,毕竟还得抓住主体。技术博客嘛,技术为重,吐槽还是次之,不然大家就不愿意看了,嘿嘿。至于常常以小说体自居,扯皮和风趣则是必需的,写文章当然主要目的是表达中心思想(谨记高中语文老师的谆谆教诲啊有木有),不过其可阅读性却是不可忽略的,否则文章写出来千篇一律谁又愿意看呢,呵呵~

    咳咳,又扯远了...好久没写“原创猛料”四个字了,这次既然写出来了就必定有重料要爆,呵呵。本来在去北京之前就已经调试和构思好本篇博客了,可惜被耽搁了,回来之后就赶紧写出来吧,不然就该忘记了,毕竟这块儿我还是调试了好长时间的。说到这里我真不得不再对飞思卡尔的工程师们吐个槽,Demo写的乱不说(已经广为大家伙诟病的),现在让我发现一个更大的问题就是你们写个IAR的demo(CW的我没深研究不提)根本就没发挥出IAR调试功能的强大,换句话说Kinetis的Demo在某些程度上是与IAR不谦容的,哎,FSL啊,我都替你愁的慌,让俺们这些个飞丝们情何以堪~哎,不提桑心事了,下面还是指出问题所在直接进入正题吧:

首先需要说的(也是大家以前在用Kinetis几乎没想到用过的)就是在线调试模式下的stack window(选中view->stack工具栏)调试插件,下面先上图展示一下官方理想的stack window效果图(注意不是实际效果图,实际效果跟IAR版本有所不同,不过大差不差)

如果我们是在使用内存空间有限的MCU(内存空间足够大的话,我们常常就把stack分配足够大就是了,反正够用就是了,呵呵),那么我们必须要控制堆栈必须足够大但不能太大(足够大是要满足程序功能的实现,而不能太大是满足内存空间的限制)。传统方法是根据一定猜测和经验来解决这个问题,或者跟踪每个函数以及它所需的空间,这种方法是麻烦的,所以IAR提供了功能强大的stack调试插件帮助我们查看stack使用情况,同时也可以跟踪一些在堆栈中分配空间的局部变量的值及其分配和释放情况(是不是很NB,哈哈)。不过这里就遇到本篇博客所要谈到的问题了,那就是在使用飞思卡尔Kinetis的Demo进行调试的时候是没法子使用这个插件的(可以调出stack window,但却看不到任何数据),而经过我的实测在STM32和NXP的Demo例程中是可以使用的且功能真的很强大。哎,我们这些飞丝们眼馋不,答案是肯定也是必须的。既然出现问题了就要解决问题,这个是不能逃避的,下面我给出了一种解决方案,当然如果有更好的方法欢迎在博客里留言,万分感谢:

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

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

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

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

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

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

 

    呼呼,喝口水... ...本篇博客单是调试就花费了我几天的时间,然后整理出来再写出来又足足花费了我一天的时间,累死了,不过成就感颇佳,嘿嘿,发现问题然后解决问题的过程是很享受的,就看我们敢不敢去尝试,还是那句话做个doer而不是viewer,希望以此句共勉之~

    另俺的【原创】系列技术博客皆为本人原创,实乃俺呕心沥血之作,如果转载请注明作者信息及出处,未完待续~