找回密码
 立即注册
楼主: 采***

STC32G的2组CAN模块的缓冲区读写不够快,后续CAN-FD新品建议优化提升

[复制链接]
  • TA的每日心情
    开心
    3 天前
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    1

    主题

    26

    回帖

    193

    积分

    注册会员

    积分
    193
     楼主| 发表于 2024-4-26 16:17:54 | 显示全部楼层
    LAOXU 发表于 2024-4-26 14:49
    22条指令,  32MHz下, 执行时间 0.6875us

    速度可加快  0.6875us.

    大神,收下我的膝盖,用C,3.2US够用了,汇编就算了
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    1

    主题

    117

    回帖

    645

    积分

    高级会员

    积分
    645
    发表于 2024-4-26 16:39:02 | 显示全部楼层
    LAOXU 发表于 2024-4-26 14:49
    22条指令,  32MHz下, 执行时间 0.6875us

    速度可加快  0.6875us.

    看我优化的:

    64:         WRITE_CAN(TX_BUF0, TxBuffer[0]);  
                                      MOV      WR4,#0x0809
                                      MOV      WR6,#0x0A0B
                                      MOV      WR2,#0xFEBB
                                      MOV      WR0,#0x007E
                                      MOV      DR8,TXBUFFER(0x0023)
                                      MOV      @DR0,R4
                                      MOV      @DR0+1,R8
        65:         WRITE_CAN(TX_BUF1, TxBuffer[1]);  
                                      MOV      @DR0,R5
                                      MOV      @DR0+1,R9
        66:         WRITE_CAN(TX_BUF2, TxBuffer[2]);  
                                      MOV      @DR0,R6
                                      MOV      @DR0+1,R10
        67:         WRITE_CAN(TX_BUF3, TxBuffer[3]);  
                                      MOV      @DR0,R7
                                      MOV      @DR0+1,R11
        68:         WRITE_CAN(TX_BUF0, TxBuffer[4]);  
                                      MOV      DR8,TXBUFFER+4
                                      MOV      @DR0,R4
                                      MOV      @DR0+1,R8
        69:         WRITE_CAN(TX_BUF1, TxBuffer[5]);  
                                      MOV      @DR0,R5
                                      MOV      @DR0+1,R9
        70:         WRITE_CAN(TX_BUF2, TxBuffer[6]);  
                                      MOV      @DR0,R6
                                      MOV      @DR0+1,R10
        71:         WRITE_CAN(TX_BUF3, TxBuffer[7]);
                                      MOV      @DR0,R7
                                      MOV      @DR0+1,R11
        72:         WRITE_CAN(TX_BUF0, TxBuffer[8]);  
                                      MOV      DR8,TXBUFFER+8
                                      MOV      @DR0,R4
                                      MOV      @DR0+1,R8
        73:         WRITE_CAN(TX_BUF1, TxBuffer[9]);  
                                      MOV      @DR0,R5
                                      MOV      @DR0+1,R9
        74:         WRITE_CAN(TX_BUF2, TxBuffer[10]);  
                                      MOV      @DR0,R6
                                      MOV      @DR0+1,R10
        75:         WRITE_CAN(TX_BUF3, TxBuffer[11]);
                                      MOV      @DR0,R7
                                      MOV      @DR0+1,R11
        76:         WRITE_CAN(TX_BUF0, TxBuffer[12]);  
                                      MOV      DR8,TXBUFFER+12
                                      MOV      @DR0,R4
                                      MOV      @DR0+1,R8
        77:         WRITE_CAN(TX_BUF1, TxBuffer[13]);  
                                      MOV      @DR0,R5
                                      MOV      @DR0+1,R9
        78:         WRITE_CAN(TX_BUF2, TxBuffer[14]);  
                                      MOV      @DR0,R6
                                      MOV      @DR0+1,R10
        79:         WRITE_CAN(TX_BUF3, TxBuffer[15]);        
                                      MOV      @DR0,R7
                                      MOV      @DR0+1,R11

    点评

    优化的不错! 难得遇到一个汇编高手~~~  详情 回复 发表于 2024-4-27 06:28
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 18:20
  • 签到天数: 164 天

    [LV.7]常住居民III

    17

    主题

    371

    回帖

    1331

    积分

    荣誉版主

    积分
    1331
    发表于 2024-4-26 18:44:03 | 显示全部楼层
    楼上的代码是把stc32指令集发挥到极致。
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    3 天前
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    1

    主题

    26

    回帖

    193

    积分

    注册会员

    积分
    193
     楼主| 发表于 2024-4-26 22:21:06 | 显示全部楼层
    社区闲人 发表于 2024-4-26 18:44
    楼上的代码是把stc32指令集发挥到极致。

    他是大神,我们用用C就行了
    回复 支持 反对 送花

    使用道具 举报

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

    [LV.7]常住居民III

    37

    主题

    872

    回帖

    3996

    积分

    荣誉版主

    积分
    3996
    发表于 2024-4-27 06:28:10 | 显示全部楼层
    zxcv1973 发表于 2024-4-26 16:39
    看我优化的:

    64:         WRITE_CAN(TX_BUF0, TxBuffer[0]);  

    优化的不错!

    难得遇到一个汇编高手~~~
    回复 支持 反对 送花

    使用道具 举报

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

    [LV.7]常住居民III

    37

    主题

    872

    回帖

    3996

    积分

    荣誉版主

    积分
    3996
    发表于 2024-4-27 06:31:05 | 显示全部楼层
    本帖最后由 LAOXU 于 2024-4-27 07:07 编辑

    不过 , 这条指令应该是错的 !

          MOV      DR8,TXBUFFER+4

    251不支持 32位传输

    =========================

    更正:

    经查手册,  251支持 EDATA 内 32位 传输,  楼上这条指令 没问题
    回复 支持 反对 送花

    使用道具 举报

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

    [LV.7]常住居民III

    37

    主题

    872

    回帖

    3996

    积分

    荣誉版主

    积分
    3996
    发表于 2024-4-27 06:39:06 | 显示全部楼层
    本帖最后由 LAOXU 于 2024-4-27 07:14 编辑

    zxcv1973
    的代码, 目前看是最优化的
    回复 支持 反对 送花

    使用道具 举报

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

    [LV.7]常住居民III

    37

    主题

    872

    回帖

    3996

    积分

    荣誉版主

    积分
    3996
    发表于 2024-4-27 07:48:00 | 显示全部楼层
    想了一下, 还能再优化 2条指令, 进一步提速

            int  edata  TXCANADDR[] = {0x007E,0xFEBB,0x0809,0x0A0B};

        64:         WRITE_CAN(TX_BUF0, TxBuffer[0]);  
                            MOV      DR0,TXCANADDR
                            MOV      DR4,TXCANADDR+4
                            MOV      @DR0,R4
                            MOV      DR8,TXBUFFER
                            MOV      @DR0+1,R8
        65:         WRITE_CAN(TX_BUF1, TxBuffer[1]);  
                            ...........
                            ...........


    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    550

    主题

    9351

    回帖

    1万

    积分

    管理员

    积分
    13882
    发表于 2024-5-2 15:40:36 | 显示全部楼层
    STC32G96K256, 已在对 2组独立的 CAN-FD 增加 DMA 的支持:
    ===开发周期又要加长了

    CAN-FD1/
    CAN-FD2 接收到的数据直接 DMA 到 XRAM,
    XRAM的数据直接 CAN-FD1/CAN-FD2 发送出去,

    CAN-FD1 <== 外设到外设直接 DMA ==> CAN-FD2

    硬干了

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    3 天前
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    1

    主题

    26

    回帖

    193

    积分

    注册会员

    积分
    193
     楼主| 发表于 6 天前 | 显示全部楼层
    神农鼎 发表于 2024-5-2 15:40
    STC32G96K256, 已在对 2组独立的 CAN-FD 增加 DMA 的支持:
    ===开发周期又要加长了

    其实也不用DMA,直接多加个发送fifo就行
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-10 03:09 , Processed in 0.067786 second(s), 64 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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