zxcv1973 发表于 2024-4-26 11:07:19

LAOXU 发表于 2024-4-26 08:38
你那 TxBuffer[ ] 数组, 是放在 xram 中 , 还是 edata中 ?

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

他那3.2us的写缓冲区时间,肯定是在edata中

zxcv1973 发表于 2024-4-26 11:16:49

LAOXU 发表于 2024-4-26 09:07
要我帮你汇编优化一下吗?

TxBuffer[ ] 数组 放在edata中,


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

神农鼎 发表于 2024-4-26 13:39:52

改 STC32G8K64-42MHz, 跑 42MHz

LAOXU 发表于 2024-4-26 13:55:29

zxcv1973 发表于 2024-4-26 11:16
他后来优化后的程序基本上是最快了,缓冲区写一个字节最快也要6个时钟,写了17字节总共要102个时钟,32MH ...

我把他的核心程序

        WRITE_CAN(TX_BUF0, TxBuffer);
        WRITE_CAN(TX_BUF1, TxBuffer);
        WRITE_CAN(TX_BUF2, TxBuffer);
        WRITE_CAN(TX_BUF3, TxBuffer);
        ........

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

LAOXU 发表于 2024-4-26 14:01:06

让他上传 src文件的 目的, 主要是要他的一些 数据参数的定义, 汇编有点专用性质, 如果数据参数定义不匹配, 在 C中不太好调用.

LAOXU 发表于 2024-4-26 14:31:49

核心程序 反汇编


    64:         WRITE_CAN(TX_BUF0, TxBuffer);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);      
0xFE00EB   740B      MOV      A,#0x0B
0xFE00ED   7A1BB0      MOV      @DR4,R11
0xFE00F0   7E730032    MOV      R7,0x0032
0xFE00F4   7A0B70      MOV      @DR0,R7


LAOXU 发表于 2024-4-26 14:32:47

优化后的 程序:


    64:         WRITE_CAN(TX_BUF0, TxBuffer);
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);
0xFE0045   7A1BB0      MOV      @DR4,R9
0xFE004C   7A0BB0      MOV      @DR0,R11
    66:         WRITE_CAN(TX_BUF2, TxBuffer);
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);
0xFE0045   7A1BB0      MOV      @DR4,R9
0xFE004C   7A0BB0      MOV      @DR0,R11
    68:         WRITE_CAN(TX_BUF0, TxBuffer);
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);
0xFE0045   7A1BB0      MOV      @DR4,R9
0xFE004C   7A0BB0      MOV      @DR0,R11
    70:         WRITE_CAN(TX_BUF2, TxBuffer);
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);
0xFE0045   7A1BB0      MOV      @DR4,R9
0xFE004C   7A0BB0      MOV      @DR0,R11
    72:         WRITE_CAN(TX_BUF0, TxBuffer);
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);
0xFE0045   7A1BB0      MOV      @DR4,R9
0xFE004C   7A0BB0      MOV      @DR0,R11
    74:         WRITE_CAN(TX_BUF2, TxBuffer);
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);
0xFE0045   7A1BB0      MOV      @DR4,R9
0xFE004C   7A0BB0      MOV      @DR0,R11
    76:         WRITE_CAN(TX_BUF0, TxBuffer);
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);
0xFE00D5   7A1BB0      MOV      @DR4,R9
0xFE00DC   7A0BB0      MOV      @DR0,R11
    78:         WRITE_CAN(TX_BUF2, TxBuffer);
0xFE00DF   740A      MOV      WR8,#0x0A0B
0xFE00E1   7A1BB0      MOV      @DR4,R8
0xFE00E8   7A0BB0      MOV      @DR0,R11
    79:         WRITE_CAN(TX_BUF3, TxBuffer);      
0xFE0045   7A1BB0      MOV      @DR4,R9
0xFE004C   7A0BB0      MOV      @DR0,R11


LAOXU 发表于 2024-4-26 14:35:31

省了 17条指令, 再加上 中断程序 入口, 判断语句 是否还可优化 ?

