Part Number:TMS320F28034
大家好,我最近在移植一段EEPROM(两个产品都是28034的芯片,控制板电路不太一样)(IIC通讯,占用的是GPIO32和GPIO33这两个引脚)初始化的代码时,碰到了个问题,就是烧完程序后拔掉仿真器(XDS100V3),然后板子上电运行,程序可以正常运行,而挂上仿真器在线运行时,程序会在某一条访问EEPROM的代码处跳到错误中断或者跳到一段位置的空间。
我有点困惑,在线运行和离线运行到底有什么区别?因为程序都是一套程序,离线运行是没有问题的,那是不是可以说我的城续应该是没问题的呢?
谢谢!
Green Deng:
额,一般都是在线运行没问题,离线之后出现问题的,你这边比较例外啊。
一般来说,两者除了引导方式(程序入口地址之类的)和程序执行速度(ram比flash速度快很多)之外,其他应该没什么大的区别了。我看你的引脚跟启动方式也没什么关系。
user4612577 说:程序会在某一条访问EEPROM的代码处跳到错误中断或者跳到一段位置的空间
这条代码是不固定的吗?随机某一条代码?跳入的错误中断或者位置空间也是不固定的?
,
user4612577:
早上又跑了一下,发现全速运行时会进ILLEGAL_ISR,有时会进入0x3FF599
,
user4612577:
你好,我发现是在执行一条类似frqFdbLpf.calc(&frqFdbLpf)这样的函数指针时,会进非法中断,这条语句是以函数指针的形式去访问一个名为LpfCalc的函数,我将该条函数指针屏蔽,然后直接调用LpfCalc,是可以正常执行的,请问带不带仿真器会对函数指针这样的语句产生影响吗?为啥啊。。。
,
user4612577:
我发现是函数指针初始化的方式问题。
如图1所示,为函数指针的定义形式,在结构体的最开始位置,图2是函数中初始化该结构体的方式,其中LINE_STRTUCT_DEFALUTS为宏定义,对应是(void (*)(void *))LineCalc。
图1
图2
我发现按照这种方式初始化函数指针,在线查看calc的值是0,也就是说函数指针并没有成功的获取函数LineCalc的地址,因此在调用aiLine.calc()函数时,相当于访问了地址0处,当然会进非法中断。
后来我按照图3所示的方式初始化函数指针,在线查看calc的值是正常的,调用aiLine.calc()也不会进非法中断。
图3
因此可以说就是函数指针初始化的方式有问题。
可还有一个问题,按照最开始的初始化方式,离线运行时是不会进入非法中断,程序可以正常执行;可插上仿真器在线全速运行时却不行,只能通过第二种初始化方式才能正常运行。这是为啥呢?
,
Green Deng:
你好,看了一下你的描述,确实没有这方面的线索和类似经历。这个问题可能需要你在英文E2E论坛咨询一下:e2e.ti.com/…/c2000-microcontrollers-forum
,
user4612577:
好的,我试一下,谢谢你