采果农
发表于 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就行