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.

[参考译文] MSP432P401R:空函数返回时出现UNDEFINSTR硬故障

Guru**** 2586705 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/615567/msp432p401r-undefinstr-hard-fault-on-void-function-return

部件号:MSP432P401R

当我从某个功能返回时,我陷入了ISR的故障。 xPSR异常寄存器读数为3,寄存器0xE000ED28读数为0x0100,在手册中翻译后,将出现UNDEFINSTR错误。

我在两个不同的处理器上尝试了相同的代码,结果相同。 导致问题的功能如下所示:

char ack[10];
gps_ga (ack);
if (ack[0]!='\0'){}
/**
*打开GPS透明模式
*获取GP精度标记,并显示精度
*关闭GPS透明模式
*
**将结果置于数据
中*
**@param data 10 character char array
*/
void gps_ga(Char* data){
char gpsResp[256];
CHAR* ACC = NULL;
字符精度[10];
IF (GPS_passthrough (true)){
执行{
getResponse_Timeout (GPS_UART_MODULE,1000,gpsResp);
acc = strstr (gpsResp,"$GPACCURACY");
} While (ACC ==空);
int i;
对于(i = 0;i < 10 && ACC[I+12]!='.' && ACC[I+12]!='*';i++){
准确度[I]= ACC[I+12];
}
精度[I]='\0';
while (!gps_passthrough (false));
strcpy (数据,准确性);
其他{
Data[0]='\0';
}
INT I = 0;
I++;
} 

函数的最后2行仅用于健全性检查。 我可以在I++上设置一个断点,我可以确认数据包含它应该包含的内容,并且准确性也是如此。 我在GPS_GA的I++和IF语句之间的某个位置得到故障ISR。 从不触发IF语句上的断点。

我正在使用编译器TI v 16.9 .1.LTS。 它是基于RGC封装的定制主板。

我也尝试过用另一种方式对函数进行编码,返回int,并出现相同的错误。 我尝试更改函数名称,但它只起过作用...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我看不到任何明显的信息,但我想你是在对堆栈中的返回指针进行编号。Accuracy只有10个位置,你可能在Accuracy中存储空值[10],这不存在。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [QUETE USER="Reid KERSEI]当我从某个功能返回时,我陷入了ISR的故障。 作为猜测,软件可能正在覆盖存储在堆栈中的返回地址,导致 GPS_GA功能尝试返回时崩溃。

    以下内容有助于确认这一点:

    a)进入 GPS_GA功能,确定存储返回地址的堆栈地址。

    b)设置硬件监视点,以在写入存储 返回地址的堆栈上的地址时触发。

    c)在I++语句上设置断点。

    恢复程序,查看硬件监视点是否在到达I++语句之前触发。 如果是,则应确定导致覆盖的违规代码。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您回答得非常正确。 我删除了返回指针。 我不知道我能像这样观看堆栈。 感谢您的信息!