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.

[参考译文] CODECOMPOSER:AM5718 C66x SYS/BIOS 时钟 DMTimer 在 Timer_deviceconfig/Timer_checkFreq 中的 main () 之前挂起

Guru**** 2952510 points

Other Parts Discussed in Thread: AM5718

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1654820/codecomposer-am5718-c66x-sys-bios-clock-dmtimer-hangs-before-main-in-timer_deviceconfig-timer_checkfreq

部件号: 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。

我当前的调试序列为:

  1. 启动 AM5718.ccxml
  2. 连接到 CortexA15_0
  3. 运行 GEL 函数 DSP1SSClkEnable_API
  4. 通过 Memory Browser 手动检查/修改 PRCM 寄存器
  5. 连接到 C66xx_DSP
  6. 将 Blink_led_Idle.out 加载到 C66xx_DSP
  7. 恢复 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 模块启动中挂起。

我看到了两个相关的闲置点:

  1. 使用一个计时器配置时、它会在 Timer_deviceconfig() 中挂起:
while (timer->twps & TIMER_TWPS_W_PEND_TCLR)
{
    ;
}
  1. 当 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 使用手动序列。

我的问题是:

  1. 对于具有 SYS/BIOS 的 AM5718 C66x DSP、应将哪个 DMTimer 用于 SYS/BIOS 时钟模块?
    • Clock.timerId 应该是 4、5 还是其他值?
  2. ti.platforms.evmDRA7XX 是否是 AM5718 C66x DSP 工程的正确 RTSC 平台、或者我是否应该使用不同的平台包?
  3. 当 ARM Cortex-A15/Linux 端停止时、在 C66xx_DSP 上加载 SYS/BIOS 应用程序之前、需要执行什么正确的 GEL/Linux PRCM 初始化序列?
  4. 是否需要其他 PRCM 寄存器才能在独立 CCS/JTAG 调试环境中为 C66x DSP SYS/BIOS 时钟启用 DMTimer 功能时钟?
  5. 这是否与将 Processor SDK RTOS AM57xx 11.01.00.00 与 CCS 12.5 结合使用有关、或者我是否应该使用不同的 SDK/XDCtools 版本组合?
  6. 设置 Timer.checkFrequency = FALSE 作为权变措施是否有效、或者在正确的 PRCM 初始化后 DMTimer 频率检查是否应该正常工作?
  7. 是否有官方指南、应用手册、培训文档或示例项目、用于在没有 Linux 远程处理器的情况下控制 CCS 中的 AM5718 C66x DSP 并运行内部 DSP 计算?
  8. 您能否提供或指向在 DSP 端执行内部计算的简单 AM5718 C66x DSP 独立 SYS/BIOS 示例?
    • 例如、一个简单的 SYS/BIOS C66x 工程、它可以正确初始化 DSP、运行计时器或时钟节拍、以及执行 DSP 端计算循环。
    • 我想了解为独立 DSP 执行推荐的初始化序列和工程配置。

有关 AM5718 C66x DSP 的正确 SYS/BIOS 时钟/DMTimer 设置的任何指导、尤其是当 ARM 端的 Linux 未运行时、都将不胜感激。

谢谢你。

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

    您能告诉我们您正在  为 AM571x 上的 C66X 内核构建哪个示例吗?

    1.您能否在您的示例中查看“Clock.timerId“。

    2.是的、ti.platforms.evmDRA7XX 是适用于 AM571 C66x 内核的正确 RTSC 平台。

    将检查剩余的查询并返回给您。

    此致、

    Anil

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

    尊敬的 SA:

    我已经使用 SDK 为 AM571x IDK 电路板创建了简单的 UART 示例项目。/pdkProjectCreate.sh AM571x idkAM571x Little UART All DSP

    工程已创建、能够 在 C66x 内核上运行该示例、而不会出现任何问题(即将进入 main 函数)。

    如何为 DSP 内核创建工程?

    此致、

    Anil