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

[复制链接]
 楼主| 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++)
songqian17 发表于 2022-1-1 13:04 | 显示全部楼层
楼主试了楼上的了没?
 楼主| chuxh 发表于 2022-1-1 13:09 | 显示全部楼层
加上就可以正确延时了,谢谢谢谢!!!
 楼主| chuxh 发表于 2022-1-1 13:11 | 显示全部楼层
对于16位无符号的整型数,数值大了就得加u吗?是stm8s单片机的问题还是我用的STVD编译环境的问题呢?
huangchui 发表于 2022-1-1 13:13 | 显示全部楼层
默认是有符号数的,对于33000已经超过了16位有符号数的范围(-32768~32767),所以编译器会把它当做32位数去运算,32位去运算肯定比16位运算要费时得多。如果加了u,则是无符号数,还是在16位无符号数范围,所以编译器只需要当做16位去运算。
wyjie 发表于 2022-1-1 13:17 | 显示全部楼层
厉害,学习了,以后也要注意,所有的循环体和定时都用无符号的。
juventus9554 发表于 2022-1-1 13:19 | 显示全部楼层
超出界限了。
dingy 发表于 2022-1-1 13:22 | 显示全部楼层
一般这种计数为了方便阅读通常都用无符号的。如果用有符号,那想用整段长度,就要考虑好界限在哪儿
supernan 发表于 2022-1-1 13:24 | 显示全部楼层

额 是不是溢出了
zhanghqi 发表于 2022-1-1 13:26 | 显示全部楼层
定义成double类型试试看
pengf 发表于 2022-1-1 13:34 | 显示全部楼层
你的数据溢出了  32768
pangb 发表于 2022-1-1 13:36 | 显示全部楼层
明显的溢出了
jiaxw 发表于 2022-1-1 13:39 | 显示全部楼层

用无符号长整形肯定没问题了
juventus9554 发表于 2022-1-1 13:41 | 显示全部楼层
到32768当然就溢出了
pengf 发表于 2022-1-1 13:43 | 显示全部楼层
挺简单的  以后楼主应该不会犯这种错误了
 楼主| chuxh 发表于 2022-1-1 13:46 | 显示全部楼层

嗯,我再好好缕一缕吧,有了好消息及时通知大家
您需要登录后才可以回帖 登录 | 注册

本版积分规则

936

主题

11296

帖子

2

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