你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

sprinf函数进入HardFault_Handler()

[复制链接]
qenen 提问时间:2019-3-28 21:45 /
float TempratureTest()
{
  uint8_t tmp_str[30]={0};
  /* 启动AD转换并使能AD中断 */
  HAL_ADC_Start_IT(&hadcx);
  float ADC_ConvertedValueLocal[Nave]={0};// 用于保存转换计算后的电压值
  float SUM,begin,temp,tempc,templ,Ave,area;
  uint16_t ADC_ConvertedValue;
  int i,j;
  SUM=0;
  templ=0;
  area=0;
  /*初始温度测量*/
  for(i=0;i<Nave;i++)
  {
    SUM+=(float)ADC_GetSampleAvgN(8);
    HAL_Delay(10);//10ms测量一次
  }
  begin=SUM/Nave*3.3/4095;//初始电压值
  RELAY_OFF();//输出高电平,继电器(公共端——常开),打开激光
  HAL_Delay(50);
  /*温度测量*/
  SUM=0;
  for(i=0;i<N/Nave;i++)
  {
    for(j=0;j<Nave;j++)
    {
      SUM-=ADC_ConvertedValueLocal[j];
      ADC_ConvertedValue=ADC_GetSampleAvgN(8);
      ADC_ConvertedValueLocal[j]=(float)ADC_ConvertedValue*3.3/4095;
      SUM+=ADC_ConvertedValueLocal[j];
      if(i==0)
      {
        Ave=SUM/(j+1);
      }
      else
      {
        Ave=SUM/Nave;
      }
      /*lmt86*/
      temp=Ave*1000*(-0.092)+193.56;//实际温度
      tempc=(Ave-begin)*1000*(-0.092);//温度变化量
      area+=(templ+tempc)/2*0.01;
      templ=tempc;
      HMI_curve_setting(1,0,(int)(tempc*16));
      sprintf((char *)tmp_str,"%s.txt=\"%.4f\"","t2",23.768);
      HAL_Delay(100);
    }
  }
  RELAY_ON();//输出低电平,激光关闭
  HAL_ADC_DeInit(&hadcx);//关闭AD转换
  return area;
}
同一个程序,在调用该函数在sprintf((char *)tmp_str,"%s.txt=\"%.4f\"","t2",23.768);句进入HardFault_Handler()
调用下面这个函数时没有任何错误
float RealTest()
{
  /* 启动AD转换并使能AD中断 */
  HAL_ADC_Start_IT(&hadcx);
  float temp;
       uint8_t tmp_str[30]={0};
  temp=3.3*ADC_GetSampleAvgN(8)/4095*1000*(-0.092)+192.93578;//LMT86
  sprintf((char *)tmp_str,"%s.txt=\"%.4f\"","t2",23.768);
  return temp;
}

这两个函数均在int main中有调用。
收藏 评论6 发布时间:2019-3-28 21:45

举报

6个回答
maxtch 回答时间:2019-3-29 00:08:48
首先,sprintf 能不用就不用,改用 snprintf 可以避免很多 bug,特别是那种需要全公司人挑灯夜战加急修复的安全漏洞。

第二,检查一下 SCB 里面的几个错误状态寄存器,你会看到是哪里出问题的。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

七哥 回答时间:2019-3-29 00:23:35
都是一个sprintf(),后面的没事,前面的就有问题,也就是说这并不是sprintf()本身的问题。
请把堆、栈开大,可以避免很多问题。

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

一代睡神的崛起 回答时间:2019-3-29 08:31:46
这应该不上楼上说的堆,栈的问题,毕竟他是跑的裸机程序。写入的数组定义也足够大完全能满足。你仔细去查查是不是中断抢占了你在main里面调用这个函数,我的意思就是你这个函数在执行之前不断的执行中断函数没机会走到这一步。程序中设个断点看看。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

qenen 回答时间:2019-4-1 19:27:00
一代睡神的崛起 发表于 2019-3-29 08:31
这应该不上楼上说的堆,栈的问题,毕竟他是跑的裸机程序。写入的数组定义也足够大完全能满足。你仔细去查查 ...

在程序打了断点,执行到了sprintf这个函数。把ADC_ConvertedValueLocal[Nave]这个数组改小没有任何问题了,但是查看了Cstack,并没有满
qenen 回答时间:2019-4-1 19:27:54
toofree 发表于 2019-3-29 00:23
都是一个sprintf(),后面的没事,前面的就有问题,也就是说这并不是sprintf()本身的问题。
请把堆、栈开大 ...

运行的时候查看了Cstack,没有满,但是硬件错误中断是报Cstack越界
七哥 回答时间:2019-4-1 19:34:09
qenen 发表于 2019-4-1 19:27
运行的时候查看了Cstack,没有满,但是硬件错误中断是报Cstack越界

那就还是超了呗

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版