尊敬的 TI 专家:
C66或 C71启动在我们的定制板上挂起(Processor SDK RTOS 版本为08_00_00_12、QNX 版本为7.1)、UART 输出如下所示:
----------------------------------------
U-Boot 2020.01脏污(2021年8月12日- 16:50:19 +0800)
SoC:J721E SR1.0
型号:德州仪器 K3 J721E SoC
电路板:J721EX-PM2-SOM 修订版 E7
DRAM:4 GiB
闪存:0字节
MMC:sdhci@4f80000:0、sdhci@4fb0000:1
正在从 MMC 加载环境... 好的
IN:串行@2800000
输出:串行@2800000
ERR:串行@2800000
NET:无法获取以太网的 PHY@46000000:Addr 0
PHY_CONNECT()失败
未找到以太网。
按任意键停止自动引导:0
切换到分区#0,确定
mmc1是当前器件
在器件1上找到 SD/MMC
在3ms (170.9 KiB/s)内读取526字节
从 uEnv.txt 加载了 env
正在从 mmc1导入环境...
正在运行 envcmd ...
内核1已在使用中。 rproc 命令不起作用
内核2已在使用中。 rproc 命令不起作用
2370716字节在101ms (22.4 MIB/s)内读取
使用数据加载远程处理器2@addr=0x82000000 2370716字节:成功!
在24ms 内读取506744字节(20.1 MIB/s)
使用数据加载远程处理器3@addr=0x82000000 506744字节:成功!
在65ms (23.2 MIB/s)内读取1579088字节
使用数据加载远程处理器6@addr=0x82000000 1579088字节:成功! (C66固件)
在65ms (23.2 MIB/s)内读取1579088字节
使用数据加载远程处理器7@addr=0x82000000 1579088字节:成功! (C66固件)
在184ms (53.9 MiB/s)内读取的10399672字节
使用数据加载远程处理器8@addr=0x82000000 10399672字节:成功! (C71固件)
***** 然后它就在这里! *****
----------------------------------------
我最终发现、它可能会在 文件 vision_apps/utils/console_io/src/app_log_writer.c 中的函数 appLogCpuSyncWithMaster 和函数 appLogCpuSyncWithSlave 挂起、因此我向它们的"无限"循环中添加了一些睡眠(调用下面的睡眠版本)、如下所示:
void appLogWaitTicks (uint32_t TIME_IN_TICKs)
{
TaskP_SLEEP (time_in_ticks);
}
void appLogCpuSyncWithMaster (uint32_t self_cpu_id)
{
/* TODO:无限等待同步会导致 QNX 实现问题*/
易失性 uint32_t 状态;
appLogSetCpuSyncState (self_cpu_id、app_log_cpu_sync_State_init_done);
执行{
//printf ("jqsun---5\n");
appLogGetCpuSyncState (self_cpu_id、&state);
//printf ("jqsun--5.0\n");
//appLogWaitMbs (1);
appLogWaitTicks(1); /$$$$$$$$$$$$$$$$$$$$$ (此处为 C66挂起)
//printf ("jqsun--5.1:s=%d ss=%x\n"、self_cpu_id、state);
} while (state!= app_log_cpu_sync_state_test_init_done);
appLogSetCpuSyncState (self_cpu_id、app_log_cpu_sync_State_confirm_init_done);
执行{
//printf ("jqsun---7\n");
appLogGetCpuSyncState (self_cpu_id、&state);
//appLogWaitMbs (1);
appLogWaitTicks(1);
//printf ("jqsun--7.1:s=%d ss=%x\n"、self_cpu_id、state);
} while (state!= app_log_cpu_sync_State_run);
}
void appLogCpuSyncWithSlave (uint32_t SLAVE_CPU_id)
{
/* TODO:无限等待同步会导致 QNX 实现问题*/
易失性 uint32_t 状态;
appLogSetCpuSyncState (slave_cpu_id、app_log_cpu_sync_State_test_init_done);
执行{
appLogGetCpuSyncState (slave_cpu_id、&state);
//printf ("jqsun--8:s=%d、ss=%x\n"、slave_cpu_id、state);
if (state == app_log_cpu_sync_state_init_done)
{
appLogSetCpuSyncState (slave_cpu_id、app_log_cpu_sync_State_test_init_done);
}
//appLogWaitMbs (1);
appLogWaitTicks(1);
} while (state!=app_log_cpu_sync_state_confirm_init_done);
}
void appLogCpuSyncInit (uint32_t master_cpu_id、uint32_t self_cpu_id、
uint32_t SYNC_CPU_id_list[]、uint32_t num_CPUs)
{
printf ("jqsun--0:m=%d、s=%d、num=%d\n"、master_cpu_id、self_cpu_id、num_cpu_id);
if (self_cpu_id=master_cpu_id)
{
uint32_t i、slave_cpu_id;
/*主 CPU,与每个从 CPU 同步*/
for (i=0;<num_cpus; i++)
{
Slave_cpu_id = SYNC_cpu_id_list[i];
if (slave_cpu_id!= self_cpu_id)
{
printf ("jqsun-1、slave=%d\n"、slave_cpu_id);
appLogCpuSyncWithSlave (slave_cpu_id);
printf ("jqsun--1.1\n");
}
}
/*所有从属方都已完成初始化,现在启动所有从属方的*/
for (i=0;<num_cpus; i++)
{
Slave_cpu_id = SYNC_cpu_id_list[i];
if (slave_cpu_id!= self_cpu_id)
{
printf ("jqsun--2、slave=%d\n"、slave_cpu_id);
appLogCpuSyncStartSlave (slave_cpu_id);
printf ("jqsun--2.1\n");
}
}
}
其他
{
/*从 CPU、与主 CPU 同步*/
printf ("jqsun--3\n");
appLogCpuSyncWithMaster (self_cpu_id);
printf ("jqsun--3.1\n");
}
}
然后 QNX 成功引导、我们得到 QNX 提示符。 但令人遗憾的是、C66在函数 appLogWaitTicks 挂起。 以下是远程内核打印的日志:
J7EVM@QNX:/# cd /ti_fs/vision_apps/
J7EVM@QNX:/ti_fs/vision_apps#
J7EVM@QNX:/ti_fs/vision_apps#
J7EVM@QNX:/ti_fs/vision_apps#./vision_apps_init.sh
J7EVM@QNX:/ti_fs/vision_apps#[MCU2_0] 102.129749 s:CIO:初始化... 完成了!!!
[MCU2_0] 102.129791 s:### CPU 频率= 1000000000Hz
[MCU2_0] 102.129820 s:APP:init (RTOS)... !!!
[MCU2_0] 102.129838 s:SCICLIENT:INIT... !!!
[MCU2_0] 102.130034 s:SCICLIENT:DMSC FW 版本[21.1.1-v2021.01a (了不起的 LA]
[MCU2_0] 102.130072:SCICLIENT:DMSC FW 版本0x15
[MCU2_0] 102.130097 s:SCICLIENT:DMSC FW ABI 修订版3.1
[MCU2_0] 102.130122 s:SCICLIENT:初始化... 完成了!!!
[MCU2_0] 102.130143 s:uDMA:初始化... !!!
[MCU2_0] 102.131089 s:uDMA:初始化... 完成了!!!
[MCU2_0] 102.131135 s:MEM:初始化... !!!
[MCU2_0] 102.131170 s:MEM:创建的堆(DDR_SHARD_MEM、id=0、flags=0x00000004)@大小为16777216字节的 e1000000!!!
[MCU2_0] 102.131228 s:MEM:创建的堆(L3_MEM、id=1、flags=0x00000000)@ 3600000、大小为262144字节!!!
[MCU2_0] 102.131276 s:MEM:创建的堆(DDR_NON_Cache_me、id=5、flags=0x00000000)@ d80000、大小为16777216字节!!!
[MCU2_0] 102.1319 s:MEM:初始化... 完成了!!!
[MCU2_0] 102.1337 s:IPC:init (ROTS)... !!!
[MCU2_0] 102.1386 s:IPC:6个 CPU 参与 IPC!!!
[MCU2_0] 102.136193 s:IPC:初始化... 完成了!!!
[MCU2_0] 102.136242:应用:与5个 CPU 同步... !!!
[MCU2_0] 102.136292 s:jqsun--0:M=3、s=3、num=5
[MCU2_0] 102.136323 s:jqsun-1、slave=4
[MCU2_0] 102.1469 s:jqsun--1.1
[MCU2_0] 102.1498 s:jqsun-1、slave=7 =================== >正在等待从站7(C66)
[MCU2_1] 102.116989 s:CIO:初始化... 完成了!!!
[MCU2_1] 102.117033 s:### CPU 频率= 1000000000Hz
[MCU2_1] 102.117059 s:APP:init (RTOS)... !!!
[MCU2_1] 102.117079 s:SCICLIENT:INIT... !!!
[MCU2_1] 102.117272 s:SCICLIENT:DMSC FW 版本[21.1.1-v2021.01a (了不起的 LA]
[MCU2_1] 102.117309 s:SCICLIENT:DMSC FW 版本0x15
[MCU2_1] 102.117332 s:SCICLIENT:DMSC FW ABI 修订版3.1
[MCU2_1] 102.117357 s:SCICLIENT:初始化... 完成了!!!
[MCU2_1] 102.117378 s:uDMA:初始化... !!!
[MCU2_1] 102.118464 s:uDMA:初始化... 完成了!!!
[MCU2_1] 102.118512 s:MEM:初始化... !!!
[MCU2_1] 102.118546 s:MEM:创建的堆(DDR_shared_MEM、id=0、flags=0x00000004)@大小为16777216字节的 e2000000!!!
[MCU2_1] 102.118608 s:MEM:创建的堆(L3_MEM、id=1、flags=0x00000001)@ 3640000、大小为262144字节!!!
[MCU2_1] 102.118653 s:MEM:创建的堆(DDR_NON_Cache_me、id=5、flags=0x00000000)@ d9000000、大小为117440512字节!!!
[MCU2_1] 102.118697 s:MEM:初始化... 完成了!!!
[MCU2_1] 102.118715 s:IPC:init (ROTS)... !!!
[MCU2_1] 102.118759:IPC:6个 CPU 参与 IPC!!!
[MCU2_1] 102.123642 s:IPC:初始化... 完成了!!!
[MCU2_1] 102.123692 s:应用程序:与5个 CPU 同步... !!!
[MCU2_1] 102.123742 s:jqsun--0:M=3、s=4、num=5
[MCU2_1] 102.123769 s:jqsun-3
[C6X_1] 102.190487 s:CIO:初始化... 完成了!!!
[C6X_1] 102.190504 s:### CPU 频率= 1350000000 Hz
[C6X_1] 102.190518 s:应用程序:init (RTOS)... !!!
[C6X_1] 102.190530 s:SCICLIENT:INIT... !!!
[C6X_1] 102.190704 s:SCICLIENT:DMSC FW 版本[21.1.1-v2021.01a (极好的 LLA]
[C6X_1] 102.190719 s:SCICLIENT:DMSC FW 版本0x15
[C6X_1] 102.190732 s:SCICLIENT:DMSC FW ABI 修订版3.1
[C6X_1] 102.190745 s:SCICLIENT:INIT... 完成了!!!
[C6X_1] 102.190757 s:uDMA:初始化... !!!
[C6X_1] 102.191919 s:UDMA:初始化... 完成了!!!
[C6X_1] 102.191941 s:MEM:初始化... !!!
[C6X_1] 102.191956 s:MEM:创建的堆(DDR_SHARD_MEM、id=0、flags=0x00000004)@ e4000000、大小为16777216字节!!!
[C6X_1] 102.191976 s:MEM:创建的堆(L2_MEM、id=2、flags=0x00000001)@ 800000、大小为229376字节!!!
[C6X_1] 102.191994 s:MEM:创建的堆(DDR_Scrate_MEM、id=4、flags=0x00000001)@大小为50331648字节的 e5000000!!!
[C6X_1] 102.192013 s:MEM:初始化... 完成了!!!
[C6X_1] 102.192025 s:IPC:init (ROTS)... !!!
[C6X_1] 102.192048 s:IPC:6个 CPU 参与 IPC!!!
[C6X_1] 102.195263 s:IPC:初始化... 完成了!!!
[C6X_1] 102.195291 s:应用程序:与5个 CPU 同步... !!!
[C6X_1] 102.195322 s:jqsun--0:M=3、s=7、num=5
[C6X_1] 102.195338 s:jqsun-3 =================================== > C66在这里挂起
[C6X_2] 102.274465 s:CIO:初始化... 完成了!!!
[C6X_2] 102.274488 s:### CPU 频率= 1350000000 Hz
[C6X_2] 102.274502 s:应用程序:init (RTOS)…… !!!
[C6X_2] 102.274515 s:SCICLIENT:INIT... !!!
[C6X_2] 102.274700 s:SCICLIENT:DMSC FW 版本[21.1.1-v2021.01a (了不起的 LLA]
[C6X_2] 102.274716 s:SCICLIENT:DMSC FW 版本0x15
[C6X_2] 102.274730 s:SCICLIENT:DMSC FW ABI 修订版3.1
[C6X_2] 102.274744 s:SCICLIENT:INIT... 完成了!!!
[C6X_2] 102.274759 s:uDMA:初始化... !!!
[C6X_2] 102.275920 s:uDMA:初始化... 完成了!!!
[C6X_2] 102.275943 s:MEM:初始化... !!!
[C6X_2] 102.275958 s:MEM:创建的堆(DDR_SHARD_MEM、id=0、flags=0x00000004)@ e80000、大小为16777216字节!!!
[C6X_2] 102.275978 s:MEM:创建的堆(L2_MEM、id=2、flags=0x00000001)@ 800000、大小为229376字节!!!
[C6X_2] 102.275996 s:MEM:创建的堆(DDR_Scrate_MEM、id=4、flags=0x00000001)@ e9000000、大小为50331648字节!!!
[C6X_2] 102.276015 s:MEM:初始化... 完成了!!!
[C6X_2] 102.276026 s:IPC:init (ROTS)... !!!
[C6X_2] 102.276048 s:IPC:6个 CPU 参与 IPC!!!
[C6X_2] 102.279289 s:IPC:初始化... 完成了!!!
[C6X_2] 102.279317 s:应用程序:与5个 CPU 同步... !!!
[C6X_2] 102.279347 s:jqsun--0:M=3、s=8、num=5
[C6X_2] 102.279362 s:jqsun-3
[C7x_1 ] 102.484258s:CIO:初始化... 完成了!!!
[C7x_1 ] 102.484272s:### CPU 频率= 1000000000Hz
[C7x_1 ] 102.484282 s:应用程序:init (RTOS)... !!!
[C7x_1 ] 102.484291 s:SCICLIENT:初始化... !!!
[C7x_1 ] 102.484454 s:SCICLIENT:DMSC FW 版本[21.1-v2021.01a (极好的 LLA]
[C7x_1 ] 102.484468 s:SCICLIENT:DMSC FW 版本0x15
[C7x_1 ] 102.484479 s:SCICLIENT:DMSC FW ABI 修订版3.1
[C7x_1 ] 102.484489 s:SCICLIENT:初始化... 完成了!!!
[C7x_1 ] 102.484498 s:uDMA:初始化... !!!
[C7x_1 ] 102.485337 s:uDMA:初始化... 完成了!!!
[C7x_1 ] 102.485349 s:MEM:初始化... !!!
[C7x_1 ] 102.485360 s:MEM:创建的堆(DDR_shared_MEM、id=0、flags=0x00000004)@ 100000000、大小为268435456字节!!!
[C7x_1 ] 102.485381 s:MEM:创建的堆(L3_MEM、id=1、flags=0x00000001)@ 70020000、大小为8159232字节!!!
[C7x_1 ] 102.485399 s:MEM:创建的堆(L2_MEM、id=2、flags=0x00000001)@ 64800000、大小为491520字节!!!
[C7x_1 ] 102.485416 s:MEM:创建的堆(L1_MEM、id=3、flags=0x00000001)@ 64e00000、大小为16384字节!!!
[C7x_1 ] 102.485433 s:MEM:创建的堆(DDR_Scrate_MEM、id=4、flags=0x00000001)@大小为268435456字节的 ec000000!!!
[C7x_1 ] 102.485451 s:MEM:初始化... 完成了!!!
[C7x_1 ] 102.485459 s:IPC:init (ROTS)... !!!
[C7x_1 ] 102.485473 s:IPC:6个 CPU 参与 IPC!!!
[C7x_1 ] 102.487281 s:IPC:初始化... 完成了!!!
[C7x_1 ] 102.487294 s:应用程序:与5个 CPU 同步... !!!
[C7x_1 ] 102.487316 s:jqsun--0:M=3、s=9、num=5
[C7x_1 ] 102.487329 s:jqsun-3
我 之前已经尝试过 Linux+RTOS ("Processor SDK Linux"版本07_03_00_05、Processor SDK RTOS 版本07_03_00_07)、并且远程内核在我们的定制板上运行良好(我们没有太多时间将 Linux+RTOS-08_00_12移植到我们的定制板上)。
我还尝试了 TDA4evm 上的"睡眠版本"固件、C66也挂起。
问题是:
(1)远程内核固件在 Linux+RTOS 和 QNX+RTOS 模式之间有何区别?
(2)为什么远程内核在我们的定制板上的 Linux+RTOS 模式下工作正常、而在 QNX+RTOS 模式下工作不顺利? 导致此问题的原因是什么? 是否有客户甚至遇到过此问题?
(3)为什么"睡眠版本"会导致 C66在 TDA4evm 上挂起? 是否存在任何计时问题?
(4)是否是硬件错误? 需要在我们的电路板上检查哪些内容?
请为我们提供一些解决此问题的指南。
谢谢
建强