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.

[参考译文] OMAPL138B-EP:DSP + ARM 协同工作

Guru**** 2540720 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/589575/omapl138b-ep-dsp-arm-working-together

器件型号:OMAPL138B-EP
Thread 中讨论的其他器件:OMAPL138

您好!

 我最近获得了一个与通信系统有关的项目。 我们决定 开发该项目的板是 LCDK OMAPL138。 在该项目中、我们需要 ARM 和 DSP 芯片协同工作。 ARM 芯 片将负责网络连接和数据的发送或接收、而 DSP 芯片将负责计算密集型的均衡、滤波等。

我已经使用这个电路板的 DSP 芯片已经有很长时间了、但是这是我第一次决定将它与 ARM 芯片结合使用。 在搜索如何使 ARM 与 DSP 配合使用后、我发现了 OMAP staterWare 中的 IPC 示例、这很难理解! 特别是、您不能跟踪 IPC 示例中使用的某些函数或术语的减速。

我寻求帮助的问题是:

1、如何在 CCS 中启动新项目、在该项目中、我可以为 ARM 和 DSP 芯片开发一个程序

2.如何将程序加载到芯片中进行调试

如果有任何提示可以帮助我推进该项目、我将不胜感激。

谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请参阅此 E2E 帖子。
    此致、
    涉水
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    e2e.ti.com/.../2165941
    此致、
    涉水
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢 Wade 的帮助。 我浏览了您发送给我的 MCSDK 用户指南、其中包含了必要的软件包。 但我的担忧仍然存在。

    我仍然不知道如何操作

    1、如何在 CCS 中启动新项目、在该项目中、我可以为 ARM 和 DSP 芯片开发一个程序

    2.如何将程序加载到两个芯片中并进行调试

    谢谢

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

    到目前为止、我已经创建了不同的项目、一个用于 ARM 芯片、另一个用于 OMAL-L138 LCDK 上的 DSP 芯片。 ARM 和 DSP 都在 SYS/BIOS6上运行。 为了将这些程序加载到电路板上、我创建了一个目标配置文件。 下面是我要采取的步骤:

    1.右键单击.ccxml ->启动选定的配置

    2.右键单击 ARM9内核->连接到目标->加载为 ARM 内核编写的程序,并让它到达 mian()的开头

    3.右键单击 DSP 内核->连接到目标->加载为 DSP 内核编写的程序并让它到达 mian()的开头

    4.运行 ARM 内核

    5.运行 DSP 内核

    在下面、您可以看到用于 ARM 内核的.cfg 和文件。 计时器中断每0.5秒关闭一次,ARM_IPC()设置 CHIPSIG2以中断 DSP 内核。

    .CFG

    VAR Defaults = xdc.useModule('xdc.runtime.Defaults');
    var Diags = xdc.useModule('xdc.runtime.Diags');
    var Error = xdc.useModule('xdc.runtime.Error');
    var Log = xdc.useModule('xdc.runtime.Log');
    var LoggerBuf = xdc.useModule('xdc.runtime.LoggerBuf');
    var Main = xdc.useModule('xdc.runtime.Main');
    var SysMin = xdc.useModule('xdc.runtime.SysMin');
    var System = xdc.useModule('xdc.runtime.System');
    var Text = xdc.useModule('xdc.runtime.Text');
    
    var BIOS = xdc.useModule('ti.sysbios.BIOS');
    var Hwi = xdc.useModule('ti.sysbios.hal.Hwi');
    var 任务= xdc.useModule('ti.sysbios.knl.Task');
    VAR Timer = xdc.useModule('ti.sysbios.hal.Timer');
    var MMU = xdc.useModule('ti.sysbios.family.arm.arm9.Mmu');
    
    
    Defaults.common$.namedModule = false;
    
    
    System.maxAtexitHandlers = 4;
    
    
    text.isLoaded = false;
    
    
    SysMin = flushAtExit = false;
    
    BIOS.heapSize = 0x0;
    
    //系统堆栈大小(由 ISR 和 Swi 使用)*/
    Program.stack = 0x400;
    
    // System_printf ()的循环缓冲区大小*/
    SysMin。bufSize = 128;
    
    
    var logerBufParams = new LoggerBuf.Params ();
    
    System.SupportProxy = SysMin;
    
    BIOS.libType = BIOS.LibType_Custom; BIOS.assertsEnabled = true; var timer0Params = new Timer.Params (); timer0Params.instance.name ="timerHandle"; timer0Params.Period = 500000; Program.global.timerHandle = Timer.create (1、"&ARM_IPC"、 timer0Params);

    .C
    //--------------------------------------
    // BIOS 头文件
    //-----------------
    #include //mand强制-对于 BIOS 类型
    #include、必须首先包含 
    #include //mandedis-如果您调用诸如 BIOS_start()
    #include 之类的 API 用于静态定义的对象/句柄
    #include 的//头文件 //When Using Timestamp API (TSCL/H),32位,64位
    
    //---------------
    // MCSDK-PDK-CSLR 包含文件-------------------------------------------------------
    
    #include 
    #include 
    #include 
    #include 
    
    //--------------------------------------
    //原型
    ///--------------------------------------------------------
    void hardware_init (void);
    void arm_ipc (void);
    //---------------
    //全局
    //----------------------------------------------
    CSL_SyscfgRegsOvly sys0Regs =(CSL_SyscfgRegsOvly )(CSL_SYSCFG_0_regs);
    
    //---
    // Main ()
    //---------------
    void main()
    {
    hardware_init();
    
    BIOS_start();/*不返回*/
    }
    
    /../../---------------
    // hardware_init ()
    //../../-----------------
    void hardware_init (void) //called by main
    {//
    
    PINMUX Setup -------------------------------------------------------
    
    //要写入的密钥以启用引脚复用寄存器进行写入
    sys0Regs->KICK0R = 0x83e70b13;
    sys0Regs->KICK1R = 0x95A4F1E0;
    
    }//---------------
    
    
    //arm_ipc ()
    //-----------------
    void arm_IPC (void)
    {
    // IPC -> SYSCFG -> CHIPSIG2
    CSL_fins (sys0Regs->CHIPSIG、SYSCFG_CHIPSIG_CHIPSIG2、1);
    }
    


    以下是为 DSP 内核编写的程序。 接收到来自 ARM 内核的中断后、将其清除并使 LED 闪烁。 


    .CFG
    VAR Defaults = xdc.useModule('xdc.runtime.Defaults');
    var Diags = xdc.useModule('xdc.runtime.Diags');
    var Error = xdc.useModule('xdc.runtime.Error');
    var Log = xdc.useModule('xdc.runtime.Log');
    var LoggerBuf = xdc.useModule('xdc.runtime.LoggerBuf');
    var Main = xdc.useModule('xdc.runtime.Main');
    var SysMin = xdc.useModule('xdc.runtime.SysMin');
    var System = xdc.useModule('xdc.runtime.System');
    var Text = xdc.useModule('xdc.runtime.Text');
    
    var BIOS = xdc.useModule('ti.sysbios.BIOS');
    var Hwi = xdc.useModule('ti.sysbios.hal.Hwi');
    var 任务= xdc.useModule('ti.sysbios.knl.Task');
    
    
    Defaults.common$.namedModule = false;
    
    
    System.maxAtexitHandlers = 4;
    
    
    text.isLoaded = false;
    
    
    SysMin。flushAtExit = false;
    
    
    BIOS.heapSize = 0x0;
    
    //系统堆栈大小(由 ISR 和 Swi 使用)*/
    Program.stack = 0x400;
    
    // System_printf ()的循环缓冲区大小*/
    sysmin.bufSize = 128;
    
    
    var logerBufParams = new LoggerBuf.Params ();
    
    System.SupportProxy = sysmion.phb
    
    
    
    
    = 128;var logerBufParams = true;var loggerlib_params
    hwi0Params.instance.name = 0BIOS = true;BIOS = true;var logrub_params.ipc.alc = true
    hwi0Params.EventID = 5;
    Program.global.IPC_Handle = Hwi.create (10、"&ledToggle "、 hwi0Params);
    

    .C

    //--------------------------------------
    // BIOS 头文件
    //-----------------
    #include //mand强制-对于 BIOS 类型
    #include、必须首先包含 
    #include //mandedis-如果您调用诸如 BIOS_start()
    #include 之类的 API 用于静态定义的对象/句柄
    #include 的//头文件 //When Using Timestamp API (TSCL/H),32位,64位
    
    //---------------
    // MCSDK-PDK-CSLR 包含文件-------------------------------------------------------
    
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    //--------------------------------------
    //原型
    ///--------------------------------------------------------
    void hardware_init (void);
    void ledToggle (void);
    void gpioPowerOn (void);
    
    //---------------
    //全局
    //----------------------------------------------
    CSL_SyscfgRegsOvly sys0Regs =(CSL_SyscfgRegsOvly)(CSL_SYSCFG_0_reg);
    CSL_PscRegsOvly psc1Regs =(CSL_PscRegsOvly)(CSL_PSC_1_regs);
    CSL_GpioRegsOvly gpioRegs =(CSL_GpioRegsOvly)(CSL_GPIO_0_regs);
    
    volatile Int16_t i16ToggleCount)---
    
    
    // Main ()
    //---------------
    void main()
    {
    hardware_init();
    
    BIOS_start();
    }//------------------
    
    
    
    // hardware_init ()
    //../../-----------------
    void hardware_init (void) //called by main
    {//
    
    PINMUX Setup -------------------------------------------------------
    
    //要写入的密钥以启用引脚复用寄存器进行写入
    sys0Regs->KICK0R = 0x83e70b13;
    sys0Regs->KICK1R = 0x95A4F1E0;
    
    //为 GPIO 组0引脚9启用引脚多路复用器(连接到 LCDK 上的 LED)
    sys0Regs->PINMUX0 =((CSL_SYSCFG_PINMUX0_PINMUX0_27_24_GPIO0_9)
    <<(CSL_SYSCFG_PINMUX0_PINMUX0_27_24_SHIFT);
    
    // GPIO 设置---
    
    //首先,在 PSC 中启用 GPIO 模块
    gpioPowerOn ();
    
    //将 GPIO0_9 (GPIO0_9_PIN)配置为输出
    CSL_fins (gpioRegs->Bank[0].DIR、GPIO_DIR_DIR9,0);
    }
    
    //---------------
    // ledToggle () ISR (由 BIOS Hwi 调用,请参阅 app.cfg)
    //---------------
    void ledToggle (void) //由 main{
    
    静态 UINT32 LED_STACLE = 0; //用于切换 LED 状态
    
    // IPC -> SYSCFG ->清除 CHIPSIG2
    CSL_fins (sys0Regs->CHIPSIG_CLR、SYSCFG_CHIPSIG_CLR_CHIPSIG2、0);
    
    如果(LED_STACLE = 1) //如果 LED_STstate 为"1"-打开、则通过 GPIO 打开 LED
    {
    CSL_fins (gpioRegs->Bank[0]。out_data、GPIO_out_data_OUT9、1);
    }
    其他 // LED_STstate 为"0"-关闭、通过 GPIO 关闭 LED
    {
    CSL_fins (gpioRegs->Bank[0]。out_data、GPIO_out_data_OUT9、0);
    }
    
    LED_ST态^= 1; //切换 LED 状态
    
    i16ToggleCount += 1; //跟踪#togips}
    
    
    void gpioPowerOn (void)
    {
    易失性 uint32 pscTimeoutCount = 10240u;
    uint32 temp = 0;
    
    //为 PSC 中的 GPIO 模块加电并启用 GPIO 模块
    psc1Regs->MDCTL[CSL_PSC_GPIO]=((psc1Regs->MDCTL[CSL_PSC_GPIO]
    和0xFFFFFFE0)
    | CSL_PSC_mdstat_State_enable);
    
    // Kickstart 启用命令
    temp = psc1Regs->PTCMD;
    temp =(temp & CSL_PSC_PTCMD_GO0_MASK)
    |(CSL_PSC_PTCMD_GO0_SET << CSL_PSC_PTCMD_GO0_SHIFT);
    
    psc1Regs->PTCMD |= temp;
    
    //延迟足够的时间来发生电源状态转换(状态未检查,这是希望的结果)
    while ((((psc1Regs->PTSTAT 和(CSL_PSC_PTSTAT_GOSTAT0_IN_TRANSITION))!= 0)
    &&(pscTimeoutCount>0)
    {
    pscTimeoutCount-;
    }
    
    }
    
    

    但没有发生任何预期的情况。 有时我会遇到中止错误,有时什么也不会发生,...

    我想知道有人能不能帮助我理解我的错误

    谢谢

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

    我还尝试创建特定的调试配置、其中 CCS 负责为目标内核加载程序、但 ARM 内核再次中止。

    下面是一个屏幕截图

    如果有人能帮我、我将不胜感激

    谢谢

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

    我加载了为 ARM 内核编写的程序、它在每个计时器中断时成功运行并向 syscfg0 -> chipsig 写入1。
    然后、我加载了写入 DSP 内核的程序、并手动将1写入 SYSCFg0 ->芯片、DSP 接收到中断并闪烁 LED。
    但是、当我加载两个内核时、ARM 内核会中止!!

    如果有人能帮我、我将不胜感激。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在此器件上开发 IPC 代码有许多选项。 可以提供有关您在 ARM 和 DSP 上运行的操作系统的更多详细信息。 Starterware 中的 IPC 适用于裸机或无操作系统开发用例、为 ARM 提供中断 DSP 并传递消息/缓冲区的非常基本的服务。 此处提供了实现方案的详细信息:
    processors.wiki.ti.com/.../StarterWare_01.10.01.01_User_Guide

    如果您使用的是 TI RTOS 和/或 Linux,在 MCSDK 1.1中,我们提供了一个名为 syslink 的组件,该组件提供 ARM HLOS 服务,并为将在 DSP 上运行的 TI RTOS 提供 IPC 组件,以便与 ARM 上的 syslink 通信。

    processors.wiki.ti.com/.../MCSDK_OMAPL138_User_Guide_Chapter_Exploring
    processors.wiki.ti.com/.../Creating_CCS_Project_for_SysLink_samples

    我们计划在本月末对此器件进行软件更新、在此期间 TI SDK 将采用社区认可的方法使用 RemoteProc/RPMsg 和 IPC 来实现 IPC、并将在本月末推出一些示例。 由于这是新的发展、我建议查看积极维护的软件、而不是3-4年前发布的 syslink。

    此致、
    Rahul