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

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

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-01-01 20:46:17

2

主题

29

回帖

214

积分

中级会员

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

速度可加快  0.6875us.

大神,收下我的膝盖,用C,3.2US够用了,汇编就算了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-05-16 11:56:09

2

主题

186

回帖

1058

积分

金牌会员

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

速度可加快  0.6875us.

看我优化的:

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

点评

优化的不错! 难得遇到一个汇编高手~~~  详情 回复 发表于 2024-4-27 06:28
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:557
  • 最近打卡:2025-06-15 09:02:29

24

主题

524

回帖

1220

积分

荣誉版主

积分
1220
发表于 2024-4-26 18:44:03 | 显示全部楼层
楼上的代码是把stc32指令集发挥到极致。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-01-01 20:46:17

2

主题

29

回帖

214

积分

中级会员

积分
214
发表于 2024-4-26 22:21:06 | 显示全部楼层
社区*** 发表于 2024-4-26 18:44
楼上的代码是把stc32指令集发挥到极致。

他是大神,我们用用C就行了
回复 支持 反对

使用道具 举报 送花

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

54

主题

1327

回帖

5499

积分

荣誉版主

积分
5499
发表于 2024-4-27 06:28:10 | 显示全部楼层
zxcv*** 发表于 2024-4-26 16:39
看我优化的:

64:         WRITE_CAN(TX_BUF0, TxBuffer[0]);  

优化的不错!

难得遇到一个汇编高手~~~
回复 支持 反对

使用道具 举报 送花

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

54

主题

1327

回帖

5499

积分

荣誉版主

积分
5499
发表于 2024-4-27 06:31:05 | 显示全部楼层
本帖最后由 LAOXU 于 2024-4-27 07:07 编辑

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

      MOV      DR8,TXBUFFER+4

251不支持 32位传输

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

更正:

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

使用道具 举报 送花

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

54

主题

1327

回帖

5499

积分

荣誉版主

积分
5499
发表于 2024-4-27 06:39:06 | 显示全部楼层
本帖最后由 LAOXU 于 2024-4-27 07:14 编辑

zxcv1973
的代码, 目前看是最优化的
回复 支持 反对

使用道具 举报 送花

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

54

主题

1327

回帖

5499

积分

荣誉版主

积分
5499
发表于 2024-4-27 07:48:00 | 显示全部楼层
想了一下, 还能再优化 2条指令, 进一步提速

        int  edata  TXCANADDR[] = {0x007E,0xFEBB,0x0809,0x0A0B};

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


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:99
  • 最近打卡:2025-06-16 09:28:47

733

主题

1万

回帖

1万

积分

管理员

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

硬干了

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-01-01 20:46:17

2

主题

29

回帖

214

积分

中级会员

积分
214
发表于 2024-5-4 15:07:58 | 显示全部楼层
神*** 发表于 2024-5-2 15:40
STC32G96K256, 已在对 2组独立的 CAN-FD 增加 DMA 的支持:
===开发周期又要加长了

其实也不用DMA,直接多加个发送fifo就行
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-16 20:21 , Processed in 0.152773 second(s), 108 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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