[STM8] 用for循环延时的问题

[复制链接]
2895|12
 楼主| 石婷婷 发表于 2018-5-31 14:40 | 显示全部楼层 |阅读模式
本帖最后由 石婷婷 于 2018-5-31 14:49 编辑

我用的是STM8S903K3,内部主频16mHz,用for循环做延时时间,最近遇到了一个情况百思不得其解,求指教!
程序中加入for(i=0;i<32000;i++)用示波器测量延时大约10ms;
加入for(i=0;i<33000;i++)用示波器测量延时变成了107ms;i定义的是unsigned short int类型
这是什么原因呢??
tkyl01 发表于 2018-5-31 14:45 | 显示全部楼层
i 你 搞成int16了吧
 楼主| 石婷婷 发表于 2018-5-31 14:46 | 显示全部楼层
本帖最后由 石婷婷 于 2018-5-31 14:49 编辑
tkyl01 发表于 2018-5-31 14:45
i 你 搞成int16了吧

定义的是无符号的,unsigned short int
fengfeng的恒 发表于 2018-5-31 15:18 | 显示全部楼层
for(i=0;i<33000;i++)改成:
for(i=0;i<33000u;i++)
gujiamao12345 发表于 2018-5-31 15:34 | 显示全部楼层
楼主试了楼上的了没?
 楼主| 石婷婷 发表于 2018-5-31 16:31 | 显示全部楼层

加上就可以正确延时了,谢谢谢谢!!!
对于16位无符号的整型数,数值大了就得加u吗?是stm8s单片机的问题还是我用的STVD编译环境的问题呢?
fengfeng的恒 发表于 2018-5-31 16:41 | 显示全部楼层
本帖最后由 fengfeng的恒 于 2018-5-31 16:42 编辑
石婷婷 发表于 2018-5-31 16:31
加上就可以正确延时了,谢谢谢谢!!!
对于16位无符号的整型数,数值大了就得加u吗?是stm8s单片机的问 ...

默认是有符号数的,对于33000已经超过了16位有符号数的范围(-32768~32767),所以编译器会把它当做32位数去运算,32位去运算肯定比16位运算要费时得多。如果加了u,则是无符号数,还是在16位无符号数范围,所以编译器只需要当做16位去运算。

评论

果然很6,之前从没注意过这一点  发表于 2018-6-3 13:51
 楼主| 石婷婷 发表于 2018-5-31 16:57 | 显示全部楼层
fengfeng的恒 发表于 2018-5-31 16:41
默认是有符号数的,对于33000已经超过了16位有符号数的范围(-32768~32767),所以编译器会把它当做32位数 ...

明白了,谢谢!
598330983 发表于 2018-6-1 11:55 | 显示全部楼层
真是高手啊,666
dongnanxibei 发表于 2018-6-3 10:21 | 显示全部楼层
厉害,学习了,以后也要注意,所有的循环体和定时都用无符号的。
xuanhuanzi 发表于 2018-6-3 13:19 | 显示全部楼层
超出界限了。
xuanhuanzi 发表于 2018-6-3 13:20 | 显示全部楼层
一般这种计数为了方便阅读通常都用无符号的。如果用有符号,那想用整段长度,就要考虑好界限在哪儿
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

31

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部