找回密码
 立即注册
查看: 227|回复: 19

疑为DMA总线并行访问题反馈 | 已给 DMA应用注意事项

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:36
  • 最近打卡:2026-04-17 10:38:38

36

主题

1158

回帖

2885

积分

荣誉版主

积分
2885
发表于 2026-3-5 16:54:22 | 显示全部楼层 |阅读模式
型号: AI8051U-34K64  LQFP48,
问题描述,发现一个代码段xdata区的静态全局变量被未知指针改写或自身访问不正常,数据错乱。可排除代码自己的写错,因为代码是成熟代码移值的.
经过几天的排查,销定在DMA身上,DMA局部代码如下:

void ledp_run()
{
    ledp_yhdata_dt(Hub_Bufferdc);            //现在改成端口模拟时序一切正常
   
//    Buffer = (u16)Hub_Bufferdc;                      //使用DMA发数据就有问题
//    DMA_LCM_TXAH = (u8)(Buffer>>8);
//    DMA_LCM_TXAL = (u8)(Buffer);
//    DMA_LCM_TRIG_WD();
   
        HUB_STB=1;
        NOP(16);
        HUB_STB=0;
}

/*---------------------------------------------------------
DMA 配置
----------------------------------------------------------*/
void DMA_LCM_config()
{
        DMA_LCM_InitTypeDef                DMA_LCM_InitStructure;                        //结构定义

        DMA_LCM_InitStructure.DMA_Enable = ENABLE;                                //DMA使能          ENABLE,DISABLE
        DMA_LCM_InitStructure.DMA_Length = 128-1;              //DMA传输总字节数          (0~65535) + 1, 不要超过芯片 xdata 空间上限
//        DMA_LCM_InitStructure.DMA_Length = xfnu*128-1;              //DMA传输总字节数          (0~65535) + 1, 不要超过芯片 xdata 空间上限
//        DMA_LCM_InitStructure.DMA_Tx_Buffer = (u16)Hub_Bufferdc;      //发送数据存储地址
//        DMA_LCM_InitStructure.DMA_Rx_Buffer = (u16)Hub_Bufferdc;      //接收数据存储地址
        DMA_LCM_Inilize(&DMA_LCM_InitStructure);                            //初始化
   
    DMA_LCM_CFG = 0x02;     //  DAM访问优先级
}

问题奇怪就奇怪到,不是DMA自身发送数据有问题。DMA可以正确发送数据。
但是另一个模块中的数据总是不正常,DMA是在中断里触发的。
怀疑是DMA占住了XDATA的总线访问权,使另外的代码访问XDATA时出现读写错误,但手册上说是可以并行访问的。
2. 改用端口模拟时序一切正常。
3. DMA应该注意的都注意了,比如4字节对齐,不进入空IDL模式。


暂时改用端口模拟已解决问题,只是反馈一下给官方是否需要留意,不需要大家帮忙解决问题。

回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:393
  • 最近打卡:2026-04-30 08:56:47

849

主题

1万

回帖

2万

积分

管理员

积分
23131
发表于 2026-4-15 08:16:41 | 显示全部楼层
截图202604150815243586.jpg


截图202604150815551343.jpg

截图202604150816172835.jpg

截图202604150816386686.jpg

点评

姚总,找出这么大一个BUG, 比那个比赛得奖贡献大多了,是不是给点辛苦费,哈  详情 回复 发表于 2026-4-17 10:38
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:269
  • 最近打卡:2026-04-30 08:20:54
已绑定手机

22

主题

641

回帖

2384

积分

金牌会员

积分
2384
发表于 2026-3-5 17:11:58 | 显示全部楼层
关掉DMA试一下
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:521
  • 最近打卡:2026-04-30 08:53:57
已绑定手机

106

主题

4345

回帖

9748

积分

荣誉版主

无情的代码机器

积分
9748
发表于 2026-3-5 17:20:54 | 显示全部楼层
楼主有空可否搞个问题复现工程上传下,目前已知的只有qspi的p2p会修改xram


截图202603051719328980.jpg

点评

测试新进展: 1. 因为从不使用DMA_LCM接收数据,原代码未初始化接收地址,现添加DMA接收地址为一块空闲的地址,发现没有作用,代码如下: DMA_LCM_InitStructure.DMA_Rx_Buffer = (u16)(Hub_Buffer1+512); //  详情 回复 发表于 2026-3-6 08:57
可以复现,但对于你们来说应该是比较难排查问题的,  详情 回复 发表于 2026-3-6 08:36
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:36
  • 最近打卡:2026-04-17 10:38:38

36

主题

1158

回帖

2885

积分

荣誉版主

积分
2885
发表于 2026-3-6 08:36:33 | 显示全部楼层
erci*** 发表于 2026-3-5 17:20
楼主有空可否搞个问题复现工程上传下,目前已知的只有qspi的p2p会修改xram

可以复现,但对于你们来说应该是比较难排查问题的,
1,代码比较大,用于驱动一个自制的点阵屏,非标准屏,所以你们难以看到运行结果。
2.  改变代码总大小可能问题会消失,改变xdata的总用量也是如此。所以定向问题困难。


