擦鞋匠 发表于 2023-6-16 16:55:38

请教:代码调试,指针指向一个意外的值让我疑惑不解

环境:
我使用iar + msp430

备注:
1、16位单片机
2、单片机是小端模式
3、程序没有跑飞,且程序栈没有溢出
4、reg_arr是在另一个函数内定义的静态数组

如图:


问题:
为什么u32_val_1是1呢?

Himem 发表于 2023-6-16 17:09:11

编译器优化 临时变量用了寄存器

xy3dg12 发表于 2023-6-16 17:48:44

本帖最后由 xy3dg12 于 2023-6-16 18:05 编辑

Himem 发表于 2023-6-16 17:09
编译器优化 临时变量用了寄存器
(引用自2楼)

用了寄存器变量也没什么。
有可能是开了编译优化,此时u32_val_1还没有被实际赋值,因为还没有使用。
可以加一句printf u32_val_1这个变量再看看

看错了,已经使用了u32_val_1,但有可能编译器认为后面不在使用u32_val_1了,就提前销毁了。
用混合模式看下汇编和C的对应就知道怎么回事了。

初音之恋 发表于 2023-6-16 17:57:51

u32_ptr没有初始化内存地址,是野指针。。。

擦鞋匠 发表于 2023-6-16 18:14:50

Himem 发表于 2023-6-16 17:09
编译器优化 临时变量用了寄存器
(引用自2楼)

感谢指教
我没有开启优化

擦鞋匠 发表于 2023-6-16 18:15:27

xy3dg12 发表于 2023-6-16 17:48
用了寄存器变量也没什么。
有可能是开了编译优化,此时u32_val_1还没有被实际赋值,因为还没有使用。
可 ...
(引用自3楼)

感谢指教
现象依旧

xy3dg12 发表于 2023-6-16 18:21:05

擦鞋匠 发表于 2023-6-16 18:15
感谢指教
现象依旧
(引用自6楼)

你确定reg_buf->ptr指向的是reg_arr吗 ?从你的截图里看不出来

tang_qianfeng 发表于 2023-6-16 18:21:19

你这有可能非对齐访问啊

擦鞋匠 发表于 2023-6-16 18:42:54

xy3dg12 发表于 2023-6-16 18:21
你确定reg_buf->ptr指向的是reg_arr吗 ?从你的截图里看不出来
(引用自7楼)

擦鞋匠 发表于 2023-6-16 19:00:04

tang_qianfeng 发表于 2023-6-16 18:21
你这有可能非对齐访问啊
(引用自8楼)

感谢指教
从u32_ptr的地址来看,是个奇数,很大可能是 非对齐访问 导致的。

所以,我在想,有时候我强制类型转换的时候,可能考虑的不够深入
默认,在不额外添加对齐修饰符的情况下:
例如,从uint32_t * 强制转换为uint8_t *是可以的
但是,从uint8_t *强制转换为uint32_t *可能就会出问题

我记得stm32f1/f4 cortex-m3/m4系列(我当前使用msp430f5)是支持非对齐访问的,是不是就不存在上述问题了?

tang_qianfeng 发表于 2023-6-16 20:03:27

是的 ,m3,m4支持,m0不支持

sbusr 发表于 2023-6-16 20:52:44

1,把include头文件放到整个文件开始,至少也是这个函数外面。
2,req_buf->ptr是什么类型,加10和uint8*哪个优先级高。
3,红框和上面一句太复杂了 u32_val_1=*(uint32_t)u08_ptr,甚至能和上面一行整合到一句,也不句影响阅读。

擦鞋匠 发表于 2023-6-16 22:06:23

sbusr 发表于 2023-6-16 20:52
1,把include头文件放到整个文件开始,至少也是这个函数外面。
2,req_buf->ptr是什么类型,加10和uint8*哪 ...
(引用自12楼)

感谢指教

1,把include头文件放到整个文件开始,至少也是这个函数外面。
这是我调试这个问题时偷懒的写法,正式代码可不会这样

2,req_buf->ptr是什么类型,加10和uint8*哪个优先级高。
req_buf->ptr是uint8_t *类型,当然是强制类型转换优先级更高,确保指针自增,地址是以sizeof(uint8_t)作为步长

3,红框和上面一句太复杂了 u32_val_1=*(uint32_t)u08_ptr,甚至能和上面一行整合到一句,也不句影响阅读。
本来是放在一起的,调试时一开始不知道问题出在哪,分开写,想着利于找出问题

xy3dg12 发表于 2023-6-16 22:15:19

擦鞋匠 发表于 2023-6-16 18:42

(引用自9楼)

那估计就是对齐的问题了。解决这种问题最简单的办法就是用混合模式跟着汇编走一遍就知道了。
页: [1]
查看完整版本: 请教:代码调试,指针指向一个意外的值让我疑惑不解