采果农 发表于 2024-4-26 16:17:54

LAOXU 发表于 2024-4-26 14:49
22条指令,32MHz下, 执行时间 0.6875us

速度可加快0.6875us.


大神,收下我的膝盖,用C,3.2US够用了,汇编就算了

zxcv1973 发表于 2024-4-26 16:39:02

LAOXU 发表于 2024-4-26 14:49
22条指令,32MHz下, 执行时间 0.6875us

速度可加快0.6875us.


看我优化的:

64:         WRITE_CAN(TX_BUF0, TxBuffer);
                                  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);
                                  MOV      @DR0,R5
                                  MOV      @DR0+1,R9
    66:         WRITE_CAN(TX_BUF2, TxBuffer);
                                  MOV      @DR0,R6
                                  MOV      @DR0+1,R10
    67:         WRITE_CAN(TX_BUF3, TxBuffer);
                                  MOV      @DR0,R7
                                  MOV      @DR0+1,R11
    68:         WRITE_CAN(TX_BUF0, TxBuffer);
                                  MOV      DR8,TXBUFFER+4
                                  MOV      @DR0,R4
                                  MOV      @DR0+1,R8
    69:         WRITE_CAN(TX_BUF1, TxBuffer);
                                  MOV      @DR0,R5
                                  MOV      @DR0+1,R9
    70:         WRITE_CAN(TX_BUF2, TxBuffer);
                                  MOV      @DR0,R6
                                  MOV      @DR0+1,R10
    71:         WRITE_CAN(TX_BUF3, TxBuffer);
                                  MOV      @DR0,R7
                                  MOV      @DR0+1,R11
    72:         WRITE_CAN(TX_BUF0, TxBuffer);
                                  MOV      DR8,TXBUFFER+8
                                  MOV      @DR0,R4
                                  MOV      @DR0+1,R8
    73:         WRITE_CAN(TX_BUF1, TxBuffer);
                                  MOV      @DR0,R5
                                  MOV      @DR0+1,R9
    74:         WRITE_CAN(TX_BUF2, TxBuffer);
                                  MOV      @DR0,R6
                                  MOV      @DR0+1,R10
    75:         WRITE_CAN(TX_BUF3, TxBuffer);
                                  MOV      @DR0,R7
                                  MOV      @DR0+1,R11
    76:         WRITE_CAN(TX_BUF0, TxBuffer);
                                  MOV      DR8,TXBUFFER+12
                                  MOV      @DR0,R4
                                  MOV      @DR0+1,R8
    77:         WRITE_CAN(TX_BUF1, TxBuffer);
                                  MOV      @DR0,R5
                                  MOV      @DR0+1,R9
    78:         WRITE_CAN(TX_BUF2, TxBuffer);
                                  MOV      @DR0,R6
                                  MOV      @DR0+1,R10
    79:         WRITE_CAN(TX_BUF3, TxBuffer);      
                                  MOV      @DR0,R7
                                  MOV      @DR0+1,R11

社区闲人 发表于 2024-4-26 18:44:03

楼上的代码是把stc32指令集发挥到极致。

采果农 发表于 2024-4-26 22:21:06

社区闲人 发表于 2024-4-26 18:44
楼上的代码是把stc32指令集发挥到极致。

他是大神,我们用用C就行了

LAOXU 发表于 2024-4-27 06:28:10

zxcv1973 发表于 2024-4-26 16:39
看我优化的:

64:         WRITE_CAN(TX_BUF0, TxBuffer);


优化的不错!

难得遇到一个汇编高手~~~ {:biggrin:}

LAOXU 发表于 2024-4-27 06:31:05

本帖最后由 LAOXU 于 2024-4-27 07:07 编辑

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

      MOV      DR8,TXBUFFER+4

251不支持 32位传输

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

更正:

经查手册,251支持 EDATA 内 32位 传输,楼上这条指令 没问题

LAOXU 发表于 2024-4-27 06:39:06

本帖最后由 LAOXU 于 2024-4-27 07:14 编辑

zxcv1973
的代码, 目前看是最优化的

LAOXU 发表于 2024-4-27 07:48:00

想了一下, 还能再优化 2条指令, 进一步提速

        intedataTXCANADDR[] = {0x007E,0xFEBB,0x0809,0x0A0B};

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


神农鼎 发表于 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

硬干了

采果农 发表于 2024-5-4 15:07:58

神农鼎 发表于 2024-5-2 15:40
STC32G96K256, 已在对 2组独立的 CAN-FD 增加 DMA 的支持:
===开发周期又要加长了



其实也不用DMA,直接多加个发送fifo就行
页: 1 2 3 4 5 6 7 [8] 9
查看完整版本: STC32G的2组CAN模块的缓冲区读写不够快,后续CAN-FD新品建议优化提升