找回密码
 立即注册
查看: 1008|回复: 16

看冲哥串口视频有疑问

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2023-12-25 15:38:27

39

主题

204

回帖

651

积分

高级会员

积分
651
发表于 2023-6-5 16:49:16 | 显示全部楼层 |阅读模式
如下图,没明白T2H=BRT>>8;串口2初始化为什么要右移8位
看冲哥串口视频有疑问-1.png
如下图wptr&=0x0F;是什么意思,也没明白

看冲哥串口视频有疑问-2.png
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:328
  • 最近打卡:2025-03-09 19:40:01

9

主题

328

回帖

4501

积分

荣誉版主

积分
4501
发表于 2023-6-6 12:27:19 | 显示全部楼层
第一个问题,实际我们希望进行的操作是将BRT这一数值赋值给16位的T2寄存器,该寄存器由高8位T2H和低8位T2L组成,我们分别对这两个寄存器赋值。向T2L赋值时BRT高8位溢出,没有影响;向T2H赋值时,我们只要BRT的高8位,因此右移8位将低8位去掉。

第二个问题,你可以确认一下buffer的定义“char buffer[16];”,为避免数组越界,在wptr自增后与0x0F求与,使wptr始终在0~15范围内变化,写了buffer[15]后会覆盖buffer[0]继续写入。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2023-12-25 15:38:27

39

主题

204

回帖

651

积分

高级会员

积分
651
发表于 2023-6-6 16:25:19 | 显示全部楼层
kk*** 发表于 2023-6-6 12:27
第一个问题,实际我们希望进行的操作是将BRT这一数值赋值给16位的T2寄存器,该寄存器由高8位T2H和低8位T2L ...

第一问题,我可以这样改吗:
T2H=BRT/256;
T2L=BRT%256;
第二问题,我可以这样改吗:
if(wptr>15)
    wptr=0;

点评

从功能上讲是一样的,我认为没有问题,你可以自行测试一下  详情 回复 发表于 2023-6-6 18:43
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:328
  • 最近打卡:2025-03-09 19:40:01

9

主题

328

回帖

4501

积分

荣誉版主

积分
4501
发表于 2023-6-6 18:43:17 | 显示全部楼层
98057*** 发表于 2023-6-6 16:25
第一问题,我可以这样改吗:
T2H=BRT/256;
T2L=BRT%256;

从功能上讲是一样的,我认为没有问题,你可以自行测试一下
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2023-12-25 15:38:27

39

主题

204

回帖

651

积分

高级会员

积分
651
发表于 2023-6-7 09:44:50 | 显示全部楼层
kk*** 发表于 2023-6-6 18:43
从功能上讲是一样的,我认为没有问题,你可以自行测试一下

好的呢
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:456
  • 最近打卡:2025-05-02 08:26:53
已绑定手机

27

主题

341

回帖

1691

积分

金牌会员

机长

积分
1691
发表于 2023-6-7 10:15:25 | 显示全部楼层
98057*** 发表于 2023-6-6 16:25
第一问题,我可以这样改吗:
T2H=BRT/256;
T2L=BRT%256;

可以但非常非常非常非常非常不建议。
  1.         TH0 = BRT >> 8;
  2.         TL0 = BRT;
  3. 汇编:
  4.         mov        dptr,#_BRT
  5.         movx        a,@dptr
  6.         mov        r6,a
  7.         inc        dptr
  8.         movx        a,@dptr
  9.         mov        r7,a
  10.         mov        _TH0,r7
  11.         mov        _TL0,r6
复制代码

  1.         TH1 = BRT / 256;
  2.         TL1 = BRT % 256;
  3. 汇编:
  4.         push        ar7
  5.         push        ar6
  6.         clr        a
  7.         push        acc
  8.         inc        a
  9.         push        acc
  10.         mov        dpl,r6
  11.         mov        dph,r7
  12.         lcall        __divsint
  13.         mov        r4,dpl
  14.         dec        sp
  15.         dec        sp
  16.         pop        ar6
  17.         pop        ar7
  18.         mov        _TH1,r4
  19.         clr        a
  20.         push        acc
  21.         inc        a
  22.         push        acc
  23.         mov        dpl,r6
  24.         mov        dph,r7
  25.         lcall        __modsint
  26.         mov        r6,dpl
  27.         dec        sp
  28.         dec        sp
  29.         mov        _TL1,r6
