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.

TMS320F28034: 带仿真器在线运行和不带仿真器直接离线运行的区别

Part Number: TMS320F28034

大家好,我最近在移植一段EEPROM(两个产品都是28034的芯片,控制板电路不太一样)(IIC通讯,占用的是GPIO32和GPIO33这两个引脚)初始化的代码时,碰到了个问题,就是烧完程序后拔掉仿真器(XDS100V3),然后板子上电运行,程序可以正常运行,而挂上仿真器在线运行时,程序会在某一条访问EEPROM的代码处跳到错误中断或者跳到一段位置的空间。

我有点困惑,在线运行和离线运行到底有什么区别?因为程序都是一套程序,离线运行是没有问题的,那是不是可以说我的城续应该是没问题的呢?

谢谢!

  • 额,一般都是在线运行没问题,离线之后出现问题的,你这边比较例外啊。

    一般来说,两者除了引导方式(程序入口地址之类的)和程序执行速度(ram比flash速度快很多)之外,其他应该没什么大的区别了。我看你的引脚跟启动方式也没什么关系。

    程序会在某一条访问EEPROM的代码处跳到错误中断或者跳到一段位置的空间

    这条代码是不固定的吗?随机某一条代码?跳入的错误中断或者位置空间也是不固定的?

  • 早上又跑了一下,发现全速运行时会进ILLEGAL_ISR,有时会进入0x3FF599

  • 你好,我发现是在执行一条类似frqFdbLpf.calc(&frqFdbLpf)这样的函数指针时,会进非法中断,这条语句是以函数指针的形式去访问一个名为LpfCalc的函数,我将该条函数指针屏蔽,然后直接调用LpfCalc,是可以正常执行的,请问带不带仿真器会对函数指针这样的语句产生影响吗?为啥啊。。。

  • 我发现是函数指针初始化的方式问题。

    如图1所示,为函数指针的定义形式,在结构体的最开始位置,图2是函数中初始化该结构体的方式,其中LINE_STRTUCT_DEFALUTS为宏定义,对应是(void (*)(void *))LineCalc。

     图1

     图2

    我发现按照这种方式初始化函数指针,在线查看calc的值是0,也就是说函数指针并没有成功的获取函数LineCalc的地址,因此在调用aiLine.calc()函数时,相当于访问了地址0处,当然会进非法中断。

    后来我按照图3所示的方式初始化函数指针,在线查看calc的值是正常的,调用aiLine.calc()也不会进非法中断。

     图3

    因此可以说就是函数指针初始化的方式有问题。

    可还有一个问题,按照最开始的初始化方式,离线运行时是不会进入非法中断,程序可以正常执行;可插上仿真器在线全速运行时却不行,只能通过第二种初始化方式才能正常运行。这是为啥呢?

  • 你好,看了一下你的描述,确实没有这方面的线索和类似经历。这个问题可能需要你在英文E2E论坛咨询一下:e2e.ti.com/.../c2000-microcontrollers-forum

  • 好的,我试一下,谢谢你