节省的时钟周期,非常明显

LAOXU 发表于 2024-4-26 14:45:58

再继续优化, 省了 22条指令
   64:         WRITE_CAN(TX_BUF0, TxBuffer);
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);
0xFE0045   7A1BB0      MOV      @DR4,R9
0xFE004C   7A0BB0      MOV      @DR0,R11
    66:         WRITE_CAN(TX_BUF2, TxBuffer);
0xFE0051   7A1BB0      MOV      @DR4,R12
0xFE0054   7EB30025    MOV      WR10,0x0025
0xFE0058   7A0BB0      MOV      @DR0,R10
    67:         WRITE_CAN(TX_BUF3, TxBuffer);
0xFE0045   7A1BB0      MOV      @DR4,R13
0xFE004C   7A0BB0      MOV      @DR0,R11
    68:         WRITE_CAN(TX_BUF0, TxBuffer);
0xFE0069   7A1BB0      MOV      @DR4,R8
0xFE006C   7EB30027    MOV      WR10,0x0027
0xFE0070   7A0BB0      MOV      @DR0,R10
    69:         WRITE_CAN(TX_BUF1, TxBuffer);
0xFE0045   7A1BB0      MOV      @DR4,R9
0xFE004C   7A0BB0      MOV      @DR0,R11
    70:         WRITE_CAN(TX_BUF2, TxBuffer);
0xFE0081   7A1BB0      MOV      @DR4,R12
0xFE0084   7EB30029    MOV      WR10,0x0029
0xFE0088   7A0BB0      MOV      @DR0,R10
    71:         WRITE_CAN(TX_BUF3, TxBuffer);
0xFE0045   7A1BB0      MOV      @DR4,R13
0xFE004C   7A0BB0      MOV      @DR0,R11
    72:         WRITE_CAN(TX_BUF0, TxBuffer);
0xFE0099   7A1BB0      MOV      @DR4,R8
0xFE009C   7EB3002B    MOV      WR10,0x002B
0xFE00A0   7A0BB0      MOV      @DR0,R10
    73:         WRITE_CAN(TX_BUF1, TxBuffer);
0xFE0045   7A1BB0      MOV      @DR4,R9
0xFE004C   7A0BB0      MOV      @DR0,R11
    74:         WRITE_CAN(TX_BUF2, TxBuffer);
0xFE00B1   7A1BB0      MOV      @DR4,R12
0xFE00B4   7EB3002D    MOV      WR10,0x002D
0xFE00B8   7A0BB0      MOV      @DR0,R10
    75:         WRITE_CAN(TX_BUF3, TxBuffer);
0xFE0045   7A1BB0      MOV      @DR4,R13
0xFE004C   7A0BB0      MOV      @DR0,R11
    76:         WRITE_CAN(TX_BUF0, TxBuffer);
0xFE00C9   7A1BB0      MOV      @DR4,R8
0xFE00CC   7EB3002F    MOV      WR10,0x002F
0xFE00D0   7A0BB0      MOV      @DR0,R10
    77:         WRITE_CAN(TX_BUF1, TxBuffer);
0xFE00D5   7A1BB0      MOV      @DR4,R9
0xFE00DC   7A0BB0      MOV      @DR0,R11
    78:         WRITE_CAN(TX_BUF2, TxBuffer);
0xFE00E1   7A1BB0      MOV      @DR4,R12
0xFE00E8   7A0BB0      MOV      @DR0,R11
    79:         WRITE_CAN(TX_BUF3, TxBuffer);      
0xFE0045   7A1BB0      MOV      @DR4,R13
0xFE004C   7A0BB0      MOV      @DR0,R11


LAOXU 发表于 2024-4-26 14:49:58

22条指令,32MHz下, 执行时间 0.6875us

速度可加快0.6875us.

汇编优化效果还是不错的.
页: 1 2 3 4 5 6 [7] 8 9
查看完整版本: STC32G的2组CAN模块的缓冲区读写不够快,后续CAN-FD新品建议优化提升