5733|13

1万

帖子

25

TA的资源

裸片初长成(高级)

楼主
 

关于结构体的地址引用 [复制链接]

本帖最后由 dontium 于 2014-5-8 23:40 编辑

    有一个结构体,在程序想使用其地址作运算,因为这样容易用数组或其它运算方法找到所需元素。

使用STM32F1在IAR下,不知道这么用可以不?


       uint32_t    Addr_var = (uint32_t)& StructParam;

(Addr_var 为所引用结构体StructParam的内存地址)


编译是通过了,但不知道有没有问题。

又怎么使用这个地址呢?
此帖出自stm32/stm8论坛

最新回复

(*(volatile uint32_t *)(base_addr+offset_addr))      可以访问寄存器的值。  详情 回复 发表于 2014-5-10 20:03
点赞 关注
 

回复
举报

449

帖子

0

TA的资源

纯净的硅(中级)

沙发
 
用结构体的地址做什么运算?对楼主的应用目的和场合还不够明确啊。当然了,用指针去操作结构体是一定可以的,印象中UCOS中就是这么干的。
此帖出自stm32/stm8论坛
 
 

回复

4005

帖子

0

TA的资源

版主

板凳
 
没问题,使用时*(structname *)Addr_var.xxx就行了
此帖出自stm32/stm8论坛

点评

我现在想的是,不用访问结构体成员,而是用地址偏移,如地址加上偏移量: Adde + 0x123 来访问,  详情 回复 发表于 2014-5-9 11:11

赞赏

1

查看全部赞赏

 
 

回复

2453

帖子

19

TA的资源

五彩晶圆(中级)

4
 
好像不是很常用。因为地址 Addr_var可以定义为指针型。况且指针也可以做运算,利用指针偏移量可以引用结构体中的某个元素。也可以把指针传递出去

更常见的用法是定义该结构体类型的指针,这样子引用更加方便
此帖出自stm32/stm8论坛

点评

很常用  详情 回复 发表于 2014-5-9 09:22
 
个人签名    懒得很
 
 

回复

4005

帖子

0

TA的资源

版主

5
 
本帖最后由 huo_hu 于 2014-5-9 09:27 编辑
zca123 发表于 2014-5-9 09:20
好像不是很常用。因为地址 Addr_var可以定义为指针型。况且指针也可以做运算,利用指针偏移量可以引用结构 ...

很常用,比如你从外部存储读入了一串数据,已知这串数据可能有不同的格式,怎么办还要再copy一次到结构体里吗?
答案是不用直接把地址附给结构指针后引用就行了.结构体就是数据的格式.

此帖出自stm32/stm8论坛
 
 
 

回复

1万

帖子

25

TA的资源

裸片初长成(高级)

6
 
huo_hu 发表于 2014-5-9 09:19
没问题,使用时*(structname *)Addr_var.xxx就行了

我现在想的是,不用访问结构体成员,而是用地址偏移,如地址加上偏移量:

Addr + 0x123

来访问,
此帖出自stm32/stm8论坛

点评

单个数据好说,数据多了就麻烦了,各种各样的数据类型混杂在一起一个一个算偏移麻烦也容易出错,结构成员的访问最终实现也是靠地址偏移实现的.  详情 回复 发表于 2014-5-9 13:01
我觉得地址加偏移量是可以用的,,但是有一部分编译器要做的事就要自己做了,比如读结构体中有一个浮点数,你要找到浮点数的位置把内存中的数值读出来,再换算成浮点数(根据浮点数存储规则)。  详情 回复 发表于 2014-5-9 11:39
 
 
 

回复

118

帖子

0

TA的资源

一粒金砂(中级)

7
 
dontium 发表于 2014-5-9 11:11
我现在想的是,不用访问结构体成员,而是用地址偏移,如地址加上偏移量:

Addr + 0x123

我觉得地址加偏移量是可以用的,,但是有一部分编译器要做的事就要自己做了,比如读结构体中有一个浮点数,你要找到浮点数的位置把内存中的数值读出来,再换算成浮点数(根据浮点数存储规则)。
此帖出自stm32/stm8论坛
 
 
 

回复

1万

帖子

25

TA的资源

裸片初长成(高级)

8
 
我现在这样用,编译也通过

定义: uint32_t *   Addr_var = (uint32_t * )& StructParam;


使用:Addr_var ++
此帖出自stm32/stm8论坛
 
 
 

回复

4005

帖子

0

TA的资源

版主

9
 
dontium 发表于 2014-5-9 11:11
我现在想的是,不用访问结构体成员,而是用地址偏移,如地址加上偏移量:

Addr + 0x123

单个数据好说,数据多了就麻烦了,各种各样的数据类型混杂在一起一个一个算偏移麻烦也容易出错,结构成员的访问最终实现也是靠地址偏移实现的.
此帖出自stm32/stm8论坛

点评

我想用的结构体象数组,因为并不是完全统一的数据类型或长度,所以就用了结构。 但从地址偏移(存储地址)上可以分辨出具体的成员。所以就想到了这样使用。  详情 回复 发表于 2014-5-9 13:20
 
 
 

回复

1万

帖子

25

TA的资源

裸片初长成(高级)

10
 
huo_hu 发表于 2014-5-9 13:01
单个数据好说,数据多了就麻烦了,各种各样的数据类型混杂在一起一个一个算偏移麻烦也容易出错,结构成员的 ...

我想用的结构体象数组,因为并不是完全统一的数据类型或长度,所以就用了结构。
但从地址偏移(存储地址)上可以分辨出具体的成员。所以就想到了这样使用。
此帖出自stm32/stm8论坛
 
 
 

回复

13

帖子

0

TA的资源

一粒金砂(中级)

11
 
到底怎么用,到底行不行,你写个测试程序一试不就知道了嘛。还用费这事在这里讨论么。
我觉用地址偏移量引用数据是没有问题的。关键就是你这个地址偏移量的书写方式了。
此帖出自stm32/stm8论坛
 
个人签名QQ:2674290926
欢迎同行一起探讨嵌入式方面的问题。
 
 

回复

112

帖子

0

TA的资源

一粒金砂(中级)

12
 
这种方法没有问题的,不过使用的时候一定要注意下结构体的字节对齐问题
此帖出自stm32/stm8论坛
 
 
 

回复

3471

帖子

11

TA的资源

五彩晶圆(高级)

13
 
(*(volatile uint32_t *)(base_addr+offset_addr))      可以访问寄存器的值。
此帖出自stm32/stm8论坛

点评

非常正确,经实验,可以正常读取指定位置的值! 谢谢你  详情 回复 发表于 2014-5-11 18:46

赞赏

1

查看全部赞赏

 
 
 

回复

1万

帖子

25

TA的资源

裸片初长成(高级)

14
 
ienglgge 发表于 2014-5-10 20:03
(*(volatile uint32_t *)(base_addr+offset_addr))      可以访问寄存器的值。

非常正确,经实验,可以正常读取指定位置的值!

谢谢你
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表