980578873 发表于 2023-6-5 16:49:16

看冲哥串口视频有疑问

如下图,没明白T2H=BRT>>8;串口2初始化为什么要右移8位

如下图wptr&=0x0F;是什么意思,也没明白


kksk 发表于 2023-6-6 12:27:19

第一个问题,实际我们希望进行的操作是将BRT这一数值赋值给16位的T2寄存器,该寄存器由高8位T2H和低8位T2L组成,我们分别对这两个寄存器赋值。向T2L赋值时BRT高8位溢出,没有影响;向T2H赋值时,我们只要BRT的高8位,因此右移8位将低8位去掉。

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

980578873 发表于 2023-6-6 16:25:19

kksk 发表于 2023-6-6 12:27
第一个问题,实际我们希望进行的操作是将BRT这一数值赋值给16位的T2寄存器,该寄存器由高8位T2H和低8位T2L ...

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

kksk 发表于 2023-6-6 18:43:17

980578873 发表于 2023-6-6 16:25
第一问题,我可以这样改吗:
T2H=BRT/256;
T2L=BRT%256;


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

980578873 发表于 2023-6-7 09:44:50

kksk 发表于 2023-6-6 18:43
从功能上讲是一样的,我认为没有问题,你可以自行测试一下

好的呢

hsrzq 发表于 2023-6-7 10:15:25

980578873 发表于 2023-6-6 16:25
第一问题,我可以这样改吗:
T2H=BRT/256;
T2L=BRT%256;


可以但非常非常非常非常非常不建议。
      TH0 = BRT >> 8;
      TL0 = BRT;
汇编:
      mov      dptr,#_BRT
      movx      a,@dptr
      mov      r6,a
      inc      dptr
      movx      a,@dptr
      mov      r7,a
      mov      _TH0,r7
      mov      _TL0,r6


      TH1 = BRT / 256;
      TL1 = BRT % 256;
汇编:
        push        ar7
        push        ar6
        clr        a
        push        acc
        inc        a
        push        acc
        mov        dpl,r6
        mov        dph,r7
        lcall        __divsint
        mov        r4,dpl
        dec        sp
        dec        sp
        pop        ar6
        pop        ar7
        mov        _TH1,r4
        clr        a
        push        acc
        inc        a
        push        acc
        mov        dpl,r6
        mov        dph,r7
        lcall        __modsint
        mov        r6,dpl
        dec        sp
        dec        sp
        mov        _TL1,r6

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

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

kksk 发表于 2023-6-7 11:11:50

hsrzq 发表于 2023-6-7 10:15
可以但非常非常非常非常非常不建议。




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

下面用unsigned short BRT作测试(如果是define那么就完全一样了)



第二个是一到两个时钟的差别


hsrzq 发表于 2023-6-7 14:10:25

kksk 发表于 2023-6-7 11:11
性能确实可能有差异,但是不至于这么大,编译器对这种整数除法默认是有优化的

下面用unsigned short BRT ...

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

kksk 发表于 2023-6-7 14:35:03

hsrzq 发表于 2023-6-7 14:10
编译器不同优化程度可能也不一样,我用的sdcc的中间编译结果。
定时器设置通常都是#define的常量还好,但 ...

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

980578873 发表于 2023-6-8 15:03:28

hsrzq 发表于 2023-6-7 10:15
可以但非常非常非常非常非常不建议。




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

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

看你写的,第一种方法转换为汇编指令比第二种方法转换为汇编指令少很多,
请问,stc单片机是按照汇编指令的顺序去执行的吗?
页: [1] 2
查看完整版本: 看冲哥串口视频有疑问