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

看冲哥串口视频有疑问

[复制链接]
  • TA的每日心情

    2023-12-25 15:38
  • 签到天数: 1 天

    [LV.1]初来乍到

    39

    主题

    204

    回帖

    651

    积分

    高级会员

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

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

    使用道具 举报

  • TA的每日心情
    开心
    8 小时前
  • 签到天数: 163 天

    [LV.7]常住居民III

    9

    主题

    310

    回帖

    3785

    积分

    荣誉版主

    积分
    3785
    发表于 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]继续写入。
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情

    2023-12-25 15:38
  • 签到天数: 1 天

    [LV.1]初来乍到

    39

    主题

    204

    回帖

    651

    积分

    高级会员

    积分
    651
     楼主| 发表于 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;

    点评

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

    使用道具 举报

  • TA的每日心情
    开心
    8 小时前
  • 签到天数: 163 天

    [LV.7]常住居民III

    9

    主题

    310

    回帖

    3785

    积分

    荣誉版主

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

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

    使用道具 举报

  • TA的每日心情

    2023-12-25 15:38
  • 签到天数: 1 天

    [LV.1]初来乍到

    39

    主题

    204

    回帖

    651

    积分

    高级会员

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

    好的呢
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    8 小时前
  • 签到天数: 134 天

    [LV.7]常住居民III

    8

    主题

    79

    回帖

    1094

    积分

    金牌会员

    机长

    积分
    1094
    发表于 2023-6-7 10:15:25 | 显示全部楼层
    980578873 发表于 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
    业余撸代码,专业开飞机
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    8 小时前
  • 签到天数: 163 天

    [LV.7]常住居民III

    9

    主题

    310

    回帖

    3785

    积分

    荣誉版主

    积分
    3785
    发表于 2023-6-7 11:11:50 | 显示全部楼层
    hsrzq 发表于 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 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    8 小时前
  • 签到天数: 134 天

    [LV.7]常住居民III

    8

    主题

    79

    回帖

    1094

    积分

    金牌会员

    机长

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

    下面用unsigned short BRT ...

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

    点评

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

    使用道具 举报

  • TA的每日心情
    开心
    8 小时前
  • 签到天数: 163 天

    [LV.7]常住居民III

    9

    主题

    310

    回帖

    3785

    积分

    荣誉版主

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

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

    使用道具 举报

  • TA的每日心情

    2023-12-25 15:38
  • 签到天数: 1 天

    [LV.1]初来乍到

    39

    主题

    204

    回帖

    651

    积分

    高级会员

    积分
    651
     楼主| 发表于 2023-6-8 15:03:28 | 显示全部楼层
    hsrzq 发表于 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, 2024-5-18 18:55 , Processed in 0.101083 second(s), 74 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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