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); }