OpenEdv-开源电子网

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

void delay_ms(u16 nms)有疑问

[复制链接]

6

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2018-8-2
在线时间
32 小时
发表于 2018-8-2 16:25:29 | 显示全部楼层 |阅读模式
1金钱
void delay_ms(u16 nms)
{
    u32 i;
    for(i=0;i<nms;i++)
    {
        delay_us(1000);
    }   
}

我用的例程是F4的串口例程,编译器优化等级是2,有用到delay_ms(10)。用到delay_ms函数里的变量i是没有加volatie的,我认为delay_us(1000)只执行一次才对啊,为什么还会执行10次?

最佳答案

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

volatile声明的变量是告诉编译器这个值随时随地都可能发生改变,每次读取都必须从根地址读取,防优化也可以这么理解吧 但是我看楼主的问题和volatile一点关系没有啊
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

188

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
385
金钱
385
注册时间
2018-7-19
在线时间
126 小时
发表于 2018-8-2 16:25:30 | 显示全部楼层
本帖最后由 坐看风 于 2018-8-3 16:23 编辑
Yyyyy羊 发表于 2018-8-2 17:29
加了volatile的变量,如果要得到变量的值,直接从地址取。目的是防止被优化,是这个意思吧?

volatile声明的变量是告诉编译器这个值随时随地都可能发生改变,每次读取都必须从根地址读取,防优化也可以这么理解吧
但是我看楼主的问题和volatile一点关系没有啊
回复

使用道具 举报

0

主题

192

帖子

0

精华

高级会员

Rank: 4

积分
582
金钱
582
注册时间
2017-6-2
在线时间
192 小时
发表于 2018-8-2 16:46:59 | 显示全部楼层
就应该执行10次,这是内部循环,不是多次执行这个函数
回复

使用道具 举报

6

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2018-8-2
在线时间
32 小时
 楼主| 发表于 2018-8-2 17:00:30 | 显示全部楼层
jkd405 发表于 2018-8-2 16:46
就应该执行10次,这是内部循环,不是多次执行这个函数

啥意思啊?
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
发表于 2018-8-2 17:18:33 | 显示全部楼层
百度一下volatile
回复

使用道具 举报

6

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2018-8-2
在线时间
32 小时
 楼主| 发表于 2018-8-2 17:29:22 | 显示全部楼层

加了volatile的变量,如果要得到变量的值,直接从地址取。目的是防止被优化,是这个意思吧?
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
发表于 2018-8-2 17:36:55 | 显示全部楼层
Yyyyy羊 发表于 2018-8-2 17:29
加了volatile的变量,如果要得到变量的值,直接从地址取。目的是防止被优化,是这个意思吧?

我想知道你为什么认为变量 i 没加volatile,循环就不能执行10次的呢
回复

使用道具 举报

6

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2018-8-2
在线时间
32 小时
 楼主| 发表于 2018-8-2 18:38:58 | 显示全部楼层
qiuzhicheng 发表于 2018-8-2 17:36
我想知道你为什么认为变量 i 没加volatile,循环就不能执行10次的呢

因为编译器一看,发现10次循环都是做相同的一件事情啊,为什么不能做一次就完成呢?
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
发表于 2018-8-3 08:17:47 | 显示全部楼层
Yyyyy羊 发表于 2018-8-2 18:38
因为编译器一看,发现10次循环都是做相同的一件事情啊,为什么不能做一次就完成呢?

那还要循环语句干嘛。。。
你是想直接delay_us(10000);吗
回复

使用道具 举报

6

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2018-8-2
在线时间
32 小时
 楼主| 发表于 2018-8-3 10:20:47 | 显示全部楼层
qiuzhicheng 发表于 2018-8-3 08:17
那还要循环语句干嘛。。。
你是想直接delay_us(10000);吗

void delay_ms(u16 nms)是原子写的,里面有循环做一件事。   我仿真了,for循环里的内容为  j=1;  这样的话for里面的内容只执行了一次。 但是内容改为delay_us(1000); ,实际执行了10次,有点搞不清楚
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
发表于 2018-8-3 11:20:42 | 显示全部楼层
。。。
for(u8 i=0;i<10;i++)
{
    delay_us(1000);
}
delay_us(1000);这个函数执行多少次?
回复

使用道具 举报

12

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
161
金钱
161
注册时间
2018-7-14
在线时间
15 小时
发表于 2018-8-3 13:11:28 | 显示全部楼层
对于for循环不就是0,1,2……9<nms这样十次吗?如果想要跳出的话就用break;而且你这个函数写出来不就是以ms为单位?delay_ms(10)的话当然是延时10ms执行十次咯
回复

使用道具 举报

17

主题

193

帖子

0

精华

高级会员

Rank: 4

积分
708
金钱
708
注册时间
2014-7-2
在线时间
137 小时
发表于 2018-8-3 16:28:08 | 显示全部楼层
i,没有被优化掉。 nms = 10 为什么不会执行10次
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-1 02:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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