This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RTOS/TMS320C6678:EDMA3初始化崩溃

Guru**** 2551180 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/622475/rtos-tms320c6678-edma3-initialization-crashes

器件型号:TMS320C6678

工具/软件:TI-RTOS

我正在从事 C6678 DSP 多核嵌入式项目,并尝试使 DMA 库正常工作。   它使用 TI EDMA3库(EDMA3_LLD_02_12_01_22)。  我们的代码在初始化期间崩溃。   我们调用 EDMA3_DRV_create ()时没有任何问题,但当我们调用 EDMA3_DRV_open ()时,我们会崩溃。  我能够单步执行代码,它在 EDMA3_RM_LOADResources()例程中的 edma3resmgr.c 中崩溃,在第1138行调用时:

 

                          /**

                            *获取特定于实例的信标、以防止同时发生

                            *访问共享资源。

                            *

                          semResult = edma3OsSemTake (rmInstance->initParam.rmSemHandle、

                                                  EDMA3_OSSEM_NO_TIMEOUT);

 

rmSemHandle 由我们的代码创建、就像这样:

 

  /*

  ** 创建 DMA DRV 信标

  *

  ERROR_INIT (&EB);

 

  Semaphore_Params_init (semParams);

 

  semParams.mode = Semaphore_Mode_Counting;

 

  dma_drv_sema4 = Semaphore_create (1、&semParams、&EB);

 

这个信号量 被传递到结构中。  我验证了地址是否正确传递,因此我不知道为什么对 edma3OsSemTake 的调用会崩溃。  我有该例程的一些源代码,但调试器不允许我单步执行它,只允许反汇编。  它似乎在第二条汇编指令上崩溃。

 

在所有 TI 示例中,初始化通过调用 edma3init()来完成,该函数位于“示例库”中,名为 EDMA3_LLD_drv_sample.ae66。  但是、如果我尝试将这个库包含在我们的项目中、我会得到许多与 platform_lib (ti.platform.evm6678l.ae66)冲突的重复符号、而我必须将这些符号包含在其他内容中。

 

我已经看到了 ema3init()的源,它调用 edma3OsSemCreate()来创建信标。  我还看到了 edma3OsSemCreate()的源代码,它所做的就是调用 Semaphore_create()。  但这可能不是真正的原因吗?  我唯一的猜测是 edma3OsSemCreate 所做的只是调用 semaphore_create(),而 edma3OsSemTEake()正是我所期望的。

 

不确定如何解决此问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我已将其转发给软件团队。 他们的反馈应发布在此处。

    BR
    Tsvetolin Shulev
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我已经解决了这个问题:

     

    在 RTSC 配置中、我们包括了框架组件3.40.1.04

     

    在 app.cfg 文件中、我们有以下行:

     

    VAR EdmaMgr = xdc.useModule('ti.sdo.fc.edmamgr.EdmaMgr');

     

    事实证明、该库包含:

     

      Edma3OsProtectEntry()

      Edma3ProtectExit()

      Edma3OsSemGive()

      Edma3OsSemTake()

     

    但是、Edma3OsSemCreate (连同 上面的4个例程)位于:

     

    C:\ti\EDMA3_LLD_02_12_01_22\ packages/ti\sdo\EDMA3\drv\samples\lib\c678-EVM\66\debug\ EDMA3_LLD_drv_sample.ae66

     

    因此、如果我从 RTSC 中删除框架组件、从 app.cfg 中删除 EdmaMgr 行并添加 EDMA3_LLD_drv_sample.ae66库、则会生成并运行该库。

     

    我想剩下的唯一问题是,我们是否真的应该在名称中包含一个带有“样本”的库?

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我需要知道我应该将哪些库链接到我的 EDMA3项目中。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    您需要以下库:

    EDMA3_LLD_drv_sample.ae66
    EDMA3_LLD_drv.ae66
    EDMA3_LLD_rm.ae66

    此致、Eric