函数形参为volatile类型,这个有什么意义?

2019-07-14 19:10发布

__weak void HAL_Delay(__IO uint32_t Delay)
{
  uint32_t tickstart = 0U;
  tickstart = HAL_GetTick();
  while((HAL_GetTick() - tickstart) < Delay)
  {
  }
}
这是用STM32CubeMX生成的带操作系统工程里面的一个函数,如何理解形参Delay前面的__IO,还望各路高手指导。

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
zhifubao
1楼-- · 2019-07-15 00:52
将军问鼎 发表于 2017-11-23 20:20
首先说 这个 _IO  的来源,他是在 Core_cm3.h 中重定义的,基本类型就是 volatile  ,那么这个 volatile  这个关键词的本意是 易变的,也就是说,可能会发生多次变化,其实 也就是你告诉了编译器 这个变量 是多变的,那么编译器就不会进行优化编译,而且,处理这个变量时 会直接从 变量地址读取 ...

Delay变量每次从内存中读取或者从CPU寄存器中读取对这个函数没有影响吧。
chjtnf
2楼-- · 2019-07-15 02:48
大神来解决。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
勇哥-lzu
3楼-- · 2019-07-15 05:35
CPU有缓冲区,数据会先从缓冲区拿,加volatile是指定不要从缓冲区拿

评分

参与人数 1积分 +5 收起 理由 ElecFans王岑 + 5

查看全部评分

zhifubao
4楼-- · 2019-07-15 06:08
勇哥-lzu 发表于 2017-11-24 12:10
CPU有缓冲区,数据会先从缓冲区拿,加volatile是指定不要从缓冲区拿

Delay这个形参加volatile修饰应该不是你这个意思,因为在函数里面这个值没有做过修改,就算编译器优化为从CPU寄存器中读取也没有问题。
BG7RGT
5楼-- · 2019-07-15 08:52
 精彩回答 2  元偷偷看……
zhifubao
6楼-- · 2019-07-15 13:34
BG7RGT 发表于 2017-11-26 15:03
同意1楼的解析

他说的那句话没错,但是没有回答我的疑问,Delay作为形参,在函数里面并没有修改它的值,所以从内存或者寄存器操作该变量应该没有什么区别。

一周热门 更多>