首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Arm 4单片机的硬故障误差

Arm 4单片机的硬故障误差
EN

Stack Overflow用户
提问于 2017-03-03 14:04:11
回答 1查看 505关注 0票数 0

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

现在,加速度的读取是通过一个简单的函数来完成的,读取很好,直到尝试将读取存储在字符串中,程序就会抛出一个严重的错误。这个函数(读取加速度)在玩具汽车的所有其他模式中都工作得很好,除了这个新的模式,它总是崩溃并抛出硬故障错误。我目前的想法是,这可能是由于函数调用太多,所以堆栈已经满了,但是我怎么知道堆栈是否满?

这是它崩溃的那条线:

代码语言:javascript
复制
sprintf(acceleration,"x%.2f y%.2f z%.2f", X_Axis1, Y_Axis1, Z_Axis1); 

这是一个简单的sprintf,它存储从加速度轴xyz读取的值,然后将其存储在加速度变量中,知道为什么会发生这种情况吗?

这也是我用来调用一个ReadAccel()函数的定时器处理程序内部的故障报告,除了最近的一种模式外,它在所有模式下都能工作,所以我想我会将代码移到计时器处理程序内的函数中,以便从堆栈中保存一点,但是它仍然存在一个严重的错误。

如果有人可以重定向我如何找出这是否是一个堆栈完全错误,我将非常感谢,因为我认为这是什么。

代码语言:javascript
复制
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;  
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-03 16:07:31

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

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

此外,尝试使用简化的内联字符串转换。例如,将每个数字乘以100 (给出一个2 dp不动点号)后,将其转换为int,并使用简单除法和mod 10,以及添加到0x30 (ASCII 0)来创建字符串。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42580958

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档