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

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

[复制链接]

该用户从未签到

1

主题

119

回帖

657

积分

高级会员

积分
657
发表于 2024-4-26 11:07:19 | 显示全部楼层
LAOXU 发表于 2024-4-26 08:38
你那 TxBuffer[ ] 数组, 是放在 xram 中 , 还是 edata中 ?

放在 edata中 , 速度最快.  放在 xdata中, 速度 ...

他那3.2us的写缓冲区时间,肯定是在edata中
回复 支持 反对 送花

使用道具 举报

该用户从未签到

1

主题

119

回帖

657

积分

高级会员

积分
657
发表于 2024-4-26 11:16:49 | 显示全部楼层
LAOXU 发表于 2024-4-26 09:07
要我帮你汇编优化一下吗?

TxBuffer[ ] 数组 放在  edata中,

他后来优化后的程序基本上是最快了,缓冲区写一个字节最快也要6个时钟,写了17字节总共要102个时钟,32MHz下用时3.1875us,约等于3.2us

点评

我把他的核心程序 WRITE_CAN(TX_BUF0, TxBuffer[0]); WRITE_CAN(TX_BUF1, TxBuffer[1]); WRITE_CAN(TX_BUF2, TxBuffer[2]); WRITE_CAN(TX_BUF3, TxBuffer[3]); ........ 编译后 , 看过反汇编, 对C来说,  详情 回复 发表于 2024-4-26 13:55
回复 支持 反对 送花

使用道具 举报

该用户从未签到

552

主题

9497

回帖

1万

积分

管理员

积分
14071
发表于 2024-4-26 13:39:52 | 显示全部楼层
改 STC32G8K64-42MHz, 跑 42MHz
回复 支持 反对 送花

