打印
[STM8]

用for循环延时的问题

[复制链接]
1013|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chuxh|  楼主 | 2019-12-18 19:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用的是STM8S903K3,内部主频16mHz,用for循环做延时时间,最近遇到了一个情况百思不得其解,求指教!
程序中加入for(i=0;i<32000;i++)用示波器测量延时大约10ms;
加入for(i=0;i<33000;i++)用示波器测量延时变成了107ms;i定义的是unsigned short int类型
这是什么原因呢??

使用特权

评论回复
沙发
wangpe| | 2019-12-18 19:14 | 只看该作者
i 你 搞成int16了吧

使用特权

评论回复
板凳
chuxh|  楼主 | 2019-12-18 19:17 | 只看该作者
定义的是无符号的,unsigned short int

使用特权

评论回复
地板
happy_10| | 2019-12-18 19:19 | 只看该作者

for(i=0;i<33000;i++)改成:
for(i=0;i<33000u;i++)

使用特权

评论回复
5
songqian17| | 2019-12-18 19:23 | 只看该作者

楼主试了楼上的了没?

使用特权

评论回复
6
chuxh|  楼主 | 2019-12-18 19:28 | 只看该作者
加上就可以正确延时了,谢谢谢谢!!!

使用特权

评论回复
7
chuxh|  楼主 | 2019-12-18 19:31 | 只看该作者
对于16位无符号的整型数,数值大了就得加u吗?是stm8s单片机的问题还是我用的STVD编译环境的问题呢?

使用特权

评论回复
8
pangb| | 2019-12-18 19:33 | 只看该作者
默认是有符号数的,对于33000已经超过了16位有符号数的范围(-32768~32767),所以编译器会把它当做32位数去运算,32位去运算肯定比16位运算要费时得多。如果加了u,则是无符号数,还是在16位无符号数范围,所以编译器只需要当做16位去运算。

使用特权

评论回复
9
zyf部长| | 2019-12-18 19:36 | 只看该作者
厉害,学习了,以后也要注意,所有的循环体和定时都用无符号的。

使用特权

评论回复
10
guoyt| | 2019-12-18 19:39 | 只看该作者

超出界限了。

使用特权

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

使用特权

评论回复
12
labasi| | 2020-1-16 08:44 | 只看该作者
额 是不是溢出了

使用特权

评论回复
13
paotangsan| | 2020-1-16 08:52 | 只看该作者
定义成double类型试试看

使用特权

评论回复
14
renzheshengui| | 2020-1-16 08:56 | 只看该作者
你的数据溢出了  32768

使用特权

评论回复
15
wakayi| | 2020-1-16 09:38 | 只看该作者
明显的溢出了

使用特权

评论回复
16
wowu| | 2020-1-16 10:00 | 只看该作者
用无符号长整形肯定没问题了

使用特权

评论回复
17
xiaoqizi| | 2020-1-16 10:26 | 只看该作者
到32768当然就溢出了

使用特权

评论回复
18
木木guainv| | 2020-1-16 10:43 | 只看该作者
挺简单的  以后楼主应该不会犯这种错误了

使用特权

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

本版积分规则

936

主题

11296

帖子

2

粉丝