簡體   English   中英

Arm 4微控制器上的硬故障錯誤

[英]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 ,它存儲從加速度軸xyz讀取的值,然后將其存儲在加速度變量中,這是為什么發生的?

這也是關於定時器處理程序內部的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM