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.

[参考译文] CCS/EVMK2GX:调试 Linux-BIOS IPC 示例的 DSP 端

Guru**** 2022830 points
Other Parts Discussed in Thread: EVMK2GX, SYSBIOS
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/696988/ccs-evmk2gx-debugging-dsp-side-of-linux-bios-ipc-example

器件型号:EVMK2GX
Thread 中讨论的其他器件: SYSBIOS

工具/软件:Code Composer Studio

EVMK2GX
BIOS_6_52_00_12
ccsv8.
IPC_3_47_01_00
multiprocmgr_3_0_4_0
pdk_k2g_1_0_9
PROCESSOR_SDK_RTOS_k2g_4_03_00_05
TI-CGT-C6000_8.2.2
xdctools_3_50_03_33_core
TI-processor-sdk-linux-k2g-evm-04.03.00.05

我想使用 CCS 调试 DSP 上的 TI-RTOS 程序、该 DSP 将 IPC 与 ARM 上的 Linux 程序结合使用。  为了简化操作、我从 IPC ex02_MessageQ 示例开始、当我 mpmcl 加载 DSP 并从 Linux 命令行运行主机时、该示例运行良好。  当我通过 CCS Debug 加载程序时、它会失败。  必须有 mpmcl 加载/运行正在执行的操作、我需要在代码或 GEL 文件中复制、但我不知道是什么。   有此工作的人能否提供文件?

启动调试会话并继续执行 main 后、会出现内部断言故障
virtqueue_instance_init:
           assert_isTrue (!(marValue & 0x1)、NULL);
后跟由于 virtqueue 没有可用缓冲区而导致的失败。

CCS 调试控制台输出:
[T=0x000000a4:7ccf2f47] ti.ipc.family.tci6638.virtqueue:错误:第187行:断言失败
TI.ipc.family.tci6638.virtqueue:第187行:断言失败
xdc.runtime.Error.raise:终止执行
2个资源条目、位于0x800000处
[T=0x000000a4:7cd901a5] xdc.runtime.Main:-->主要:
在61上使用主机注册 rpmsg-proto:rpmsg-proto 服务
[T=0x000000a6:4e4818c3] xdc.runtime.Main: NameMap_sendMessage:host 53、port=61
[T=0x000000a6:4e4873e8] ti.sysbios.KNL.Semaphore:错误:第202行:断言失败:a_badContext:调用上下文错误。 必须从任务调用。
TI.SYSBIOS.KNL.Semaphore:第202行:断言失败:a_badContext:调用上下文错误。 必须从任务调用。
xdc.runtime.Error.raise:终止执行

堆栈:

  • sassert.c:36 0x00871410处的 xdc_runtime_assert_aret__i (unsigned short、char *、int、unsigned int)()    
  • TI_SYSBIOS_KNL_Semaphore_Pend__E (struct ti_SysBIOS_KNL_Semaphore_Object *、unsigned int)(位于 semaphore.c:208 0x0085F440    
  • RPMessage_send (unsigned short、unsigned int、unsigned int、void *、unsigned short)()、位于 RPMessage.c:569 0x0085FA24    
  • sendMessage$26 (char *、char *、unsigned int、enum rpmsg_ns_flags)() at NameMap.c:81 0x0086DC74    
  • NameMap_register (char *、char *、unsigned int)() at NameMap.c:95 0x008738B8    
  • TI_IPC_transports_TransportRpmsg_instance_init_E (struct ti_IPC_transports_TransportRpmsg_Object *、unsigned short、struct ti_IPC_transportRpmsg_Params *、struct XDC_RUNTIME_Error_Block *)() at TransportRpmsg.c:114 0x00869224    
  • TI_IPC_transports_TransportRpmsg_create (unsigned short、struct ti_IPC_transports_TransportRpmsg_Params *、struct XDC_RUNITY_Error_Block *)() at MessageQ_Single_pe66.c:32、025 0x00870660    
  • TI_IPC_transports_TransportRpmsgSetup_attach_E (无符号短整型、void *)()、位于 TransportRpmsgSetup.c:72 0x0086DE96    
  • IpcMgr_ipcStartup () at IpcMgr.c:96 0x0086A660    
  • TI_SYSBIOS_BIOS_startFunc___i ()、位于 MessageQ_single_pe66.c:4、450 0x00873EBC    
  • 在 BIOS.c:115 0x00877118上的 TI_SYSBIOS_BIOS_Start__E ()    


问题似乎在于,virtqueue 没有可用的缓冲区,因此 RPMessage 块是不允许在 BIOS_start 函数中使用的。
TI/IPC/rpmsg/RPMessage.c:
int RPMessage_send (...)

执行{
token = virtqueue_getAvailBuf (transport.virtqueue_toHost、
(void **)&msg,&length);
} while (token < 0 && semaphore_pend (transport.semHandle_toHost、
BIOS_wait_forever);


ti/ipc/family/tci6638/virtqueue.c:
int16 virtqueue_getAvailBuf (virtqueue_handle vq,void **buf,int *len)

/*没有什么可用的? *
if (VQ->LAST_AVAK_IDx == Vring ->AVA--> IDx){
头部=(-1);
}

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

    我已通知 IPC 专家。 他们将直接在此处发布反馈。

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

    您好、Elron、

    从 Linux 加载 DSP 映像时、Linux 内核 remoteProc 框架解析 DSP 资源表中定义的系统资源、分配 rpmsg vring 缓冲区和跟踪缓冲区、并配置 DSP MMU。 如果您使用 CCS JTAG 连接加载 DSP 映像、则会跳过此步骤。

    为了使用 CCS 调试 DSP 内核、您首先需要从 Linux 加载 DSP 映像、然后连接到 DSP 并仅加载符号(并且不要连接到 ARM)。

    您可能需要设置 while 循环、以便可以在代码中的某个位置之前附加。 例如、如果您将以下内容添加到代码中、

    {
    
    volatile int foo = 1;
    
    while (foo);
    
    } 

    然后、您可以连接到内核、加载符号、添加断点、将"foo"更改为0、并继续单步执行代码。

    以下应用手册详细介绍了此方法以及您可能感兴趣的一些其他调试技术。

    使用 IPC3.x 调试工具和技术