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.

[参考译文] TM4C123GH6PM:sprintf 会导致 faultISR 循环

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1205105/tm4c123gh6pm-sprintf-results-in-faultisr-loop

器件型号:TM4C123GH6PM

你好

我用 HMC5883L 芯片在单次测量模式下测量磁场、并通过 UART 将数据传输到 PC。  

使用 sprintf 函数时、程序崩溃(进入 faultISR 循环)。 通常、它仅在第二次使用该函数时发生、并且第一次调用的所有内容实际上都通过 UART 良好地传输(不是每次都这样)。

我曾尝试在项目属性窗口中将堆和堆栈大小增加到3072和2048、但这样没有解决问题。  

以下是使用 sprintf 函数的程序部分:

uint32_t measxL、measxH、measyL、measyH、measzL、 measzh;
int16_t measx、measy、measz;
char meas[30];

while (1)  //每个周期都将进行测量

   //单测量模式
   reg = 0x02;//连接到 CRA 寄存器
   值= 0x01;//单测量模式
   HMC_I2C_TRANSMIT (SLAVE_ADDRESS、reg、value);//发送到 HMC5883L 进行配置

   vTaskDelay (10/portTICK _RATE_MS);//等待10ms 以便执行测量(也可以监控 DRDY)

   //读取 HMC5883L 寄存器中的数据
   HMC_I2C_measurement (SLAVE_ADDRESS、0x06、&measxL、&measxH、&measyL、 &measyH、&measzL、&measzH);

   measx =((measxH & 0xFF)<< 8)| measxL;
   measy =((measyH & 0xFF)<< 8)| measyL;
   measz =((measzH & 0xFF)<< 8)| measzL;

   sprintf (测量值、"%d、%d、%d"、measx、measy、measz);
   uart0_printstring (meas);

   vTaskDelay (1000/ portTICK _RATE_MS);//等待1000ms 以便进行下一次测量
}

我刚开始使用该微控制器、所以是初学者。 我已经尝试查看其他类似这样的帖子: https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1186770/tm4c123gh6pm-sprintf-with-float---printf_support-full-and-stack-size-to-1024-crashes

还有这个: https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/446764/problems-moving-to-second-stage-hello-world

但它没有解决我的问题,最后一个对我来说,在这个时候太先进了。  

我已经包含了所需的库、CCS 没有给我任何抱怨。  

此致、

西蒙

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

       sprintf (测量值、"%d、%d、%d"、measx、measy、measz);

    第一步:将其替换为:

       snprintf (meas、sizeof (meas)、"%d、%d、%d"、(int32_t) measx、(int32_t) measy、(int32_t) measz);

    即使它不能修复您的(即刻)症状、它也可以避免许多危险。

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

    您好、Simon、

    首先尝试布鲁斯的建议。 除此之外、我建议使用以下文档尝试跟踪触发问题的原因: https://www.ti.com/lit/pdf/spma043

    如果在调用之前使用了大量堆栈、则增加的可能性还不够、但如果这是堆栈问题、我会感到意外。

    我真的同意 Amit 在之前的一个线程中的帖子只是使用 TivaWare 中的 UARTprintf、因为你只是在做 UART --> PC。

    此致、

    拉尔夫·雅各比