我还在测试中,现在有些方向了,估计时总线权的问题,因为我中断频率非常高,代码和DMA会同时访问xdata总线
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:36
  • 最近打卡:2026-04-17 10:38:38

36

主题

1158

回帖

2885

积分

荣誉版主

积分
2885
发表于 2026-3-6 08:57:02 | 显示全部楼层
erci*** 发表于 2026-3-5 17:20
楼主有空可否搞个问题复现工程上传下,目前已知的只有qspi的p2p会修改xram

测试新进展:
1. 因为从不使用DMA_LCM接收数据,原代码未初始化接收地址,现添加DMA接收地址为一块空闲的地址,发现没有作用,代码如下:
        DMA_LCM_InitStructure.DMA_Rx_Buffer = (u16)(Hub_Buffer1+512);      //接收数据存储地址,这是准备了一块空闲的数据池,虽然用不到。但添加了也不起作用


2. 添加等待DMA完成后再继续执行代码,有用。代码如下:
void ledp_run()
{     
    static u16 data Buffer;   
    HUB_STB=1;   
    NOP(16);   
    HUB_STB=0;
      
    DMA_LCM_STA=0;

    Buffer = (u16)Hub_Bufferdc;   
    DMA_LCM_TXAH = (u8)(Buffer>>8);
    DMA_LCM_TXAL = (u8)(Buffer);      
    DMA_LCM_TRIG_WD();   

    while(!(DMA_LCM_STA&0x01));    添加此句后,就正常了,等待DMA完成后再执行后续代码。呃,后来发现也不完全正常,改善了一些,出错的概率变小了
    DMA_LCM_STA=0;
}

3. 改变DMA总线访问优先级,没有作用


总结,个人认为是总线访问权的问题,因为DMA运行频繁,并且是在中断里触发的,退出中断后DMA还在运行,
如果退出中断后用户代码访问xdata,就造成代码和DMA同时访问xdata总线,可能仲裁失效或DMA改写了其他xdata区域的数据或其它原因,导至代码读写xdata异常。
注意,是CPU和DMA同时访问xdata总线,不是同时访问同一块地址



点评

有空帮确认下出问题的工程里是不是用到了结构体指针语法。 或者生成的汇编代码里有这种指令组合 MOV WRx,@DRxx+0xxxxx CMP WRx,#xxxx  详情 回复 发表于 2026-4-10 23:03
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2026-04-17 19:30:41
已绑定手机

4

主题

9

回帖

40

积分

新手上路

积分
40
发表于 2026-4-9 22:59:41 | 显示全部楼层
关注,我最近使用8H8K64U的SPI+DMA刷屏也发现数据错误问题,非常难定位,关闭DMA就完全正常,一开DMA就花屏。

点评

STC8H系列的 DMA 比较简单,无问题  详情 回复 发表于 2026-4-15 08:18
有空帮确认下出问题的工程里是不是用到了结构体指针语法。 或者生成的汇编代码里有这种指令组合 MOV WRx,@DRxx+0xxxxx CMP WRx,#xxxx  详情 回复 发表于 2026-4-10 23:03
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:521
  • 最近打卡:2026-04-30 08:53:57
已绑定手机

106

主题

4345

回帖

9748

积分

荣誉版主

无情的代码机器

积分
9748
发表于 2026-4-10 23:03:30 | 显示全部楼层
tzz1*** 发表于 2026-3-6 08:57
测试新进展:
1. 因为从不使用DMA_LCM接收数据,原代码未初始化接收地址,现添加DMA接收地址为一块空闲的 ...

有空帮确认下出问题的工程里是不是用到了结构体指针语法。

或者生成的汇编代码里有这种指令组合

MOV WRx,@DRxx+0xxxxx
CMP WRx,#xxxx

三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:521
  • 最近打卡:2026-04-30 08:53:57
已绑定手机

106

主题

4345

回帖

9748

积分

荣誉版主

无情的代码机器

积分
9748
发表于 2026-4-10 23:03:47 | 显示全部楼层
im*** 发表于 2026-4-9 22:59
关注,我最近使用8H8K64U的SPI+DMA刷屏也发现数据错误问题,非常难定位,关闭DMA就完全正常,一开DMA就花屏 ...

有空帮确认下出问题的工程里是不是用到了结构体指针语法。

或者生成的汇编代码里有这种指令组合

MOV WRx,@DRxx+0xxxxx
CMP WRx,#xxxx


三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:820
  • 最近打卡:2026-04-30 09:46:05

1

主题

58

回帖

150

积分

注册会员

积分
150
发表于 2026-4-14 18:38:27 | 显示全部楼层
tzz1*** 发表于 2026-3-6 08:36
可以复现,但对于你们来说应该是比较难排查问题的,
1,代码比较大,用于驱动一个自制的点阵屏,非标准屏 ...

设置 CLKCON=1试试,STC手册增加了DMA使用注意事项
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-5-1 10:32 , Processed in 0.140698 second(s), 112 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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