OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2477|回复: 9

__IO的问题

[复制链接]

9

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2017-7-25
在线时间
26 小时
发表于 2018-3-10 13:40:27 | 显示全部楼层 |阅读模式
1金钱
#define __HAL_RCC_HSE_CONFIG(__STATE__)         (*(__IO uint8_t *) RCC_CR_BYTE2_ADDRESS = (__STATE__))
这句看不懂啊,求教
1.  __IO的问题。用在这里是什么意思
2. *(__IO uint8_t *) RCC_CR_BYTE2_ADDRESS是什么意思?
                 (__IO uint8_t *) RCC_CR_BYTE2_ADDRESS是强制类型转换。不是已经把 RCC_CR_BYTE2_ADDRESS转化为指针类型了?前面在加个*。是直接表示地址吗?


最佳答案

查看完整内容[请看2#楼]

“*(__IO uint8_t *) RCC_CR_BYTE2_ADDRESS”这叫访问特定内存,即是:访问地址为“RCC_CR_BYTE2_ADDRESS”的内存(寄存器)数据。嵌入式的基础知识,面试笔试经常会考。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3448
金钱
3448
注册时间
2017-7-4
在线时间
869 小时
发表于 2018-3-10 13:40:28 | 显示全部楼层
“*(__IO uint8_t *) RCC_CR_BYTE2_ADDRESS”这叫访问特定内存,即是:访问地址为“RCC_CR_BYTE2_ADDRESS”的内存(寄存器)数据。嵌入式的基础知识,面试笔试经常会考。
回复

使用道具 举报

9

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2017-7-25
在线时间
26 小时
 楼主| 发表于 2018-3-10 14:08:41 | 显示全部楼层
上面那句函数是不是把这个定义里的
#define RCC_CR_BYTE2_ADDRESS       ((uint32_t)0x40023802)
   给RCC_CR_BYTE2_ADDRESS这个常量重新赋值并且改变了它的格式
最后得到了个指针
回复

使用道具 举报

9

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2017-7-25
在线时间
26 小时
 楼主| 发表于 2018-3-10 14:40:55 | 显示全部楼层
#define __HAL_RCC_HSE_CONFIG(__STATE__)         (*(__IO uint8_t *) RCC_CR_BYTE2_ADDRESS = (__STATE__))
就一个问题这句里边 __IO的作用
回复

使用道具 举报

3

主题

238

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1366
金钱
1366
注册时间
2016-5-26
在线时间
1698 小时
发表于 2018-3-10 14:49:02 来自手机 | 显示全部楼层
“__IO”是个修饰变量类型的前缀,表示这个变量映射到一个(可读可写)的外设寄存器,编译器不能随便优化对这个变量的读写。 ArmCC编译器的话,会有个宏定义把它用volatile来实现。
回复

使用道具 举报

94

主题

369

帖子

0

精华

高级会员

Rank: 4

积分
865
金钱
865
注册时间
2016-8-25
在线时间
485 小时
发表于 2018-3-10 16:09:55 | 显示全部楼层
用__IO表示挺形象的。
我以前在百度查过,好像是变量用__IO定义类型,则编译器不会优化该变量,例如这个变量是取自某个IO口的值,而该IO口的值根据外界传感器的信号变化。这样,编译器编译文件时,会将该变量直接从IO取值,即得到的值是"实时性"的。
例如,在t1时刻,外界传感器给该IO口的值为1,即__IO类型的变量a=1。在t2时刻,外界传感器给该IO口的值为2,即a=2。然后a参与了计算。经过一段时间后,单片机需要知道a的值,而此时,a=3,那么单片机是取a为2的值呢,还是取a为3的值呢?
若a是__IO类型的,那么单片机取a=3,因为单片机直接从与外界相连的IO口取值。这即是__IO中IO的含义。
若a没有定义成__IO类型,那么单片机有可能就取a=2了。因为a=2是离单片机取a的值最近的值。
水平有限,解释的比较乱,望见谅。
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3448
金钱
3448
注册时间
2017-7-4
在线时间
869 小时
发表于 2018-3-10 16:30:34 | 显示全部楼层
来个形象的,往地址0x1234,写入变量10。笔试不会写直接pass掉。

[mw_shl_code=c,true]int *ptr;
ptr = (int *)0x1234;
*ptr = 10;[/mw_shl_code]
回复

使用道具 举报

94

主题

369

帖子

0

精华

高级会员

Rank: 4

积分
865
金钱
865
注册时间
2016-8-25
在线时间
485 小时
发表于 2018-3-10 17:26:34 | 显示全部楼层
Acuity 发表于 2018-3-10 16:30
来个形象的,往地址0x1234,写入变量10。笔试不会写直接pass掉。

[mw_shl_code=c,true]int *ptr;

能说明一下这个例子和__IO的联系吗
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3448
金钱
3448
注册时间
2017-7-4
在线时间
869 小时
发表于 2018-3-10 20:40:22 | 显示全部楼层
学习stm32f4 发表于 2018-3-10 17:26
能说明一下这个例子和__IO的联系吗

_IO即是volatile,对应该加上volatile修饰,百度volatile的作用,面试笔试经常考。
http://blog.csdn.net/qq_20553613/article/details/79478642
回复

使用道具 举报

8

主题

569

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2363
金钱
2363
注册时间
2015-5-8
在线时间
320 小时
发表于 2018-3-10 22:36:40 | 显示全部楼层
Acuity 发表于 2018-3-10 16:30
来个形象的,往地址0x1234,写入变量10。笔试不会写直接pass掉。

[mw_shl_code=c,true]int *ptr;

确实形象
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 14:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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