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.

STC的self-test CPU寄存器保存问题

Other Parts Discussed in Thread: HALCOGEN

TI专家

        你好,我公司正在使用TMS570LS3137PGE这款芯片,使用的开发环境是IAR

        对于STC的self-test我有几个疑问:

1、首先我看手册“technical reference manual” page341有要保存的所有寄存器的列表

对于上面的1我有几个疑问,“PC”和“R15”不就是同一个寄存器吗?寄存器“SPSR”需要保存吗?

如果我想保存上面所列的所有寄存器怎么保存,能不能给我保存所有寄存器的例子。下面是我自己尝试保存寄存器的代码

2、self-test的过程是:(1)先保存相关寄存器;(2)然后进入IDLE状态进行自检,自检完成会复位;(3)还原CPU相关寄存器;

        我的疑问是在完成(2)之后会进行复位,那我就无法执行(3),TMS570是怎么完成自检的?

3、我在HALCoGen上看到STC不能工作在debug模式下,我用“release”模式下运行,效果和debug模式下是一样的,如果不能再debug模式下运行的话,那应该         运行在什么模式下?

4、在产品软件开发中,self-test可以放在main函数里面吗?

  • 你好。

    对于上面的1我有几个疑问,“PC”和“R15”不就是同一个寄存器吗?寄存器“SPSR”需要保存吗?

    如果我想保存上面所列的所有寄存器怎么保存,能不能给我保存所有寄存器的例子。下面是我自己尝试保存寄存器的代码

    R15和PC好像是同一个。至于SPSR,多保存一些总比少保存的好。你可以试试,复位后会不会用到这个寄存器。

    2、self-test的过程是:(1)先保存相关寄存器;(2)然后进入IDLE状态进行自检,自检完成会复位;(3)还原CPU相关寄存器;

            我的疑问是在完成(2)之后会进行复位,那我就无法执行(3),TMS570是怎么完成自检的?

    还原CPU相关寄存器只能在(2)结束后来做。这也就是要求你的程序在复位后要进行判断。570上有一个寄存器会保存上一次复位的原因,你可以通过判断这个寄存器来确定复位是不是由STC引起的。如果是,那么就去做(3)的工作。

    3、我在HALCoGen上看到STC不能工作在debug模式下,我用“release”模式下运行,效果和debug模式下是一样的,如果不能再debug模式下运行的话,那应该         运行在什么模式下?

    这里说的不能在Debug模式下工作是指STC不能在仿真是使用。而你这里说的debug和release 是CCS工程中的两种配置,两者是不相干的。测试STC时,要断开仿真器,让CPU自由跑。

    4、在产品软件开发中,self-test可以放在main函数里面吗?

    可以放在Main中,但是要注意,STC后一定会复位,所以请保存好现场。

  • Jay

    我这几天认真的想了一下,再加上你的解答,对于STC的selftest有一定的进展,但还是有好多不明白的地方,我把backup的寄存器和restore的寄存器都截图放在附件里面了(公司对程序加密,只能截图),没有在初始化时进行STC自检

    第一个问题:

    我把程序下载进去后,在SYSTER寄存器里面出现了以下改变,EXTRST、CPURST、WDRST都置“1”了,这是为什么?是我程序的问题吗?如果是的话大概是哪里有问题。

    2、在selftest进入“空闲模式”后,会产生复位,程序是不是从_c_int00这个函数处开始执行?如果不是从哪里开始执行?

    我首先假设他是从_c_int00这个函数开始执行,我在此时检测CPU是否复位(CPURST是否为1),但程序进入不到_coreRestoreStackPointer_这个函数,这是为什么?暂停后程序停在下图的地方,我把寄存器的restore函数放在这里是否有不妥?应该放在哪边?

    stcSelfcheck函数如下:

    3、在存储寄存器的函数里面我修改了压入堆栈PC的值,因为我觉如果不修改的话,PC弹出后指向的是上图的_gotoCPUIdle_函数,这是不正确的,不知道我的想法对不对?请指点。修改堆栈PC的值在附件图片backup1.png中

    另外,请问可以给我你的邮箱吗?以方便联系,我的邮箱是zhuzl_sciyon@163.com   谢谢

    新建文件夹.rar
  • 1. 我试了看复位后的寄存器状态,没有出现你这样的现象。是不是你在下载程序前,寄存器状态就改了。你重新上电,再看看。

    2. 复位后程序都是从_c_int00_开始的。看到你调用_coreRestoreStackPointer_后进入undef异常,是不是你没有定义_coreRestoreStackPointer_这个函数呢?_coreRestoreStackPointer_函数放在开头应该没有问题,就是调用完后,不要再往下执行,直接跳到恢复的PC那里。

    3. 修改压栈PC的值,不会造成恢复不了吗?不是很明白你的意思。

    PS: 我的邮箱: jay-shen@ti.com