当前位置:网站首页>一个低级错误导致的诡异现象——走近科学能拍三集,(C语言)最简单的数组元素读取,不正确!?
一个低级错误导致的诡异现象——走近科学能拍三集,(C语言)最简单的数组元素读取,不正确!?
2022-07-30 08:07:00 【爱你越久越被动】
二维数组,存放ADC采集到的8个通道值,每个通道连续采集20次,用来滤波。数据由DMA直接写入数组ADC_RESULT[20][8]中。
在使用数组元素时,发现无法正确读取元素值。
通过内存监控watch数组,所有值都是正常的。
但是每次使用赋值语句,读取相邻4个数值,诡异事情就发生了
实际数组值是:
ADC1_RESULT[0][0]==0;
ADC1_RESULT[1][0]==0;
ADC1_RESULT[2][0]==0;
ADC1_RESULT[3][0]==0;


但是经过赋值语句之后

发现TEMP1=0;TEMP2=0x07EA;TEMP3=0;TEMP4=0x07EA;

经过比对,0x07EA的值是ADC1_RESULT[0][4]的值;

1、我第一反应是类型不对,ADC采集到的数据是16位的。但是马上就否决了,数组也是16位的,而且即使类型不对,也不会出现这种现象。
2、查看定义的数组下标[20][8],没有问题。
3、查看DMA设置,尤其是数据类型,也没有问题。
4、编译器设置,没有问题。
反复的测试,修改,就是无法正确赋值。
明明watch中可以看到正确的值,经过赋值语句就变了。
我又试着在main程序中调用数组赋值,结果又可以正确赋值了。
突然脑中灵光一闪,再次检查了定义的数组。终于发现了问题所在。这就是为什么上面的字加粗加色的原因。
ADC_RESULT数组定义在MAIN.H中
而计算是在DMA中断时处理,不在MAIN.C文件中,所以中断文件stm32f10x_it.c中引用的数组是使用了语句
extern uint16_t ADC1_RESULT[20][4];
没错,这里的下标写错了。
MAIN.H中的定义是ADC1_RESULT[20][8];
之前只检查了MAIN.H中定义的脚标,忽略了引用时定义的脚标。
低级错误,其实早该想到的。只是现象太诡异,想多了。而且这种错误,编译器不会报错。所以就理所当然的忽略了。
反过来看,当脚标由8变成了4,数组数据便重新进行了划分,本来8个元素1组,现在4个元素变成了1组。本来是赋值的是第0/8/16/24元素,现在变成了第0/4/8/12元素。这也就是为什么TEMP2会得到[0][4]的值。一切解释得通了。TEMP4得到的其实是[1][4]的值,因为是连续采集,所以二者值几乎不变。
至此,破案,真相果真只有一个。代价是半天时间浪费掉了。
边栏推荐
- Field interpretation under "Surgical variables (RX SUMM-SURG OTH REG/DIS)" in SEER database
- 经典毕业设计:基于SSM实现高校后勤报修系统
- leetcode力扣——一篇文章解决多数之和问题
- 分布式系统大势所趋,银行运维如何与时俱进?
- ant-design form表单校验upload组件(附个人封装的上传组件)
- typescript6 - simplify the steps to run ts
- hcip实验
- jdbc ResultSetMetaData获取tableName问题
- 集合相关Collection
- It is said that FPGA is high-end, what can it do?
猜你喜欢

新手必备!最全电路基础知识讲解

积分专题笔记-与路径无关条件

Why does typescript2-typescript add type support to js

SwiftUI SQLite 教程之 构建App本地数据库实现创建、读取、更新和删除(教程含完成项目源码)

电脑文档误删除怎么恢复,恢复误删除电脑文档的方法

DDR、GDDR、QDR的区别

20个电路能懂5个以上,足以证明你在电子行业混过!

HashSet and LinkedHashSet

Activating data potential Amazon cloud technology reshapes cloud storage "family bucket"

一文带你玩转offer-01
随机推荐
涛思 TDengine 2.6+优化参数
iperf3 参数选项详细说明
万字详解:C语言三子棋进阶 + N子棋递归动态判断输赢(另附课设大作业参考)
最右的一道面试算法题,--特殊基因
R安装包出现error in rawtochar(block[seq_len(ns)]) :
The difference between DDR, GDDR, QDR
npm指令
【SQL server速成之路】——身份验证及建立和管理用户账户
hicp第六天
联想笔记本 如何更改Win10系统开机logo图标
【科普向】5G核心网架构和关键技术
Leetcode - 990: equations of satisfiability
Hands-on teaching OneOS FOTA upgrade
研发人员的悲剧——“庞氏骗局”
How to use Jmeter to carry out high concurrency in scenarios such as panic buying and seckill?
typescript1 - what is typescript
[Yugong Series] July 2022 Go Teaching Course 021-Slicing Operation of Go Containers
激活数据潜力 亚马逊云科技重塑云上存储“全家桶”
leetcode力扣——一篇文章解决多数之和问题
TreeSet解析