C6678 srio和edma同时访问ddr冲突问题解决思路

        在C6678中,各部件访问ddr都是通过同一个emif64总线,多部件同时访问呢时会有冲突的发生,最典型的一个情况是:DSP收来自其他设备srio发来的数据,同时使用edma读写本地ddr,此时会导致srio降速,最严重的情况,edma访问ddr带宽占满时,srio会降速到只有几KB/s的速率,严重拖慢srio发端的发送速率。

        这个问题困扰了我许久,由于现在6678用得不甚广泛,网上能查到的信息都语焉不详,前段时间下决心解决这个问题,通过网上搜索和查阅数据手册结合,终于找到了解决方法。

        使用6678的TeraNet数据网络时,片上所有的主控外设都标明了访问TeraNet总线的优先级,编程者可通过软件设定优先级,PRI数字越小表明优先级越高,0为最高。CorePacs通过UMC寄存器设定优先级,基于包DMA的外设内部也各自有设定优先级的寄存器。理论上来说,我们将SRIO的优先级设置得比所有EDMA-TC的优先级高,就可以避免SRIO被拖慢的问题。

        Srio文档中找到一个名为CBA_TRANS_PRI 的寄存器位域,这3个bit位域外设设定控制寄存器PER_SET_CNTL上,地址偏移为0x0014(srio配置寄存器的基地址为0x02620384),该字段主要用于设置内部总线SRIO的优先级(CSDN:TMS320C645x DSP SRIO寄存器(一))

        EDMA有好几级可以设置优先级,如下图,我们关注的是system优先级(即访问内部总线的优先级)。每个TC都有一个可编程的system优先级寄存器,叫做QUEPRI寄存器。

 

        下面为修改srio和edma访问数据网络总线优先级的代码,将srio优先级修改为最高0,edma优先级修改为4。

           // 修改srio优先级

           CSL_SrioHandle srioHandle = CSL_SRIO_Open(0);     //获取srio句柄

           CSL_SRIO_SetTransactionPriority(srioHandle, 0);       //更改优先级为0

    CSL_Edma3Handle         hModule;

    CSL_Edma3Obj            edmaObj;

    CSL_Edma3Context        context;

    CSL_Status              sta;

    // 修改edma优先级,遍历3CC

    int i,j;

    for (i=0; i<3; i++)

    {

        // Module Level Open

      hModule = CSL_edma3Open(&edmaObj, i, NULL, &sta);

      for (j=0; j<4; j++)

      {

                 // Maps Event Queue 2 to Priority 4

            CSL_edma3SetEventQueuePriority(hModule, j, 4);      //更改优先级为4

      }

    }

    // TODO:再读一遍寄存器,确认修改成功

         经实测,修改优先级后,srio和edma同时访问ddr时,srio速率几乎不降,成功解决。

 

参考资源链接:[DSP6678 Cache一致性详解与实践](https://wenku.csdn.net/doc/6412b756be7fbd1778d49eec?utm_source=wenku_answer2doc_content) 在DSP6678平台上,维护Cache一致性是实现高效数据处理的关键。当系统中存在多个Master组件(如CPU核、EDMAsRIO等)以及Slave组件(如内存、共享内存DDR)时,必须确保这些组件访问内存时数据的一致性。 首先,了解DSP6678的Cache结构是必要的。L1D Cache用于存储数据,它配置为32KB大小,并具有2路映射策略。当你需要调整L1D Cache的大小时,必须考虑到系统中的数据一致性问题。L1D Cache的大小调整可以通过特定的配置寄存器来实现,但任何大小变化都应当在系统初始化或休眠态时进行,以避免在运行过程中产生数据不一致。 为了确保数据一致性,DSP6678平台采用了MESI协议。当一个Master组件更新了L1D Cache中的数据后,该数据会被标记为Modified状态,而其他拥有相同数据副本的Cache Line将被标记为Invalid状态。这样,任何其他Master组件访问该数据时会从L1D Cache中获取到最新的数据,或者直接从内存中读取。 在实际编程中,开发者可以使用DSP6678提供的库函数或直接操作Cache控制寄存器来调整L1D Cache的大小。例如,可以使用 Cache_writeback_inv函数来清空并无效化特定的Cache Line,防止数据不一致。同时开发者还需要确保在调整L1D Cache大小后,对所有使用到的变量进行重新分配或使用相应的同步机制(如信号量或互斥锁)来防止数据冲突。 综上所述,通过理解MESI协议的工作原理合理编程,可以确保在DSP6678平台上调整L1D Cache大小后,依然保持系统的数据一致性。 为了深入理解掌握这些高级话题,我强烈推荐您阅读《DSP6678 Cache一致性详解与实践》。这份资料详细讲解了DSP6678的Cache一致性机制,并通过实例展示了在实际应用中如何处理Cache大小调整以及如何维护数据一致性。通过这份资料,您将能够全面理解DSP6678的Cache架构,并在实际开发中应用这些知识,提升数字信号处理系统的性能稳定性。 参考资源链接:[DSP6678 Cache一致性详解与实践](https://wenku.csdn.net/doc/6412b756be7fbd1778d49eec?utm_source=wenku_answer2doc_content)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值