看冲哥串口视频有疑问
如下图,没明白T2H=BRT>>8;串口2初始化为什么要右移8位如下图wptr&=0x0F;是什么意思,也没明白
第一个问题,实际我们希望进行的操作是将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继续写入。 kksk 发表于 2023-6-6 12:27
第一个问题,实际我们希望进行的操作是将BRT这一数值赋值给16位的T2寄存器,该寄存器由高8位T2H和低8位T2L ...
第一问题,我可以这样改吗:
T2H=BRT/256;
T2L=BRT%256;
第二问题,我可以这样改吗:
if(wptr>15)
wptr=0; 980578873 发表于 2023-6-6 16:25
第一问题,我可以这样改吗:
T2H=BRT/256;
T2L=BRT%256;
从功能上讲是一样的,我认为没有问题,你可以自行测试一下 kksk 发表于 2023-6-6 18:43
从功能上讲是一样的,我认为没有问题,你可以自行测试一下
好的呢 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没贴上来呢,那执行效率可想而知了……
第二个问题原因类似,汇编就不贴了 hsrzq 发表于 2023-6-7 10:15
可以但非常非常非常非常非常不建议。
性能确实可能有差异,但是不至于这么大,编译器对这种整数除法默认是有优化的
下面用unsigned short BRT作测试(如果是define那么就完全一样了)
第二个是一到两个时钟的差别
kksk 发表于 2023-6-7 11:11
性能确实可能有差异,但是不至于这么大,编译器对这种整数除法默认是有优化的
下面用unsigned short BRT ...
编译器不同优化程度可能也不一样,我用的sdcc的中间编译结果。
定时器设置通常都是#define的常量还好,但如果是其它一些不是太好优化的场景,累计下来对性能的影响还是挺可观的。
所以我的意思应该从一开始就应该养成良好的习惯~~ hsrzq 发表于 2023-6-7 14:10
编译器不同优化程度可能也不一样,我用的sdcc的中间编译结果。
定时器设置通常都是#define的常量还好,但 ...
我这也是SDCC,4.2.0 #13081,默认选项;Keil把优化拉高编译出来是完全一样的
对,我赞成,养成良好的习惯并了解最优的解决途径是很重要的 hsrzq 发表于 2023-6-7 10:15
可以但非常非常非常非常非常不建议。
第二种方法:
T2H=BRT/256;
T2L=BRT%256;
第一种方法:
TH0 = BRT >> 8;
TL0 = BRT;
看你写的,第一种方法转换为汇编指令比第二种方法转换为汇编指令少很多,
请问,stc单片机是按照汇编指令的顺序去执行的吗?
页:
[1]
2