This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

SP指针溢出问题,现象有点奇怪?

Other Parts Discussed in Thread: CC1101

我用的MSP4305418A 的芯片,板子是自己做的,

问题1:今天突然出现程序下载之后,在线调试可以运行,仿真器断电之后就是无法运行程序,

开始以为程序没有烧写的进去,后来的我用LITE-PRO 把TXT的文件烧写进去还是不行。

但是过了段时间,我去吃了个午饭之后又可以了,不知道是什么原因引起的这个问题?

问题2:

后来发现可以之后,我全速运行的时候,我单片机没有什么问题,但是我点击暂停的时候,程序会停在MOVA @PC,SP的地方导致单片机复位,但是我要是不暂停程序,用在主函数的入口设置断电,程序又不会复位,对于这个现象,我目前的能力无法理解,我也无法查原因,stack point 指针溢出,我查了数组,基本都没有问题,后来我还用__no_init定义了数组还是这个样子,我看反汇编 程序停留在这个地方

导致程序复位,看地方觉得是定时器有问题,但是我无法理解定时器出现问题导致SP指针溢出?而且要让指针停留在这个地方,得暂停程序,在程序中设置断点,都不会出现单片机复位的情况,请专家指点下~~~

TA1CTL = TASSEL_2 + MC_2 +TAIE;//+ID_1 ; // SMCLK, contmode, clear TAR
TA1CCTL1=CM_2+CAP+CCIS_0+SCS+CCIE;

这个是定时器的设置,没有问题,中断入口我也给了?专家能否给点建议怎么查这个问题,谢谢~~

  • roy1,

    关于问题1,你整体程序实现的是什么功能?你如果知道仿真器断电之后就是无法运行程序?下次遇到这种情况时,直接下载一个闪灯程序断开仿真器运行一下,首先排除硬件电路连接不稳定故障。

    关于问题2,你的stack多大?你试着在线调试时,首先把stack中填充一样的内容,例如0x55,,然后restart运行程序,一段时间后,停下来看看堆栈是否溢出,如果填充内容已经全部被修改,可扩大stack再试试。

    你先尝试一下看看结果怎么样。O(∩_∩)O~

  • 抱歉,O(∩_∩)O~

    关于问题1,你整体程序实现的是什么功能?你如何知道仿真器断电之后就是无法运行程序?下次遇到这种情况时,直接下载一个闪灯程序断开仿真器运行一下,首先排除硬件电路连接不稳定故障。

  • 你好,谢谢你的回答,关于问题1,我判断程序断电之后丢失,我因为我通过(CC1101)master 去搜索我的slave ,我发现一只搜索不到,但是插上JATG运行之后是可以的,断开JATG,在重新插上去就搜索不到我的slave,后来我加上了开机点亮LED,还是这样的情况.

    关于问题2:您说填充0X55 是什么意思,能具体点么?您的意思是加上判断位,看Stack,是否被改动么?还有关于程序停在那个地方,可能的原因是什么?

  • roy1, 

    1. 请问你加了开机点亮LED后,断开JTAG之后LED是不亮的吗? 如果是这样的话,一般而言,MSP430的程序是存储在flash中的,是不会在程序断电后丢失的。请检查下面几点:

    A.不连JTAG时,是否给系统供电?(连着JTAG时,系统供电时从JTAG来的,还是外部来的?)

    B.复位电路是否正确,不连JTAG时,MSP430是否可以正常复位并运行?

    2. 请问你用的是CCS还是IAR?如果是CCS的话,首先可以通过生成的.map文件查看.stack所在的地址,其实就是在RAM的某个地址,后连接JTAG后,在MEmory Browser中直接输入对应地址,回车,而且你也知道你设置的stack的大小,后在对应地址处右击->fill  memory, 如下图所示,填充0x55后,restart,直接运行,可设断点,也可一段时间后,停止。查看stack的情况即可。

  • 如果你使用的是IAR的话,Options-> Linker-> List-> 选上 generate linking listing-> OK. Rebuild ,后查看生成的.map 中 CSTACK的起始地址和长度,后操作方法如下:

    1   连接JTAG下载程序;

    2   选择window/memory,打开memory窗口

    3   输入stack起始地址,回车

    4  选中对应区域,右键选择memory fill

    5  在memory fill中填充固定数据,例如0x55

    6  运行程序,跑一遍设计的所有功能,再停止cspy,看看memory窗口

    7  如果再填充的区域内已经没有0x55存在,就说明已经发生堆栈溢出或是会有溢出的危险(ram刚好够用)。最好保留一定余量的数值不被改变,以防发生溢出

    如果证实stack 溢出,请增大stack再试。