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.

[参考译文] 编译器/TM4C1230E6PM:Tiva-c TM4C123上的 FaultISR 中断

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/747614/compiler-tm4c1230e6pm-faultisr-interrupt-on-tiva-c-tm4c123

器件型号:TM4C1230E6PM
主题中讨论的其他器件:TM4C123

工具/软件:TI C/C++编译器

我有一个简单的问题、我的程序被困在故障 ISR 中、

下面是我被困在故障 ISR 中的代码

int writeProgMemoryBlock (const unsigned char * data、uint16_t dataSize、uint8_t bank、uint8_t address、int verify){
//返回 writeMemoryBlock (data、dataSize、bank、address、verify、 1);
setMemoryBank (bank、0、0);
setMemoryStartAddress (address);
uint8_t chunkSize;
uint8_t *验证缓冲区;
uint8_t *程序缓冲区;
uint16_t i;
uint8_t j;
if (verify) verifyBuffer =(uint8_t *) malloc (MPU6050_DMP_MEMORY_CHUNK_SIZE);
if (1) progBuffer =(uint8_t *) malloc (MPU6050_DMP_MEMORY_ChUNK_SIZE);
对于(i = 0;i < dataSize;){
//根据组位置和数据大小确定正确的块大小
chunkSize = MPU6050_DMP_MEMORY_ChUNK_SIZE;

//确保我们不会超过数据大小
if (i + chunkSize > dataSize)
chunkSize = dataSize - I;

//确保该块不会超过组边界(256字节)
if (chunkSize > 256 -地址)
chunkSize = 256 -地址;

如果(1){
//按指定写入数据块
对于(j = 0;j < chunkSize;j++) progBuffer[j]= PGM_READ_BYTE (data + i + j);
} 否则{
//按指定写入数据块
progBuffer =(uint8_t *)数据+ i;
}

对于(i = 0;0 < chunkSize;i++){
writeByte (devAddr、MPU6050_RA_MEM_R_W、progBuffer[i]);
}




//根据需要验证数据
if (verify && verifyBuffer){
setMemoryBank (bank、0、0);
setMemoryStartAddress (address);
readBytes (devAddr、MPU6050_RA_MEM_R_W、chunkSize、verifyBuffer);
if (memcmp (progBuffer、verifyBuffer、chunkSize)!= 0){

FREE (验证缓冲区);
if (1) free (progBuffer);
返回 false;//噢。
}
}

//通过[chunkSize]增加字节索引
i += chunkSize;

// uint8_t 在256时自动回绕到0
address += chunkSize;

//如果我们没有完成,请更新组(如果需要)和地址
if (i < dataSize){
如果(地址= 0)组++;
setMemoryBank (bank、0、0);
setMemoryStartAddress (address);
}
}
if (verify) free (verifyBuffer);
if (1) free (progBuffer);
返回 true;
} 

当我尝试进行调试以进入此函数时、它会跳转到 FaultISR 函数。

如何确定问题的原因和解决方案?

我将 Code Composer Studio 与 TM4C123结合使用。 我正在尝试从 MPU6050读取 quaternion 值。 我完成了代码、但无法完成项目。

提前感谢

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

    [引用 USER="Yilmaz EDIS]如何确定问题的原因和解决方案?[/QUESP]诊断 StellarisRegistered微控制器中的软件故障 具有一些有关诊断进入 FaultISR 的原因的指导。

    此外、代码似乎使用 progBuffer 的值、而不是首先检查 malloc (MPU6050_DMP_MEMORY_ChUNK_SIZE)调用是否返回 NULL 指针。 程序是否有足够的堆空间?

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

    我已开始阅读您发布的指导。

    让我来向您展示我的调试。 我录制了一段视频来向您展示。

    drive.google.com/open

    我不熟悉 Tiva 板。 我已经尝试解决了这个问题。  

    如果您有任何其他想法、请与我分享。

    此致;

    Yılmaz Edis。

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

    由于异常发生在您进入函数时、我想知道您是否过度运行了堆栈空间。  尝试增大堆栈大小。 通常有两个步骤。  右键点击工程并选择"Show Build Settings ..."。 在"ARM 连接器"、"基本选项"下更改堆栈大小。

    然后还更改链接命令文件底部的大小。  

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

    是的、当我增加堆栈值时、问题得到了改善。 非常感谢您的参与。 但该程序在其他地方中断。 也就是说、我无法从 mpu6050读取平滑值。 这是我的学校毕业计划。 我的目标是提高季后数据稳定性、但失败了。