复制代码

你看看二者指令差了多少,更何况第二种方式还有两个lcall方法__divsint和__modsint没贴上来呢,那执行效率可想而知了……

第二个问题原因类似,汇编就不贴了

点评

性能确实可能有差异,但是不至于这么大,编译器对这种整数除法默认是有优化的 下面用unsigned short BRT作测试(如果是define那么就完全一样了) [attachimg]11742[/attachimg][attachimg]11743[/attachimg] 第二  详情 回复 发表于 2023-6-7 11:11
业余撸代码,专业开飞机
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:328
  • 最近打卡:2025-03-09 19:40:01

9

主题

328

回帖

4501

积分

荣誉版主

积分
4501
发表于 2023-6-7 11:11:50 | 显示全部楼层
hsr*** 发表于 2023-6-7 10:15
可以但非常非常非常非常非常不建议。

性能确实可能有差异,但是不至于这么大,编译器对这种整数除法默认是有优化的

下面用unsigned short BRT作测试(如果是define那么就完全一样了)
Screenshot 2023-06-07 110212.png Screenshot 2023-06-07 110234.png


第二个是一到两个时钟的差别
Screenshot 2023-06-07 105656.png Screenshot 2023-06-07 105834.png

回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:456
  • 最近打卡:2025-05-02 08:26:53
已绑定手机

27

主题

341

回帖

1691

积分

金牌会员

机长

积分
1691
发表于 2023-6-7 14:10:25 | 显示全部楼层
kk*** 发表于 2023-6-7 11:11
性能确实可能有差异,但是不至于这么大,编译器对这种整数除法默认是有优化的

下面用unsigned short BRT ...

编译器不同优化程度可能也不一样,我用的sdcc的中间编译结果。
定时器设置通常都是#define的常量还好,但如果是其它一些不是太好优化的场景,累计下来对性能的影响还是挺可观的。
所以我的意思应该从一开始就应该养成良好的习惯~~

点评

我这也是SDCC,4.2.0 #13081,默认选项;Keil把优化拉高编译出来是完全一样的 对,我赞成,养成良好的习惯并了解最优的解决途径是很重要的  详情 回复 发表于 2023-6-7 14:35
业余撸代码,专业开飞机
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:328
  • 最近打卡:2025-03-09 19:40:01

9

主题

328

回帖

4501

积分

荣誉版主

积分
4501
发表于 2023-6-7 14:35:03 | 显示全部楼层
hsr*** 发表于 2023-6-7 14:10
编译器不同优化程度可能也不一样,我用的sdcc的中间编译结果。
定时器设置通常都是#define的常量还好,但 ...

我这也是SDCC,4.2.0 #13081,默认选项;Keil把优化拉高编译出来是完全一样的
对,我赞成,养成良好的习惯并了解最优的解决途径是很重要的
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2023-12-25 15:38:27

39

主题

204

回帖

651

积分

高级会员

积分
651
发表于 2023-6-8 15:03:28 | 显示全部楼层
hsr*** 发表于 2023-6-7 10:15
可以但非常非常非常非常非常不建议。

第二种方法:
T2H=BRT/256;
T2L=BRT%256;

第一种方法:
TH0 = BRT >> 8;
TL0 = BRT;

看你写的,第一种方法转换为汇编指令比第二种方法转换为汇编指令少很多,
请问,stc单片机是按照汇编指令的顺序去执行的吗?

点评

单片机执行的是机器码,机器码由汇编翻译而来,汇编代码由C语言代码编译生成 机器码和汇编是一一对应的,二者是直接表示单片机内实际操作的  详情 回复 发表于 2023-6-8 17:22
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-3 00:43 , Processed in 0.350898 second(s), 117 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表