sprinf函数进入HardFault_Handler()
float TempratureTest(){
uint8_t tmp_str={0};
/* 启动AD转换并使能AD中断 */
HAL_ADC_Start_IT(&hadcx);
float ADC_ConvertedValueLocal={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;
ADC_ConvertedValue=ADC_GetSampleAvgN(8);
ADC_ConvertedValueLocal=(float)ADC_ConvertedValue*3.3/4095;
SUM+=ADC_ConvertedValueLocal;
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={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中有调用。
首先,sprintf 能不用就不用,改用 snprintf 可以避免很多 bug,特别是那种需要全公司人挑灯夜战加急修复的安全漏洞。
第二,检查一下 SCB 里面的几个错误状态寄存器,你会看到是哪里出问题的。 都是一个sprintf(),后面的没事,前面的就有问题,也就是说这并不是sprintf()本身的问题。
请把堆、栈开大,可以避免很多问题。
这应该不上楼上说的堆,栈的问题,毕竟他是跑的裸机程序。写入的数组定义也足够大完全能满足。你仔细去查查是不是中断抢占了你在main里面调用这个函数,我的意思就是你这个函数在执行之前不断的执行中断函数没机会走到这一步。程序中设个断点看看。 一代睡神的崛起 发表于 2019-3-29 08:31
这应该不上楼上说的堆,栈的问题,毕竟他是跑的裸机程序。写入的数组定义也足够大完全能满足。你仔细去查查 ...
在程序打了断点,执行到了sprintf这个函数。把ADC_ConvertedValueLocal这个数组改小没有任何问题了,但是查看了Cstack,并没有满 toofree 发表于 2019-3-29 00:23
都是一个sprintf(),后面的没事,前面的就有问题,也就是说这并不是sprintf()本身的问题。
请把堆、栈开大 ...
运行的时候查看了Cstack,没有满,但是硬件错误中断是报Cstack越界 qenen 发表于 2019-4-1 19:27
运行的时候查看了Cstack,没有满,但是硬件错误中断是报Cstack越界
那就还是超了呗
页:
[1]