硬汉嵌入式论坛

 找回密码
 立即注册
查看: 825|回复: 7
收起左侧

[技术讨论] 函数内局部变量数组地址变化

[复制链接]

5

主题

22

回帖

37

积分

新手上路

积分
37
发表于 2024-11-1 11:37:32 | 显示全部楼层 |阅读模式
用AT32F403A和FreeRtos做的一个工程,AD采样里电池adc,usb adc,和一个旋转电位器adc(0x0000 - 0x0FFF)。AD采样回来做中位值平均滤波时,旋转电位器处于0x29以下时跑旋转电位器的adc滤波算法时,会出现算法中的函数局部变量数组的地址跑到电池adc的滤波算法中的局部变量数组的地址中,这个现象会导致滤波后的数据异常,但是跑一会以后电位器adc滤波算法中的局部变量数组的地址又会去到另一个地址保持不变。电位器adc滤波跟电池adc一个在线程跑一个在空闲任务跑,两个滤波算法是一样的,但是是在各自文件中定义的算法,没有共用同一个算法函数。这个是个什么样的情况,想问问有没有懂这方面的大佬这是为什么。
[C] 纯文本查看 复制代码
uint16_t xx_Filter(uint16_t *ADC_BUF, uint_8 count)
{
  uint8_t i,j=0;
  uint16_t temp;
  uint16_t ADC_cpy_speed[count];
  uint32_t sum = 0;

  for(i = 0;i < count; i++)
  {
    if(ADC_BUF[i] != 0)
      ADC_cpy_speed[i] = ADC_BUF[i];
  }
  for(j = 0;j<count;j++)
  {
    for(i = 0;i < count-j-1;i++)
    {
      if(ADC_cpy_speed[i]>ADC_cpy_speed[i+1]){
        temp = ADC_cpy_speed[i];
        ADC_cpy_speed[i] = ADC_cpy_speed[i+1];
        ADC_cpy_speed[i+1] = temp;
      }
    }
  }

  for(i = 2;i<(count -1);i++)
  {
    sum = sum + ADC_cpy_speed[i];
  }
  
  return sum;
}
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2024-11-1 12:14:09 | 显示全部楼层
uint16_t ADC_cpy_speed[count]; 这个别这么配置,使用FreeRTOS的动态内存API申请。使用完毕了释放
回复

使用道具 举报

5

主题

22

回帖

37

积分

新手上路

积分
37
 楼主| 发表于 2024-11-1 15:54:12 | 显示全部楼层
eric2013 发表于 2024-11-1 12:14
uint16_t ADC_cpy_speed[count]; 这个别这么配置,使用FreeRTOS的动态内存API申请。使用完毕了释放

那这样的操作就是避免出现访问到其他内存地址的数据嘛
回复

使用道具 举报

6

主题

306

回帖

324

积分

高级会员

积分
324
发表于 2024-11-1 16:13:30 | 显示全部楼层
动态局部数组我C语言还没玩过
你搞成静态数组吧,
回复

使用道具 举报

5

主题

22

回帖

37

积分

新手上路

积分
37
 楼主| 发表于 2024-11-1 16:28:05 | 显示全部楼层
fxyc87 发表于 2024-11-1 16:13
动态局部数组我C语言还没玩过
你搞成静态数组吧,

ok,目前来看改成静态局部数组能解决问题
回复

使用道具 举报

25

主题

232

回帖

307

积分

高级会员

积分
307
QQ
发表于 2024-11-1 20:25:22 | 显示全部楼层
确定是空闲任务?configMINIMAL_STACK_SIZE 配置值是多大?
看起来是栈溢出的问题,有没有源码拿来研究一下
回复

使用道具 举报

5

主题

22

回帖

37

积分

新手上路

积分
37
 楼主| 发表于 2024-11-4 08:42:36 | 显示全部楼层
本帖最后由 cmz 于 2024-11-4 08:59 编辑
yono 发表于 2024-11-1 20:25
确定是空闲任务?configMINIMAL_STACK_SIZE 配置值是多大?
看起来是栈溢出的问题,有没有源码拿来研究一 ...

确定,写在了空闲任务。这个参数配置的512。这个源码不方便,因为是公司产品。请问这种问题一般怎么去查到问题源头呢
回复

使用道具 举报

5

主题

22

回帖

37

积分

新手上路

积分
37
 楼主| 发表于 2024-11-4 08:44:08 | 显示全部楼层
yono 发表于 2024-11-1 20:25
确定是空闲任务?configMINIMAL_STACK_SIZE 配置值是多大?
看起来是栈溢出的问题,有没有源码拿来研究一 ...

是空闲任务
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 06:28 , Processed in 0.047474 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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