Other Parts Discussed in Thread: AM5718
部件号: CODECOMPOSER
主题: AM5718 中讨论的其他器件
大家好、TI 支持团队
我尝试使用 CCS 在基于 AM5718 的定制电路板的 C66x DSP 内核上运行一个简单的 SYS/BIOS 应用。
我的环境是:
- 器件:AM5718
- 电路板:定制 AM5718 电路板
- 调试探针:Texas Instruments XDS100v2 USB 调试探针
- CCS:12.5.0
- Processor SDK RTOS AM57xx:11.01.00.00
- PDK:pdk_am57xx_1_0_21
- SYS/BIOS:6.76.03.01
- 构建日志中使用的 XDCtools:3.62.01.16_core
- 项目类型:C66XX [C6000] SYS/BIOS minimal 项目
- RTSC 目标:ti.targets.elf.c66
- RTSC 平台:ti.platforms.evmDRA7XX
重要系统条件:
在此测试期间、ARM Cortex-A15 侧未运行 Linux。 我停止 ARM/Linux 端并使用 CCS/JTAG 初始化和调试 C66x DSP。 换句话说、我尝试在独立 CCS 调试环境中运行 C66x DSP 应用程序、而不是通过 Linux Remoteproc。
我当前的调试序列为:
- 启动 AM5718.ccxml
- 连接到 CortexA15_0
- 运行 GEL 函数 DSP1SSClkEnable_API
- 通过 Memory Browser 手动检查/修改 PRCM 寄存器
- 连接到 C66xx_DSP
- 将 Blink_led_Idle.out 加载到 C66xx_DSP
- 恢复 C66xx_DSP
我不运行 AM571x_multiple_EnableAllCores()、因为它在我的安装程序中的 IPU1SS 初始化过程中似乎挂起。
我为 C66x DSP 创建了一个超小的 SYS/BIOS 工程。 我删除了默认任务示例、并注册了一个空闲函数。
我的 app.cfg 的相关部分是:
var BIOS = xdc.useModule('ti.sysbios.BIOS');
var Hwi = xdc.useModule('ti.sysbios.hal.Hwi');
var Idle = xdc.useModule('ti.sysbios.knl.Idle');
var Clock = xdc.useModule('ti.sysbios.knl.Clock');
var Timer = xdc.useModule('ti.sysbios.timers.dmtimer.Timer');
BIOS.clockEnabled = true;
Clock.timerId = 5;
Clock.tickMode = Clock.TickMode_PERIODIC;
Idle.addFunc('&ledToggle');
main.c 非常简单:
#include <xdc/std.h>
#include <xdc/runtime/System.h>
#include <ti/sysbios/BIOS.h>
volatile UInt32 gIdleToggleCount = 0U;
Void AppDelay(UInt32 delayVal)
{
volatile UInt32 delayCount = delayVal;
while (delayCount-- != 0U)
{
__asm(" NOP");
}
}
Void ledToggle(Void)
{
gIdleToggleCount++;
AppDelay(10000000U);
}
Int main(Void)
{
System_printf("enter main()\n");
BIOS_start();
return (0);
}
项目编译成功。 但是、当我在 C66xx_DSP 上加载并运行.out 文件时、程序不会到达 main () 中的断点。
调用堆栈显示代码在 main() 之前进入 SYS/BIOS / XDC 运行时启动、然后在 DMTimer 模块启动中挂起。
我看到了两个相关的闲置点:
- 使用一个计时器配置时、它会在 Timer_deviceconfig() 中挂起:
while (timer->twps & TIMER_TWPS_W_PEND_TCLR)
{
;
}
- 当 Clock.timerId = 5 时、它在 Timer_checkFreq() 中挂起:
while (Timer_getCount(&tempObj) < timerCountStart + TIMERCOUNTS)
{
;
}
因此、在到达 main() 之前、SYS/BIOS 时钟 DMTimer 似乎没有正常运行。
我检查了以下 PRCM 寄存器:
0x4A005540 CM_CORE_AON__IPU_CM_IPU_CLKSTCTRL
0x4A005558 CM_CORE_AON__IPU_CM_IPU_TIMER5_CLKCTRL
0x4A005560 CM_CORE_AON__IPU_CM_IPU_TIMER6_CLKCTRL
手动将 0x00000002 写入寄存器后、我观察到的值类似于:
CM_CORE_AON__IPU_CM_IPU_CLKSTCTRL = 0x00002502 or 0x00002702
CM_CORE_AON__IPU_CM_IPU_TIMER5_CLKCTRL = 0x00030002
CM_CORE_AON__IPU_CM_IPU_TIMER6_CLKCTRL = 0x00000002
Timer6 似乎已启用、但 Timer5 保持为 0x00030002。 当 Clock.timerId = 5 时、程序在到达 main() 之前仍在 Timer_checkFreq() 中停止。
如果我在 Timer_checkFreq() 挂起后恢复、程序最终会到达 C 运行时中止/退出循环:
for (;;); /* CURRENTLY, THIS SPINS FOREVER */
我还尝试了“Debug as→Code Composer Studio Debug Session“、但 C66xx_DSP 连接失败、其中:
Device is held in reset.
因此、我目前正在通过 CortexA15_0 和 DSP1SSClkEnable_API 使用手动序列。
我的问题是:
- 对于具有 SYS/BIOS 的 AM5718 C66x DSP、应将哪个 DMTimer 用于 SYS/BIOS 时钟模块?
- Clock.timerId 应该是 4、5 还是其他值?
- ti.platforms.evmDRA7XX 是否是 AM5718 C66x DSP 工程的正确 RTSC 平台、或者我是否应该使用不同的平台包?
- 当 ARM Cortex-A15/Linux 端停止时、在 C66xx_DSP 上加载 SYS/BIOS 应用程序之前、需要执行什么正确的 GEL/Linux PRCM 初始化序列?
- 是否需要其他 PRCM 寄存器才能在独立 CCS/JTAG 调试环境中为 C66x DSP SYS/BIOS 时钟启用 DMTimer 功能时钟?
- 这是否与将 Processor SDK RTOS AM57xx 11.01.00.00 与 CCS 12.5 结合使用有关、或者我是否应该使用不同的 SDK/XDCtools 版本组合?
- 设置 Timer.checkFrequency = FALSE 作为权变措施是否有效、或者在正确的 PRCM 初始化后 DMTimer 频率检查是否应该正常工作?
- 是否有官方指南、应用手册、培训文档或示例项目、用于在没有 Linux 远程处理器的情况下控制 CCS 中的 AM5718 C66x DSP 并运行内部 DSP 计算?
- 您能否提供或指向在 DSP 端执行内部计算的简单 AM5718 C66x DSP 独立 SYS/BIOS 示例?
- 例如、一个简单的 SYS/BIOS C66x 工程、它可以正确初始化 DSP、运行计时器或时钟节拍、以及执行 DSP 端计算循环。
- 我想了解为独立 DSP 执行推荐的初始化序列和工程配置。
有关 AM5718 C66x DSP 的正确 SYS/BIOS 时钟/DMTimer 设置的任何指导、尤其是当 ARM 端的 Linux 未运行时、都将不胜感激。
谢谢你。