[英]Hard Fault Error on Arm 4 microcontroller
我的Tiva C控制器有一个问题,这很奇怪,我需要一些帮助,基本上,它在sprintf
行上崩溃,没有明显的理由。 我的应用程序只是一个智能玩具,可以通过蓝牙以各种模式进行控制。 对于这些模式,我们使用有限状态机代码并读取玩具的当前加速度,仅用于监控,并且使用周期性计时器每隔一段时间发送一次,周期性计时器每隔几秒钟生成一次周期性中断以更新其值。加速
现在,通过简单的函数读取就可以完成加速度的读取,直到尝试将其存储在字符串中,程序会抛出硬故障。 该功能(读取加速度)在玩具车的所有其他模式下均能正常工作,但这种新模式始终会崩溃并引发硬故障错误。 我目前的想法是,这可能是由于函数调用过多而导致堆栈已满,但是我怎么知道堆栈是否已满?
这是它崩溃的行:
sprintf(acceleration,"x%.2f y%.2f z%.2f", X_Axis1, Y_Axis1, Z_Axis1);
这是一个简单的sprintf
,它存储从加速度轴x
, y
和z
读取的值,然后将其存储在加速度变量中,这是为什么发生的?
这也是关于定时器处理程序内部的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;
}
首先尝试它而不调用sprintf,只需在UARTSend
发送一个硬编码字符串UARTSend
。 如果这样可以停止崩溃,则您需要找出sprintf
导致崩溃的原因。 我看到两个问题:
您为sprintf分配了22个字节的缓冲区,该缓冲区可能太小,因为每个加速仅允许六个字符(包括可能的负号和小数点)。 尝试格式化并分别发送每个加速度。 它也可能减轻sprintf中潜在的堆栈溢出。
另外,请尝试使用简化的内联字符串转换。 例如,将每个数字乘以100(为您提供2 dp定点数字),然后将其转换为整数,并使用简单的除法和mod除以10,再加上0x30(ASCII 0
)来创建字符串。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.