各位大俠好,
目前我移植的是uCOS III+STM32版本,出現的問題現象如下:
1. 當我觸發一個外部中斷進入“void PUMP_Int(s16 index)”中斷服務子函式,只要呼叫"PollPrintf"就會出現"HardFault例外", 從這個看應該是記憶體溢位。
PollPrintf中有256位元組堆疊分配,但我的系統堆疊和堆都比較充足,我嘗試加大系統的堆疊和堆大小,問題依然沒有解決,因此估計跟系統堆疊和堆沒有關系。
======================================================
Stack_Size EQU 0x00000800
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
; <h> Heap Configuration
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Heap_Size EQU 0x00002000
2. 我又懷疑是因為系統的中斷嵌套導致的問題,因此我又把中斷的搶占配置去掉,只留下子優先級,問題依然未得到解決。
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); ..............................不設定搶占優先級,只有子優先級
以下代碼斷詳細交待了中斷的配置情況以及錯誤產生的地點,煩請幫我看看是否有什么地方不對,謝謝。
void BSP_InterruptConfig(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Deinitializes the NVIC */
/* Set the Vector Table base address at 0x08000000 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x00);
//NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x3000);
/* Configure the Priority Group to 2 bits */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); ..............................不設定搶占優先級,只有子優先級
/* Enable the EXTI(15:10) Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* Enable the USART2 Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* Enable the USART1 Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* Enable the USART3 Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 4;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* Enable the TIM3 Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 5;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* Enable the EXTI(15:10) Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 6; ...............................子優先級為6
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* Enable the TIM1 Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_TIM10_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 7;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void EXTI9_5_IRQHandler(void) ........................中斷服務句柄
{
OSIntEnter();
if (EXTI_GetITStatus(EXTI_Line8) != RESET)
{
EXTI_ClearITPendingBit(EXTI_Line8);
#if FUNC_PUMP
PUMP_Int(0);
#endif
}
if (EXTI_GetITStatus(EXTI_Line9) != RESET)
{
EXTI_ClearITPendingBit(EXTI_Line9);
#if FUNC_PUMP
PUMP_Int(1);
#endif
}
OSIntExit();
}
void PUMP_Int(s16 index)
{
if (index >= MAX_PUMP)
{
return;
}
if (DebounceCnt[index] > 0)
{
return;
}
DebounceCnt[index] = Config->PumpFunc.DebounceDelay[index];
SecPump[index]++;
if (index == 0)
{
if (!Config->RemotOut.remoteoutE[0])
{
return;
}
if (StartCntStrokePerMin)
{
McStrokePerMinCnt ++;
if (Config->PumpFunc.PumpStrokeMode) //Half stroke mode
{
if (DropFlag)
{
McStrokePerMinCnt--;
}
else
{
PollPrintf("Mc strokes counter:%d\r\n", McStrokePerMinCnt);
}
}
else
{
PollPrintf("Mc strokes counter:%d\r\n", McStrokePerMinCnt);
}
}
else
{
McStrokePerMinCnt = 0;
}
if (TotalMotorPump == 0)
{
if (StrokeMeasure == 0)
{
CaliSec = 0;
}
}
TotalMotorPump++;
if (Config->PumpFunc.PumpStrokeMode) //Half stroke mode
{
if (DropFlag)
{
TotalMotorPump--;
DropFlag = 0;
return;
}
else
{
DropFlag = 1;
}
}
if (CalibrateMotorSpeed)
{
PollPrintf("Motor pump strokes:%d\r\n", TotalMotorPump); ..........................每次只要呼叫此句列印資訊即可導致系統進入“void HardFault_Handler(void) ”,單步跟蹤至此函式結束并未發現此句有記憶體溢位情況,當繼續往下運行時立即會進入HardFault例外中斷,估計是中斷整體壓堆疊造成的問,但如若在函式中不呼叫此句列印,則不會出現這樣的情況,列印陳述句的定義見下面。
if (StrokeMeasure > 0)
{
SoftIrq_UnRegister(PUMP_SpdMeasureTimeOut);
}
}
}
}
s32 PollPrintf(s8 * format, ...)
{
s32 n;
s8 buf[256] = {0};
va_list ap;
va_start(ap,format);
n = vsprintf(buf, format, ap);
BSP_UartPollSendData(USART1, (void *)buf, n); 此陳述句內只是純粹向串口輸出資料,再無記憶體分配了
LOG_FifoWrite((u8 *)buf, n);
va_end(ap);
return n;
}
uj5u.com熱心網友回復:
你都用3啦,好像很新那,我覺得rt-thread也不錯uj5u.com熱心網友回復:
如果不是記憶體溢位,那么檢查USART1有沒有使能,有沒有初始化過,沒有的話呼叫BSP_UartPollSendData也會出現你說的現象。uj5u.com熱心網友回復:
調高一下 OS_CFG_ISR_STK_SIZE 試試轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/154148.html
標籤:單片機/工控
下一篇:stm32的ADC
