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.
工具/软件: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:终止执行
堆栈:
问题似乎在于,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); }
您好、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、并继续单步执行代码。
以下应用手册详细介绍了此方法以及您可能感兴趣的一些其他调试技术。