zynq ucos下运行PLDMA死机问题排查

2015-11-16 12:01 阅读 809 次 评论 4 条

在ucos系统下进行PLDMA数据传输。正常未运行PLDMA时的UartHandle的值。

uarthandle中变量与寄存器的值

运行完成PLDMA后,读取UartHandle中寄存器的值时,返回Exception: Cannot read target memory. AP transaction timeout

Cannot read target memory. AP transaction timeout

后来再次尝试,进行单步调试,发现在进行配置PLDMA控制寄存器后,则出现上面的UartHandle的内容错误问题。

PLDMA控制寄存的操作代码如下,采用的是PL与PS的连接GP接口,采用AXILite总线结构,PS端的地址空间0x40240000开始,查过软件与其他地址空间没有冲突。

PLDMA配置运行的代码

其实在开启dma传输使能之前,程序已经跑飞。

毕竟使用了PLDMA,所以怀疑与Dcache有关,将上面的代码中增加关DCache,在配置完传输后再开启DCache,这么做确实不会使UartHandle变量中的数据出错,并且PLDMA配置成功,数据传输完毕后产生中断,数据比对后,证明数据正确。

但总感觉与DCache无关,因为DCache只是在CPU与DDR之间传递数据,而PLDMA是在DDR与BRAM(PL中)传递数据,DCache的问题只是引起BRAM中的数据与CPU可见的数据不一致,而不应该出错,数据异常而导致死机。

而且在增加DCache操作后,在后续的程序运行中,在cpu任务比较繁重的,由于频繁操作PLDMA,频繁的关闭、开启DCache,也会出现DCache的异常,还是会出现死机。

调试过程通过单步运行配置PLDMA,这时不会出现内存数据异常,且PLDMA数据传输正常。基本确定是由于PS写PLDMA速度太快,而PL端反应较慢,造成axilite总线异常。

通过在配置PLDMA控制寄存器时,增加for空循环延时,然后运行PLDMA,功能正常。所以可以肯定这里的PLDMA问题与DCahce没有半毛钱关系。

2016年8月12日更新

反过来为什么在关闭DCache后PLDMA功能能够正常呢?

真实原因不知道,但是解决的正确办法是通过APB总线接口访问PLDMA的控制寄存器。参考ucos访问自定义axi peripheral接口死机问题

版权声明:本文著作权归原作者所有,欢迎分享本文,谢谢支持!
转载请注明:zynq ucos下运行PLDMA死机问题排查 | 起点博客
分类:应用笔记 标签:, , , , ,

发表评论


表情

  1. cuter
    cuter 【农民】

    axilite的协议没理解透,其它接口我也用过没问题。
    dcache这点应该没问题

  2. will
    will【站长】

    是呀,还要好好学习下

  3. 美股行情
    美股行情 【农民】

    这东西我收了!谢谢!

  4. will
    will【站长】

    好好用