打印
[STM32F1]

奇怪的bug

[复制链接]
857|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xu84403451|  楼主 | 2016-2-23 16:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 xu84403451 于 2016-2-23 17:21 编辑

下面两种方案应该是没有区别的,但一个正常,一个不正常,希望哪位大神给一个思考的方向。
不正常方案:
s32 ad1Sum[9];//局部变量
memset((void*)(ad1Sum), 0 , sizeof(s32)*9);
正常方案
s32 ad1Sum[9];//局部变量
int i;
for(i=0; i<9; ++i){
        ad1Sum=0;
}
芯片stm32f103zet6
开放环境mdk-arm 4.7
程序除此之外还有很多奇怪的地方,楼下说
沙发
xu84403451|  楼主 | 2016-2-23 17:19 | 只看该作者
这楼说一下奇怪的地方。
一、在一些不相关的地方添加一些语句,或者定义一些不用的变量,有一定概率,程序正常运行。
二、这程序一部分是采集ad,数据然后处理,这个是处理ad数据的程序部分出现的一个bug,ad数据正常。
我是在硬件定时器超时中断里记录ad数据的,使用了函数memcpy,记录数据,如果memcpy改为自己实现,不正常的方案也变得正常。

这个bug只是把处理数据的浮动变大了,并不是把数据变得面目全非。

关于bug的一些猜想,
由于使用了freertos,只使用了任务调度,当然还有延时,可能这里出bug,可能性非常少
库函数memset和memcpy,这里出bug可能性更少。
数据处理的任务是唯一最高优先级的,处理数据过程不会被打断,由于打断而出错也不太可能。
数据由最初的ad值数据类型为u16,转化s32(即int),再转化为float,这里可能会把最初的数据
偏差放大。但是,我是9个通道用相似的系数,一样的处理方法,处理,得到只有第一个通道
存在数据浮动变大。

关于栈堆问题。
我把任务栈加大,结果也一样,而且我是加大到原来估算出来栈的四倍
我自己没有用到堆(即动态申请内存),freertos选择的内存分配方式是最简单那种,不可回收的块分配策略。
s32 ad1Sum[9]定义为全局变量,这也能使程序正常。把它定义为局部变量,即放栈上,并调用memset清零
可能会出现异常。

使用特权

评论回复
板凳
neeringstu| | 2016-2-23 23:06 | 只看该作者
是不是用完没有释放内存呢

使用特权

评论回复
地板
xu84403451|  楼主 | 2016-2-24 08:35 | 只看该作者
neeringstu 发表于 2016-2-23 23:06
是不是用完没有释放内存呢

没有动态申请内存

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

45

帖子

0

粉丝