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

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

[复制链接]

2

主题

185

回帖

1048

积分

金牌会员

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

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

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

使用道具 举报 送花

2

主题

185

回帖

1048

积分

金牌会员

积分
1048
发表于 2024-4-26 11:16:49 | 显示全部楼层
LAO*** 发表于 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
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1327

回帖

5395

积分

荣誉版主

积分
5395
发表于 2024-4-26 13:55:29 | 显示全部楼层
zxcv*** 发表于 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
只是优化力度不大.
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1327

回帖

5395

积分

荣誉版主

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1327

回帖

5395

积分

荣誉版主

积分
5395
发表于 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


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1327

回帖

5395

积分

荣誉版主

积分
5395
发表于 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


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1327

回帖

5395

积分

荣誉版主

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

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1327

回帖

5395

积分

荣誉版主

积分
5395
发表于 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


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1327

回帖

5395

积分

荣誉版主

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

速度可加快  0.6875us.

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

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 04:36 , Processed in 0.126866 second(s), 105 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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