我的Tiva C控制器有问题非常奇怪,我想要一些帮助,基本上它在sprintf
线上崩溃,没有明显的理由这样做。我的应用程序只是一个智能玩具,可以通过蓝牙在各种模式下进行控制。对于模式,我们使用有限状态机代码并读取玩具的当前加速度仅用于监控,并且每隔一段时间使用周期性定时器发送它,每隔几秒产生一次周期性中断以更新值。加速
现在,通过一个简单的函数读取加速度就可以了,直到尝试将该读数存储在一个字符串中,并且程序只会引发一个严重的错误。这个功能(读取加速度)在玩具车的所有其他模式下都能正常工作,除了这种新模式它始终崩溃并抛出硬故障错误。我目前的想法是,它可能是由于太多的函数调用,所以堆栈已满,但我怎么知道堆栈是否已满?
这是它崩溃的一条线:
sprintf(acceleration,"x%.2f y%.2f z%.2f", X_Axis1, Y_Axis1, Z_Axis1);
这是一个简单的sprintf
,它存储从加速轴x
,y
和z
读取的值,然后存储在加速变量中,知道为什么会发生这种情况?< / p>
这也是定时器处理程序里面keil的故障报告我用来调用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;
}
答案 0 :(得分:5)
首先在没有调用sprintf的情况下尝试它,只需在UARTSend
中发送一个硬编码字符串。如果这样可以阻止崩溃,那么您需要找出sprintf
导致崩溃的原因。我看到两个问题:
为sprintf分配一个22字节的缓冲区,这个缓冲区可能太小,因为每个加速只允许六个字符(包括可能的减号和小数点)。尝试格式化并单独发送每个加速度。它也可能减轻sprintf中潜在的堆栈溢出。
另外,尝试使用简化的内联字符串转换。例如将每个数字乘以100后得到一个int(给出一个2 dp的定点数)并使用简单除法和mod加10并加上0x30(ASCII 0
)来创建字符串。