打印
[STM8]

用for循环延时的问题

[复制链接]
2477|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++)

使用特权

评论回复
5
gujiamao12345| | 2018-5-31 15:34 | 只看该作者
楼主试了楼上的了没?

使用特权

评论回复
6
石婷婷|  楼主 | 2018-5-31 16:31 | 只看该作者

加上就可以正确延时了,谢谢谢谢!!!
对于16位无符号的整型数,数值大了就得加u吗?是stm8s单片机的问题还是我用的STVD编译环境的问题呢?

使用特权

评论回复
7
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位去运算。

使用特权

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

明白了,谢谢!

使用特权

评论回复
9
598330983| | 2018-6-1 11:55 | 只看该作者
真是高手啊,666

使用特权

评论回复
10
dongnanxibei| | 2018-6-3 10:21 | 只看该作者
厉害,学习了,以后也要注意,所有的循环体和定时都用无符号的。

使用特权

评论回复
11
xuanhuanzi| | 2018-6-3 13:19 | 只看该作者
超出界限了。

使用特权

评论回复
12
xuanhuanzi| | 2018-6-3 13:20 | 只看该作者
一般这种计数为了方便阅读通常都用无符号的。如果用有符号,那想用整段长度,就要考虑好界限在哪儿

使用特权

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

本版积分规则

1

主题

31

帖子

1

粉丝