野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 7722|回复: 3

关于keil中二维数组的一个问题

[复制链接]
发表于 2022-4-14 15:31:34 | 显示全部楼层 |阅读模式
近日楼主在一个项目中用到了一个二位数组,定义的格式是__IO u32 Speed[4][6],但是程序在执行的时候一直有问题,进入调试中找了两天,发现这段汇编很奇怪 野火论坛202204141432098752..png 野火论坛202204141434406064..png 野火论坛202204141436319597..png 其中0x08000E14和0x08000E18地址的数据放在了后面这张图里,可以看出来这两个地址存放的数据分别是Stage数组的首地址和Speed数组的首地址,前两句汇编和第三局汇编的意思分别是将Stage[0]的数据放到r0和将speed[0][0]的地址放到r1
但是接下来的这句汇编把楼主整蒙了 LDRH r0, [r1,r0,LSL #1] 这句汇编得意思是将r1加上r0向左偏移两位后的数值作为地址,从这个地址开启取两个字节放到r0里面,也就是从Speed[0]这个地址往后偏移Stage[0]*2个字节,这个Stage[0]会随着程序的运行逐渐自加,但是也是有急有偶,,这样取出来的数据
经常会影响if判断,导致调试的时候自己看着if里面的条件是真的但是就是不能进入到if里面执行

其实我一开始发这个贴子是想问问大家怎么回事,但是这个问题在写这个帖子的时候已经被解决了,我把经验分享出来记录一下,希望有和我一样困扰的同学在以后面对这种问题的时候有些头绪,不是什么很厉害的技术,高手轻喷


回复

使用道具 举报

 楼主| 发表于 2022-4-14 15:33:30 | 显示全部楼层
这个问题形成的原因是我在声明外部变量的时候,本来是u32类型的变量被我声明称了u16,这就导致编译器在编译的时候把哪个数组中的元素都当成2个字节来处理,才会出现了上面那样在一个4字节的变量中一直取它内部的字节
回复 支持 反对

使用道具 举报

发表于 2022-4-14 16:52:07 | 显示全部楼层
这个编译的时候没有warning吗
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-15 14:27:22 | 显示全部楼层
a5820736 发表于 2022-4-14 16:52
这个编译的时候没有warning吗

没有,我的warning等级是unspecified,没有报warning
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-24 01:02 , Processed in 0.077548 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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