工具/软件: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()正是我所期望的。
不确定如何解决此问题。