打印
[STM8]

用for循环延时的问题

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

使用特权

评论回复
沙发
zhenykun| | 2022-1-1 12:54 | 只看该作者
i 你 搞成int16了吧

使用特权

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

使用特权

评论回复
地板
happy_10| | 2022-1-1 13:02 | 只看该作者

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

使用特权

评论回复
5
songqian17| | 2022-1-1 13:04 | 只看该作者
楼主试了楼上的了没?

使用特权

评论回复
6
chuxh|  楼主 | 2022-1-1 13:09 | 只看该作者
加上就可以正确延时了,谢谢谢谢!!!

使用特权

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

使用特权

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

使用特权

评论回复
9
wyjie| | 2022-1-1 13:17 | 只看该作者
厉害,学习了,以后也要注意,所有的循环体和定时都用无符号的。

使用特权

评论回复
10
juventus9554| | 2022-1-1 13:19 | 只看该作者
超出界限了。

使用特权

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

使用特权

评论回复
12
supernan| | 2022-1-1 13:24 | 只看该作者

额 是不是溢出了

使用特权

评论回复
13
zhanghqi| | 2022-1-1 13:26 | 只看该作者
定义成double类型试试看

使用特权

评论回复
14
pengf| | 2022-1-1 13:34 | 只看该作者
你的数据溢出了  32768

使用特权

评论回复
15
pangb| | 2022-1-1 13:36 | 只看该作者
明显的溢出了

使用特权

评论回复
16
jiaxw| | 2022-1-1 13:39 | 只看该作者

用无符号长整形肯定没问题了

使用特权

评论回复
17
juventus9554| | 2022-1-1 13:41 | 只看该作者
到32768当然就溢出了

使用特权

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

使用特权

评论回复
19
chuxh|  楼主 | 2022-1-1 13:46 | 只看该作者

嗯,我再好好缕一缕吧,有了好消息及时通知大家

使用特权

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

本版积分规则

936

主题

11296

帖子

2

粉丝