天天看點

STM32 學習之sprintf 列印浮點數時,進入HardFault_Handler

本來這段這代碼先前都已經寫過了,也調試過了。

在協定對接完了之後,為了友善後期裝置的生産和調試,就加一個序列槽指令。

case :  //讀協定參數
    protection_read_param(p_SendBuff+);
    break;
case :  //寫協定參數
    protection_write_param(p_RecvBuff+, UART1.m_ReceiveBytes-);
    break;
           

結果就悲劇了。

Data = Channel[i].data;
if(Data == )Data = ;
sprintf((char*)DataBuff, "%.6s-Rtd=%.1f,%.6s-Flag=N;",SensorCode[i],Data/,SensorCode[i]);
           

每次程式一執行到這裡,就會跳到HardFault_Handler中,不知道是什麼鬼。而且更郁悶的是前面還有好幾個類似的 列印浮點數的sprintf。

void HardFault_Handler(void)
{
  /* Go to infinite loop when Hard Fault exception occurs */
  while ()
  {
  }
}
           

後來試着将%.1f 改成%d,不會跳到HardFault_Handler 中,這下就尴尬了;

Data = Channel[i].data;
if(Data == )Data = ;
sprintf((char*)DataBuff, "%.6s-Rtd=%d,%.6s-Flag=N;",SensorCode[i],Data/,SensorCode[i]);
           

然後看到有人通過對齊ucos的堆棧資料,問題解決了,也去試了試,結果就真沒有爆出問題來了。

問題解決,UCOSII的任務堆棧沒有8位元組對齊,在聲明任務堆棧時,強制8位元組對齊就可以了,系統預設是4位元組對齊,

__align(8) static OS_STK AppTaskStartStk[APP_TASK_START_STK_SIZE];

繼續閱讀