Arm 4微控制器的硬故障错误

Ess*_*Eid 0 c microcontroller arm

我的Tiva C控制器有问题很奇怪,我想要一些帮助,基本上它在一条sprintf线上崩溃,没有明显的理由这样做.我的应用程序只是一个智能玩具,可以通过蓝牙在各种模式下进行控制.对于模式,我们使用有限状态机代码并读取玩具的当前加速度仅用于监控,并且每隔一段时间使用周期性定时器发送它,每隔几秒产生一次周期性中断以更新值.促进

现在,加速度的读取是通过一个简单的函数读取完成,直到尝试将该读数存储在字符串中,并且程序只是抛出一个硬故障.这个功能(读取加速度)在玩具车的所有其他模式下都能正常工作,除了这种新模式它始终崩溃并抛出硬故障错误.我目前的想法是,它可能是由于太多的函数调用所以堆栈已满,但我怎么知道堆栈是否已满?

这是它崩溃的线:

sprintf(acceleration,"x%.2f y%.2f z%.2f", X_Axis1, Y_Axis1, Z_Axis1); 
Run Code Online (Sandbox Code Playgroud)

这是一个简单的sprintf存储从加速轴读出的值x,yz为什么发生这种情况的任何想法然后存储在加速度变量?

这也是定时器处理程序里面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;  
}
Run Code Online (Sandbox Code Playgroud)

Jer*_*myP 5

首先尝试它而不调用sprintf,只需发送一个硬编码的字符串UARTSend.如果这样可以阻止崩溃,那么您需要找出sprintf导致崩溃的原因.我看到两个问题:

为sprintf分配一个22字节的缓冲区,可能太小,因为每个加速只允许六个字符(包括可能的减号和小数点).尝试格式化并单独发送每个加速度.它也可能减轻sprintf中潜在的堆栈溢出.

另外,尝试使用简化的内联字符串转换.例如,将每个数字乘以100后得到一个int(给出一个2 dp的固定点数)并使用简单除法和mod加10并加上0x30(ASCII 0)来创建字符串.