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.
汇编优化效果还是不错的.