OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3033|回复: 7

stm32函数运行问题,没加static却出现了函数中数据的保持

[复制链接]

33

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
314
金钱
314
注册时间
2019-11-12
在线时间
62 小时
发表于 2020-4-4 12:25:34 | 显示全部楼层 |阅读模式
1金钱
就是我进行adc测频有一个函数进行数据处理,主函数写了一个死循环不停调用该函数,但是我发现这个函数打印出来的数据一直不变,也就是说,函数的被调用了,但是
执行功能的时候,用的数据却是第一次处理后的数据,按理说,每次调用应该出现一个新的数据,可是一直保持一个数据,附代码(正弦波测频,测幅)
void Sin_adc()
{
  int i,j,fre;
  u32 maxnum;
   float max;
   float u;
  ADC_INIT();
  for(i=0;i<1024;i++)
   {
   input[2*i]=(float)ADC_BUF[i]-2047;
   input[2*i+1]=0;
   }
  arm_cfft_radix4_f32(&scfft,input);
   delay_ms(50);
   arm_cmplx_mag_f32(input,output,1024);
  output[0]=0;
  for(i=512;i<1024;i++)
  {
   output[i]=0;
  }
  arm_max_f32(output,1024,&max,&maxnum);
  fre=10000*(maxnum)/1024;
  u=max/512;
  u=u/4095*3.3;
  for(i=0;i<1024;i++)
  {
   output[i]=0;
   input[i]=0;
   input[i+1024]=0;
   ADC_BUF[i]=0;
  }
  printf("%d\r\n",fre);
  printf("%f\r\n",u);
  u=0;
  fre=0;
}

最佳答案

查看完整内容[请看2#楼]

没有初始化的局部变量,其值是不可预知的。 所以如果保持上一次的数据, 也是有可能的。 如果要想每次都重新初始化, 你就得对局部变量进行初始化。
冲冲冲!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2020-4-4 12:25:35 | 显示全部楼层
没有初始化的局部变量,其值是不可预知的。 所以如果保持上一次的数据, 也是有可能的。 如果要想每次都重新初始化, 你就得对局部变量进行初始化。
回复

使用道具 举报

33

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
314
金钱
314
注册时间
2019-11-12
在线时间
62 小时
 楼主| 发表于 2020-4-4 12:26:14 | 显示全部楼层
scfft在主函数声明过了
冲冲冲!
回复

使用道具 举报

33

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
314
金钱
314
注册时间
2019-11-12
在线时间
62 小时
 楼主| 发表于 2020-4-4 12:27:31 | 显示全部楼层
float output[1024];
float input[2048];
extern volatile u16 ADC_BUF[1024];
arm_cfft_radix4_instance_f32 scfft;
u8 FLAG=1;
这些都是全局变量,局部变量用的太大就会死机,如果懂的话,麻烦也解释一下
冲冲冲!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2020-4-5 01:05:34 | 显示全部楼层
悟空用大棍 发表于 2020-4-4 12:27
float output[1024];
float input[2048];
extern volatile u16 ADC_BUF[1024];

做全局变量,或者用内存管理。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

33

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
314
金钱
314
注册时间
2019-11-12
在线时间
62 小时
 楼主| 发表于 2020-4-5 23:48:04 | 显示全部楼层
正点原子 发表于 2020-4-4 12:25
没有初始化的局部变量,其值是不可预知的。 所以如果保持上一次的数据, 也是有可能的。 如果要想每次都重 ...

您指的初始化是要初始化时对数值进行赋值而不是像我那样仅仅是“初始化”,而不幅值吗?
冲冲冲!
回复

使用道具 举报

33

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
314
金钱
314
注册时间
2019-11-12
在线时间
62 小时
 楼主| 发表于 2020-4-7 19:49:08 | 显示全部楼层
悟空用大棍 发表于 2020-4-5 23:48
您指的初始化是要初始化时对数值进行赋值而不是像我那样仅仅是“初始化”,而不幅值吗?

赋值,说错了,对不起
冲冲冲!
回复

使用道具 举报

26

主题

355

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1770
金钱
1770
注册时间
2017-4-1
在线时间
432 小时
发表于 2020-4-7 20:25:45 | 显示全部楼层
全局变量编译时,keil编译器会赋初值0,但是局部变量不会,可能是一个随机值,甚至有些编译器会报错,这个赋初值的过程要养成好习惯;
局部变量过大进入hardfault_handle是因为stack溢出了,解决方法有两个,一是原子哥上面说的用malloc函数分配heap空间给缓存,二是改写启动文件中stack大小,建议用malloc,局部缓存不要开太大;
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-2 17:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表