打印

__IO uint32_t求解释

[复制链接]
16304|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lvyuanchuan电|  楼主 | 2011-9-14 18:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ui, IO
__IO uint32_t是什么意思
沙发
uc_efm32| | 2011-9-14 18:22 | 只看该作者
__IO就是volatile

使用特权

评论回复
板凳
李富贵| | 2011-9-14 18:51 | 只看该作者
__IO就是volatile
uint32_t就是32位无符号整形数。

这都是ARM公司无聊滴在CMSIS库里面定义的。STM32库1.x 2.x都没有这玩意,到了3.0以后引入了CMSIS就有了。

使用特权

评论回复
地板
mcu_electron| | 2011-9-14 20:14 | 只看该作者
现丰定义在core_cm3.h中!

使用特权

评论回复
5
Gadisgirl| | 2014-5-10 15:56 | 只看该作者
:)

使用特权

评论回复
6
限量_个性。| | 2014-5-10 18:57 | 只看该作者
go to definition   搞定。

使用特权

评论回复
7
ouyangchun| | 2016-4-3 15:59 | 只看该作者
volatile无聊?不是吧,这里面以前看过一个解释,
“volatile 是告诉编译器,在编程的时候对这个变量不要使用优化处理,如 int *a,int b;b=(*a)*(*a),对于这种情况,通常编译器为了减少存储的读写时间,会把代码优化为  int*a,int b,int c;
c=*a,b=c*c;因为外部存储器的读写速度赶不上内存的读写速度,这样可以省一次外部存储器的读取时间,从而提高速度,如果使用volatile int *a,则允许在运行期间,数值发生变化”--------引用百度

使用特权

评论回复
8
jpaekeo| | 2017-3-10 17:45 | 只看该作者
ouyangchun 发表于 2016-4-3 15:59
volatile无聊?不是吧,这里面以前看过一个解释,
“volatile 是告诉编译器,在编程的时候对这个变量不要使 ...

确实不无聊,而且还很有用的一个变量
内存就是你MCU中的RAM

MCU操作寄存器的速度比操作内存的速度快,所以编译器优化的时候,会把局部变量的值在使用时放到寄存器中(比如R1),后续需要操作这个临时变量时,就会直接找操作这个R1。但这样做有个问题,就是如果这时这个局部变量的在RAM中的值变了,就是说RAM上的值和寄存器R1的值不一致,这样MCU还操作R1上的值就会出现错误,为了避免这样的情况,这种值容易发生变话的变量就会用volatile(易变的)来修饰,这样的话,编译器就不会“自作聪明”吧值放到寄存器R1里操作,每次都会访问内存取最新的值进行操作,这样就不会出上述错误。你可以做个小实验,观察汇编语句就知道差别了

像R1这样的寄存器就十几个,只有在需要使用的时候才会被赋值。

如果你的程序需要避免上述情况,那就加volatile,确保操作正确
如果你的程序不会出现上述情况,那就不加volatile,这样编译器会优化变量操作,提供速度,一般情况下都不用volatile

关于volatile的使用可以百度一下,讲的比我详细

使用特权

评论回复
9
干得漂亮| | 2017-5-31 12:52 | 只看该作者
这里的无聊是说stm的库把关键字也给define 了 使得程序更加复杂难懂化了 直接写volatile关键字不行吗  打个char 费劲还是打个int8_t费劲啊 所以说这样做这是很无聊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

4

帖子

1

粉丝