使用道具 举报

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

    [LV.7]常住居民III

    39

    主题

    887

    回帖

    4130

    积分

    荣誉版主

    积分
    4130
    发表于 2024-4-26 13:55:29 | 显示全部楼层
    zxcv1973 发表于 2024-4-26 11:16
    他后来优化后的程序基本上是最快了,缓冲区写一个字节最快也要6个时钟,写了17字节总共要102个时钟,32MH ...

    我把他的核心程序

            WRITE_CAN(TX_BUF0, TxBuffer[0]);
            WRITE_CAN(TX_BUF1, TxBuffer[1]);
            WRITE_CAN(TX_BUF2, TxBuffer[2]);
            WRITE_CAN(TX_BUF3, TxBuffer[3]);
            ........

    编译后 , 看过反汇编,  对C来说, 已到极致.
    但对汇编来说, 还能 再优化 , 可省十几个时钟,  约 0.5us
    只是优化力度不大.
    回复 支持 反对 送花

    使用道具 举报

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

    [LV.7]常住居民III

    39

    主题

    887

    回帖

    4130

    积分

    荣誉版主

    积分
    4130
    发表于 2024-4-26 14:01:06 | 显示全部楼层
    让他上传 src文件的 目的, 主要是要他的一些 数据参数的定义, 汇编有点专用性质, 如果数据参数定义不匹配, 在 C中不太好调用.
    回复 支持 反对 送花

    使用道具 举报

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

    [LV.7]常住居民III

    39

    主题

    887

    回帖

    4130

    积分

    荣誉版主

    积分
    4130
    发表于 2024-4-26 14:31:49 | 显示全部楼层
    核心程序 反汇编


        64:         WRITE_CAN(TX_BUF0, TxBuffer[0]);  
    0xFE0027   7408        MOV      A,#0x08
    0xFE0029   7E34FEBB    MOV      WR6,#0xFEBB
    0xFE002D   7E24007E    MOV      WR4,#0x007E
    0xFE0031   7A1BB0      MOV      @DR4,R11
    0xFE0034   7EB30023    MOV      R11,TXBUFFER(0x0023)
    0xFE0038   7E14FEBC    MOV      WR2,#0xFEBC
    0xFE003C   7E04007E    MOV      WR0,#0x007E
    0xFE0040   7A0BB0      MOV      @DR0,R11
        65:         WRITE_CAN(TX_BUF1, TxBuffer[1]);  
    0xFE0043   7409        MOV      A,#0x09
    0xFE0045   7A1BB0      MOV      @DR4,R11
    0xFE0048   7EB30024    MOV      R11,0x0024
    0xFE004C   7A0BB0      MOV      @DR0,R11
        66:         WRITE_CAN(TX_BUF2, TxBuffer[2]);  
    0xFE004F   740A        MOV      A,#0x0A
    0xFE0051   7A1BB0      MOV      @DR4,R11
    0xFE0054   7EB30025    MOV      R11,0x0025
    0xFE0058   7A0BB0      MOV      @DR0,R11
        67:         WRITE_CAN(TX_BUF3, TxBuffer[3]);  
    0xFE005B   740B        MOV      A,#0x0B
    0xFE005D   7A1BB0      MOV      @DR4,R11
    0xFE0060   7EB30026    MOV      R11,0x0026
    0xFE0064   7A0BB0      MOV      @DR0,R11
        68:         WRITE_CAN(TX_BUF0, TxBuffer[4]);  
    0xFE0067   7408        MOV      A,#0x08
    0xFE0069   7A1BB0      MOV      @DR4,R11
    0xFE006C   7EB30027    MOV      R11,0x0027
    0xFE0070   7A0BB0      MOV      @DR0,R11
        69:         WRITE_CAN(TX_BUF1, TxBuffer[5]);  
    0xFE0073   7409        MOV      A,#0x09
    0xFE0075   7A1BB0      MOV      @DR4,R11
    0xFE0078   7EB30028    MOV      R11,0x0028
    0xFE007C   7A0BB0      MOV      @DR0,R11
        70:         WRITE_CAN(TX_BUF2, TxBuffer[6]);  
    0xFE007F   740A        MOV      A,#0x0A
    0xFE0081   7A1BB0      MOV      @DR4,R11
    0xFE0084   7EB30029    MOV      R11,0x0029
    0xFE0088   7A0BB0      MOV      @DR0,R11
        71:         WRITE_CAN(TX_BUF3, TxBuffer[7]);
    0xFE008B   740B        MOV      A,#0x0B
    0xFE008D   7A1BB0      MOV      @DR4,R11
    0xFE0090   7EB3002A    MOV      R11,0x002A
    0xFE0094   7A0BB0      MOV      @DR0,R11
        72:         WRITE_CAN(TX_BUF0, TxBuffer[8]);  
    0xFE0097   7408        MOV      A,#0x08
    0xFE0099   7A1BB0      MOV      @DR4,R11
    0xFE009C   7EB3002B    MOV      R11,0x002B
    0xFE00A0   7A0BB0      MOV      @DR0,R11
        73:         WRITE_CAN(TX_BUF1, TxBuffer[9]);  
    0xFE00A3   7409        MOV      A,#0x09
    0xFE00A5   7A1BB0      MOV      @DR4,R11
    0xFE00A8   7EB3002C    MOV      R11,0x002C
    0xFE00AC   7A0BB0      MOV      @DR0,R11
        74:         WRITE_CAN(TX_BUF2, TxBuffer[10]);  
    0xFE00AF   740A        MOV      A,#0x0A
    0xFE00B1   7A1BB0      MOV      @DR4,R11
    0xFE00B4   7EB3002D    MOV      R11,0x002D
    0xFE00B8   7A0BB0      MOV      @DR0,R11
        75:         WRITE_CAN(TX_BUF3, TxBuffer[11]);
    0xFE00BB   740B        MOV      A,#0x0B
    0xFE00BD   7A1BB0      MOV      @DR4,R11
    0xFE00C0   7EB3002E    MOV      R11,0x002E
    0xFE00C4   7A0BB0      MOV      @DR0,R11
        76:         WRITE_CAN(TX_BUF0, TxBuffer[12]);  
    0xFE00C7   7408        MOV      A,#0x08
    0xFE00C9   7A1BB0      MOV      @DR4,R11
    0xFE00CC   7EB3002F    MOV      R11,0x002F
    0xFE00D0   7A0BB0      MOV      @DR0,R11
        77:         WRITE_CAN(TX_BUF1, TxBuffer[13]);  
    0xFE00D3   7409        MOV      A,#0x09
    0xFE00D5   7A1BB0      MOV      @DR4,R11
    0xFE00D8   7EB30030    MOV      R11,0x0030
    0xFE00DC   7A0BB0      MOV      @DR0,R11
        78:         WRITE_CAN(TX_BUF2, TxBuffer[14]);  
    0xFE00DF   740A        MOV      A,#0x0A
    0xFE00E1   7A1BB0      MOV      @DR4,R11
    0xFE00E4   7EB30031    MOV      R11,0x0031
    0xFE00E8   7A0BB0      MOV      @DR0,R11
        79:         WRITE_CAN(TX_BUF3, TxBuffer[15]);        
    0xFE00EB   740B        MOV      A,#0x0B
    0xFE00ED   7A1BB0      MOV      @DR4,R11
    0xFE00F0   7E730032    MOV      R7,0x0032
    0xFE00F4   7A0B70      MOV      @DR0,R7


    回复 支持 反对 送花

    使用道具 举报

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

    [LV.7]常住居民III

    39

    主题

    887

    回帖

    4130

    积分

    荣誉版主

    积分
    4130
    发表于 2024-4-26 14:32:47 | 显示全部楼层
    优化后的 程序:


        64:         WRITE_CAN(TX_BUF0, TxBuffer[0]);  
    0xFE0027   7408        MOV      WR8,#0x0809
    0xFE0029   7E34FEBB    MOV      WR6,#0xFEBB
    0xFE002D   7E24007E    MOV      WR4,#0x007E
    0xFE0031   7A1BB0      MOV      @DR4,R8
    0xFE0034   7EB30023    MOV      WR10,TXBUFFER(0x0023)
    0xFE0038   7E14FEBC    MOV      WR2,#0xFEBC
    0xFE003C   7E04007E    MOV      WR0,#0x007E
    0xFE0040   7A0BB0      MOV      @DR0,R10
        65:         WRITE_CAN(TX_BUF1, TxBuffer[1]);  
    0xFE0045   7A1BB0      MOV      @DR4,R9
    0xFE004C   7A0BB0      MOV      @DR0,R11
        66:         WRITE_CAN(TX_BUF2, TxBuffer[2]);  
    0xFE004F   740A        MOV      WR8,#0x0A0B
    0xFE0051   7A1BB0      MOV      @DR4,R8
    0xFE0054   7EB30025    MOV      WR10,0x0025
    0xFE0058   7A0BB0      MOV      @DR0,R10
        67:         WRITE_CAN(TX_BUF3, TxBuffer[3]);  
    0xFE0045   7A1BB0      MOV      @DR4,R9
    0xFE004C   7A0BB0      MOV      @DR0,R11
        68:         WRITE_CAN(TX_BUF0, TxBuffer[4]);  
    0xFE0027   7408        MOV      WR8,#0x0809
    0xFE0069   7A1BB0      MOV      @DR4,R8
    0xFE006C   7EB30027    MOV      WR10,0x0027
    0xFE0070   7A0BB0      MOV      @DR0,R10
        69:         WRITE_CAN(TX_BUF1, TxBuffer[5]);  
    0xFE0045   7A1BB0      MOV      @DR4,R9
    0xFE004C   7A0BB0      MOV      @DR0,R11
        70:         WRITE_CAN(TX_BUF2, TxBuffer[6]);  
    0xFE00DF   740A        MOV      WR8,#0x0A0B
    0xFE0081   7A1BB0      MOV      @DR4,R8
    0xFE0084   7EB30029    MOV      WR10,0x0029
    0xFE0088   7A0BB0      MOV      @DR0,R10
        71:         WRITE_CAN(TX_BUF3, TxBuffer[7]);
    0xFE0045   7A1BB0      MOV      @DR4,R9
    0xFE004C   7A0BB0      MOV      @DR0,R11
        72:         WRITE_CAN(TX_BUF0, TxBuffer[8]);  
    0xFE0027   7408        MOV      WR8,#0x0809
    0xFE0099   7A1BB0      MOV      @DR4,R8
    0xFE009C   7EB3002B    MOV      WR10,0x002B
    0xFE00A0   7A0BB0      MOV      @DR0,R10
        73:         WRITE_CAN(TX_BUF1, TxBuffer[9]);  
    0xFE0045   7A1BB0      MOV      @DR4,R9
    0xFE004C   7A0BB0      MOV      @DR0,R11
        74:         WRITE_CAN(TX_BUF2, TxBuffer[10]);  
    0xFE00DF   740A        MOV      WR8,#0x0A0B
    0xFE00B1   7A1BB0      MOV      @DR4,R11
    0xFE00B4   7EB3002D    MOV      WR10,0x002D
    0xFE00B8   7A0BB0      MOV      @DR0,R10
        75:         WRITE_CAN(TX_BUF3, TxBuffer[11]);
    0xFE0045   7A1BB0      MOV      @DR4,R9
    0xFE004C   7A0BB0      MOV      @DR0,R11
        76:         WRITE_CAN(TX_BUF0, TxBuffer[12]);  
    0xFE0027   7408        MOV      WR8,#0x0809
    0xFE00C9   7A1BB0      MOV      @DR4,R8
    0xFE00CC   7EB3002F    MOV      WR10,0x002F
    0xFE00D0   7A0BB0      MOV      @DR0,R10
        77:         WRITE_CAN(TX_BUF1, TxBuffer[13]);  
    0xFE00D5   7A1BB0      MOV      @DR4,R9
    0xFE00DC   7A0BB0      MOV      @DR0,R11
        78:         WRITE_CAN(TX_BUF2, TxBuffer[14]);  
    0xFE00DF   740A        MOV      WR8,#0x0A0B
    0xFE00E1   7A1BB0      MOV      @DR4,R8
    0xFE00E8   7A0BB0      MOV      @DR0,R11
        79:         WRITE_CAN(TX_BUF3, TxBuffer[15]);        
    0xFE0045   7A1BB0      MOV      @DR4,R9
    0xFE004C   7A0BB0      MOV      @DR0,R11


    回复 支持 反对 送花

    使用道具 举报

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

    [LV.7]常住居民III

    39

    主题

    887

    回帖

    4130

    积分

    荣誉版主

    积分
    4130
    发表于 2024-4-26 14:35:31 | 显示全部楼层
    省了 17条指令, 再加上 中断程序 入口, 判断语句 是否还可优化 ?

    节省的时钟周期,  非常明显
    回复 支持 反对 送花

    使用道具 举报

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

    [LV.7]常住居民III

    39

    主题

    887

    回帖

    4130

    积分

    荣誉版主

    积分
    4130
    发表于 2024-4-26 14:45:58 | 显示全部楼层
    再继续优化, 省了 22条指令
       64:         WRITE_CAN(TX_BUF0, TxBuffer[0]);  
    0xFE0027   7408        MOV      WR8,#0x0809
    0xFE004F   740A        MOV      WR12,#0x0A0B
    0xFE0029   7E34FEBB    MOV      WR6,#0xFEBB
    0xFE002D   7E24007E    MOV      WR4,#0x007E
    0xFE0031   7A1BB0      MOV      @DR4,R8
    0xFE0034   7EB30023    MOV      WR10,TXBUFFER(0x0023)
    0xFE0038   7E14FEBC    MOV      WR2,#0xFEBC
    0xFE003C   7E04007E    MOV      WR0,#0x007E
    0xFE0040   7A0BB0      MOV      @DR0,R10
        65:         WRITE_CAN(TX_BUF1, TxBuffer[1]);  
    0xFE0045   7A1BB0      MOV      @DR4,R9
    0xFE004C   7A0BB0      MOV      @DR0,R11
        66:         WRITE_CAN(TX_BUF2, TxBuffer[2]);  
    0xFE0051   7A1BB0      MOV      @DR4,R12
    0xFE0054   7EB30025    MOV      WR10,0x0025
    0xFE0058   7A0BB0      MOV      @DR0,R10
        67:         WRITE_CAN(TX_BUF3, TxBuffer[3]);  
    0xFE0045   7A1BB0      MOV      @DR4,R13
    0xFE004C   7A0BB0      MOV      @DR0,R11
        68:         WRITE_CAN(TX_BUF0, TxBuffer[4]);  
    0xFE0069   7A1BB0      MOV      @DR4,R8
    0xFE006C   7EB30027    MOV      WR10,0x0027
    0xFE0070   7A0BB0      MOV      @DR0,R10
        69:         WRITE_CAN(TX_BUF1, TxBuffer[5]);  
    0xFE0045   7A1BB0      MOV      @DR4,R9
    0xFE004C   7A0BB0      MOV      @DR0,R11
        70:         WRITE_CAN(TX_BUF2, TxBuffer[6]);  
    0xFE0081   7A1BB0      MOV      @DR4,R12
    0xFE0084   7EB30029    MOV      WR10,0x0029
    0xFE0088   7A0BB0      MOV      @DR0,R10
        71:         WRITE_CAN(TX_BUF3, TxBuffer[7]);
    0xFE0045   7A1BB0      MOV      @DR4,R13
    0xFE004C   7A0BB0      MOV      @DR0,R11
        72:         WRITE_CAN(TX_BUF0, TxBuffer[8]);  
    0xFE0099   7A1BB0      MOV      @DR4,R8
    0xFE009C   7EB3002B    MOV      WR10,0x002B
    0xFE00A0   7A0BB0      MOV      @DR0,R10
        73:         WRITE_CAN(TX_BUF1, TxBuffer[9]);  
    0xFE0045   7A1BB0      MOV      @DR4,R9
    0xFE004C   7A0BB0      MOV      @DR0,R11
        74:         WRITE_CAN(TX_BUF2, TxBuffer[10]);  
    0xFE00B1   7A1BB0      MOV      @DR4,R12
    0xFE00B4   7EB3002D    MOV      WR10,0x002D
    0xFE00B8   7A0BB0      MOV      @DR0,R10
        75:         WRITE_CAN(TX_BUF3, TxBuffer[11]);
    0xFE0045   7A1BB0      MOV      @DR4,R13
    0xFE004C   7A0BB0      MOV      @DR0,R11
        76:         WRITE_CAN(TX_BUF0, TxBuffer[12]);  
    0xFE00C9   7A1BB0      MOV      @DR4,R8
    0xFE00CC   7EB3002F    MOV      WR10,0x002F
    0xFE00D0   7A0BB0      MOV      @DR0,R10
        77:         WRITE_CAN(TX_BUF1, TxBuffer[13]);  
    0xFE00D5   7A1BB0      MOV      @DR4,R9
    0xFE00DC   7A0BB0      MOV      @DR0,R11
        78:         WRITE_CAN(TX_BUF2, TxBuffer[14]);  
    0xFE00E1   7A1BB0      MOV      @DR4,R12
    0xFE00E8   7A0BB0      MOV      @DR0,R11
        79:         WRITE_CAN(TX_BUF3, TxBuffer[15]);        
    0xFE0045   7A1BB0      MOV      @DR4,R13
    0xFE004C   7A0BB0      MOV      @DR0,R11


    回复 支持 反对 送花

    使用道具 举报

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

    [LV.7]常住居民III

    39

    主题

    887

    回帖

    4130

    积分

    荣誉版主

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

    速度可加快  0.6875us.

    汇编优化效果还是不错的.
    回复 支持 1 反对 0 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-19 06:15 , Processed in 0.071797 second(s), 67 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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