这楼说一下奇怪的地方。
一、在一些不相关的地方添加一些语句,或者定义一些不用的变量,有一定概率,程序正常运行。
二、这程序一部分是采集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清零
可能会出现异常。
|