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.

[参考译文] AM5728:DSP SYSBIOS 时钟问题

Guru**** 2540720 points
Other Parts Discussed in Thread: AM5728, SYSBIOS

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/832066/am5728-dsp-sysbios-clock-issue

Thread 中讨论的其他器件:AM5728SYSBIOS

您好、论坛、

由于无法在 AM5728的 DSP1上正常运行操作系统时钟模块、我感到非常沮丧。

我正在尝试使用在 Linux 设备树中配置为属于 DSP1的 GPTimer14 (ID:13)。

因此、我创建了一个简单的工程、该工程复制了包含.cfg、makefile 和一个.c 文件的问题。

基本上、我启动一个应该睡眠1000ms 的任务、并在每次睡眠到期时打印一些内容。

此外,我将时钟定义为用户类型,并且我从自定义函数调用 Clock_tick(),但这不会被调用,因为时钟节拍一直为零。

静态 int n = 0;
void myTimerTick (UArg-变量)
{
Clock_tick ();
n++;
if (n%1000 = 0)
{
log_Print1 (Diags_info、"Clock_tick ()%d\n"、n);
}
}

//*
=== main ====
//
int main (int argc、Char* argv[])
{
ERROR_Block EB;
Task_Params 任务参数;

log_print0 (Diags_entry、"->main:");

/*必须在使用错误块之前对其进行初始化*/
ERROR_INIT (&EB);

/*创建主线程(BIOS 上的 main 中未启用中断)*/
Task_Params_init (&taskParams);
taskParams.instance->name ="任务";
taskParams.arg0 =(UArg)argc;
taskParams.arg1 =(UArg)argv;
taskParams.STACKSIZE = 0x1000;
Task_create (main_task、&taskParams、&EB);

if (Error_check (&EB)){
system_abort ("main: Failed to create application startup thread");
}

/*启动调度程序,这永远不会返回*/
BIOS_start();

/*永远不应该来这里*/
log_print0 (Diags_exit、"<- main:");
返回(0);
}/*



==== main_task ======
//
void main_task (UArg0、UArg0 arg1)
{
log_print0 (Diags_entry、"->main_task:");

while (1)
{
Task_sleep (1000);
log_print0 (Diags_info、"System_sleep()返回%d\n");
}

log_print0 (Diags_exit、"<- main_task:");
} 

我应该添加以下内容、以确认我的 GPTimer14工作正常(基址:0x4882A000、TCLR=0x3、调试器步进时 TCRR 递增)。

请就此提供一些 RTOS 或 DRA7xx 专家建议、因为我自己找不到任何解决方案。

此致

e2e.ti.com/.../0068.test.zip

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

    从 ARM console/remoteproc 启动 DSP 时、我获得的输出为:

    # cat /sys/kernel/debug/remoteproc/remoteproc2/trace0
    [ 0.000] 18个资源条目、位于0x95000000
    [ 0.000][t=0x000440a4] xdc.runtime.Main:--> main:
    [ 0.000]使用主机
    [在61上注册 rpmsg-proto:rpmsg-proto 服务 0.000][t=0x0035fcf8] xdc.runtime.Main: NameMap_sendMessage:host 53、port=61
    [ 0.000][t=0x0037608d] xdc.runtime.Main:--> MAIN_TASK:
    

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

    您好!

    如果没有 Linux、您是否能够独立运行 DSP? 也就是说、使用 makefile 或 CCS 工程来构建计时器中断应用程序、我认为不需要 RSC_Table_DSP.c、然后使用 CCS/JTAG 将其加载到 DSP 内核中(无需使用 Linux Remoteproc)。 这是否按预期工作?  

    这可以将问题分开、要么是纯计时器配置、要么是与 Linux 集成?

    此致、Eric

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

    尊敬的 Eric:

    从 CCS 通过 JTAG 加载对我来说是不可能的、 此线程 具有有关这方面的更多信息。 我只能通过 Remoteproc 加载。

    此外、Linux 器件树简单地说、我的定时器 GPTimer14由 DSP 处理。 它是 SYSBIOS 配置文件、可转换为设置这些计时器寄存器的 C 代码。 我认为 Linux 在这里没有任何影响。

    我也不认为计时器本身是问题原因、因为我检查了寄存器、它的计数精确到1ms (19200000Hz、19200计数、从0xffffff500到0xffffffff)。

    我认为问题在于 BIOS 时钟配置或它与工作计时器之间的接口。

    同时,我在 BIOS .cfg 中做了一些调整,BIOS 时钟开始计时,所有 Task_sleep()函数和跟踪时间戳都是正确的,但在重新启动电路板后,完全相同的 DSP1映像不再起作用。 这已经发生了两次了。  

    /*-------------------- 勾选---------------------------------------- //
    var TimerSupport = xdc.useModule('ti.sysbios.family.shared.vayu.TimerSupport');
    TimerSupport.availbMask = 0xFFFF;
    
    var Clock = xdc.useModule('ti.sysbios.knl.Clock');
    Clock.tickSource = Clock.TickSource_user;
    Clock.timerId = 13;
    
    var Timer = xdc.useModule('ti.sysbios.timers.dmtimer.Timer');
    
    Timer.timerSettings[13].intNum = 15;
    
    //跳过计时器频率验证检查。 稍后需要删除此内容*/
    //Timer.checkFrequency = false;
    
    //将其与提供 dmTimers 的 SYS_CLK 频率相匹配。
    *一旦 SYS/BIOS 系列设置被更新、就不需要。 */
    Timer.intFreq.hi = 0;
    Timer.intFreq.lo = 19200000;
    
    var timerParams = new Timer.Params ();
    timerParams.period = Clock.tickPeriod;
    timerParams.periodType = Timer.Periodfg Type_microsecs;
    //关闭软件复位以使以下设置生效*
    / timerParams.tiocpClode.tiwake_timerup*
    
    = 0x2000*;timerup.timerup.params.wak.up.timerup.timerup.timerup.timerup.timerup.timerup.timerup.timerup.timerup.timerup.timerup.timerup.timerup.timerup.timerup.timerup.tim
    
    
    timer.create (Clock.timerId、Clock.doTick、timerParams); 

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

    您好!

    我连接了一个 SYSBIOS C66x 计时器应用程序。 这是独立的、您可以使用 CCS/JTAG 加载。 如果您在表达式窗口中查看增量、您将看到计时器 ISR 每600M 个周期输入一次、对于600MHz CPU 为1秒。 您可以将其称为计时器的起点(不同实例、不同间隔等)。

    对于 Linux +计时器、我添加了我的同事以获得此支持。

    此致、Eric

    e2e.ti.com/.../Timer_5F00_C66x_5F00_Sysbios.zip

      

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

    您好!

    您是否能够确认 C66x 上的独立 SYSBIOS 计时器是否在您身边工作(请参阅我附加的 CCS 项目)? 问题仅在 Linux+DSP 中出现?

    此致、Eric

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

    尊敬的 Eric:

    我假设您的项目按原样工作(使用 GPTimer6)。

    我在电路板上尝试过它、当然、Linux 开始显示内核转储和对 L4_PER3的访问、因为 DSP1正在访问 Linux 设备树中未标记为已分配的计时器。

    然后、我只需在项目的.cfg 中将计时器 ID 更改为13 (GPTimer14)。 转储会中断,但由于某种原因,应用程序将无法正常工作,如您所述。

    然后、我在指示 Linux 器件树使用 GPTimer5 (通常与 DSP1一起使用)后重新编译了该器件树。

    这可以正常工作、BIOS 时钟现在正在正常计数。

    感谢您的支持!