我的Tiva C控制器有一个问题,这是非常奇怪的,我想要一些帮助它,基本上它崩溃在一个sprintf线上,没有明显的理由这样做。我的应用程序只是一个智能玩具,可以通过蓝牙在各种模式下进行控制。对于模式,我们使用有限状态机代码,读取玩具当前的加速度仅用于监视,并且每隔一段时间使用周期性计时器发送一次,它每隔几秒产生一个周期性中断,以更新加速值。
现在,加速度的读取是通过一个简单的函数来完成的,读取很好,直到尝试将读取存储在字符串中,程序就会抛出一个严重的错误。这个函数(读取加速度)在玩具汽车的所有其他模式中都工作得很好,除了这个新的模式,它总是崩溃并抛出硬故障错误。我目前的想法是,这可能是由于函数调用太多,所以堆栈已经满了,但是我怎么知道堆栈是否满?
这是它崩溃的那条线:
sprintf(acceleration,"x%.2f y%.2f z%.2f", X_Axis1, Y_Axis1, Z_Axis1); 这是一个简单的sprintf,它存储从加速度轴x、y和z读取的值,然后将其存储在加速度变量中,知道为什么会发生这种情况吗?
这也是我用来调用一个ReadAccel()函数的定时器处理程序内部的故障报告,除了最近的一种模式外,它在所有模式下都能工作,所以我想我会将代码移到计时器处理程序内的函数中,以便从堆栈中保存一点,但是它仍然存在一个严重的错误。

如果有人可以重定向我如何找出这是否是一个堆栈完全错误,我将非常感谢,因为我认为这是什么。
void TIMER2A_Handler(void)
{
char acceleration[22];
RawX_Axis1=ReadAccelX();
X_Axis1 = RawX_Axis1 * 0.00390625+0.35;
RawY_Axis1=ReadAccelY();
Y_Axis1 = RawY_Axis1 * 0.00390625+0.08;
RawZ_Axis1=ReadAccelZ();
Z_Axis1 = (RawY_Axis1 * 0.00390625)+1.08;
sprintf(acceleration,"x%.2f y%.2f z%.2f",X_Axis1,Y_Axis1,Z_Axis1);
UARTSend(UART3_BASE,acceleration);
UARTCharPut(UART3_BASE,'\n');
TIMER2_RIS_R = 0xFFFFFFFF;
TIMER2_ICR_R = 0xFFFFFFFF;
}发布于 2017-03-03 16:07:31
首先,在不调用sprintf的情况下尝试它,只需在UARTSend中发送一个硬编码字符串。如果这样可以阻止崩溃,那么您需要找出sprintf造成崩溃的原因。我看到两个问题:
您为sprintf分配了一个22字节的缓冲区,这可能太小了,因为它只允许每个加速(包括可能的减号和小数点)6个字符。尝试格式化并单独发送每个加速度。它还可能减少sprintf中的潜在堆栈溢出。
此外,尝试使用简化的内联字符串转换。例如,将每个数字乘以100 (给出一个2 dp不动点号)后,将其转换为int,并使用简单除法和mod 10,以及添加到0x30 (ASCII 0)来创建字符串。
https://stackoverflow.com/questions/42580958
复制相似问题