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.

DSP库中的函数怎么指定运行地址在DSP L1P RAM

DSP库中的函数怎么指定运行地址在DSP L1P RAM

比如DSPF_sp_fftSPxSP函数,想要放在DSP L1P RAM中运行,要怎么设置。

在DSPF_sp_fftSPxSP.s文件中,有.sect ".text:optimized"但是更改后运行不了。

  • 之前有客户问过类似的问题,可以看一下。
    e2echina.ti.com/.../106479
  • L1P与L1D除了可以当Cache,还有什么其他的用法么?
    L1P当程序cahce时,是不是会提高程序的运行效率?
  • Cache的原理都是一样的:

  • 1、如果L1P设置为程序的cache,那么是哪些程序cache了,可以确定么?
    2、如果不用于cache功能,那么是不是L1P与L1D就是无用 的了?

    3、以下帖子中的问题是不是bug
    e2echina.ti.com/.../429567
  • user3688025 说:
    如果L1P设置为程序的cache,那么是哪些程序cache了,可以确定么?

    可以确定。用cache freeze 功能。

    user3688025 说:
    2、如果不用于cache功能,那么是不是L1P与L1D就是无用 的了?

    理论上在不用作cache时,L1P可以放程序,L1D可以放数据。但是L1P/L1D默认是使能的。那么在启动时,是不能作为程序,数据空间的。只能通过memory overlay方式,在启动后,将L1 Cache disable,再将程序搬到L1P去。

    需要注意的是,在不用作Cache时:L1P只能放程序,L1D只能放数据。

  • 1、cache freeze 功能是CCS的功能么?如何使用?


    2、默认使能是在不使用函数CacheEnable(L1PCFG_L1PMODE_32K | L1DCFG_L1DMODE_32K );进行配置时,也是使能的么?
    那么禁用是通过哪个函数,或是什么方式。

    3、
    memory overlay方式如何使用,L1D与L1P应该不能按地址访问吧

    4、
    可以将程序搬到L1P,将数据搬到L1D中,那么之后的程序运行与数据的读写更新是通过什么方式,按问题3来将不可以按地址访问的、
  • user3688025 说:
    1、cache freeze 功能是CCS的功能么?如何使用?

    最终在芯片上运行的,肯定与CCS无关,Freeze指的是Cache的配置。

    关于Cache的寄存器说明,见下面文档,所有Cache的操作都是通过这几个寄存器来实现的,其实很简单。

    关于Cache操作的几个模式,见下面文档(文中的关于CSL函数就不要追究了,这些函数是根据以前的DSP带的CSL库来的,现在的芯片没有这种CSL库了) 

    user3688025 说:
    2、默认使能是在不使用函数CacheEnable(L1PCFG_L1PMODE_32K | L1DCFG_L1DMODE_32K );进行配置时,也是使能的么?
    那么禁用是通过哪个函数,或是什么方式。

    禁用就看有没有一个CacheDisable的函数,或者直接用配置上面文档里的寄存器

    user3688025 说:
    memory overlay方式如何使用,L1D与L1P应该不能按地址访问吧

    Disable cache功能后就是RAM了,就可以按地址访问了。

    user3688025 说:
    可以将程序搬到L1P,将数据搬到L1D中,那么之后的程序运行与数据的读写更新是通过什么方式,按问题3来将不可以按地址访问的、

    参考下面文档的 memory overlay和copy table.

    最后问一下,为什么要将L1用作RAM?

  • 首先感谢你的回复与细心指导。


    1、使用L1为RAM的原因:


    起初是想把程序中的主要算法放在内部RAM中,有DSP库的汇编FFT函数,还有自己写的几个其他算法函数,Freeze模式只是可以把缓冲的程序固定在cache(不知道理解的对不对)而无法指定特定的几个函数一直在L1P中运行,或是在Freeze之前cache程序无法指定。

    再加上项目中的数据量是比较大的,L2已经被占用的差不多,程序无法放到L2中,只能是打L1的主意了。

    是不是我对cache的功能不够了解,是不是在使能cache的情况下,可以指定特定几个函数在L1P中运行,或是指定数据在L1D中。我在cmd中试过,也更改过FFT的汇编,都是无效的,应该是这种方式都是会按地址访问的,所以无法运行。

    2、

    我在如下wiki地址找到了你说的rcsl库,不知道 是不是你说的这个库,也是好久没的更新过了。
    processors.wiki.ti.com/.../QuickStartOMAPL1x_rCSL
    另外,在最新的processor_sdk_rtos_omapl138_4_02_00_09这个软件包中,找到了一个csl的库,这个库是使用makefile进行管理的,而不是CCS软件。
    ..\pdk_omapl138_1_0_3\packages\ti\csl

  • user3688025 说:
    是不是我对cache的功能不够了解,是不是在使能cache的情况下,可以指定特定几个函数在L1P中运行,或是指定数据在L1D中。我在cmd中试过,也更改过FFT的汇编,都是无效的,应该是这种方式都是会按地址访问的,所以无法运行。

    再看一下cache freeze和memory overlay,这两个是不同的方法。你直接在cmd里改到L1,当然不行了,连boot都起不来。默认是Cache,你boot时往Cache空间搬数据,这时连地址都没有,当然不会成功。 

    user3688025 说:
    我在如下wiki地址找到了你说的rcsl库,不知道 是不是你说的这个库,也是好久没的更新过了。
    processors.wiki.ti.com/.../QuickStartOMAPL1x_rCSL
    另外,在最新的processor_sdk_rtos_omapl138_4_02_00_09这个软件包中,找到了一个csl的库,这个库是使用makefile进行管理的,而不是CCS软件。
    ..\pdk_omapl138_1_0_3\packages\ti\csl

    这个跟当前Cache使用问题无关。我说了忽略文内对CSL API调用的相关部分,关注Cache工作原理。

  • 在cmd中先把程序指定在DDR2中。 .text > DDR2

    程序运行后,先disable L1D、L1P、L2

    把程序通过copy_in从DDR2中搬运到L1P中,这里copy_in函数的参数COPY_TABLE是在cmd文件中的UNION中的table创建的吧?

    在编译应用程序时,已经生成了map文件,每个函数的地址已经是固定的了,在搬运后运行进,是如何运行L1P中的函数而不是原有的DDR2中的程序的呢?

    在cmd的编译过程中有几个警告,是什么原因?

    在对应的C文件中使用copy_in函数。

    请问,这样使用对不对?

    但运行到这几个数学函数后,程序就会跑飞。

  • 警告问题是没有对这几个函数进行调用,调用过就会没有警告了。
  •  直接调查用函数名就可以了,这里有个wiki说明:

  • 按之前的方式使用时,程序会跑飞

    你现在的wiki方式,编译不通过。

    void CacheDisable(void)
    {
    HWREG(SOC_CACHE_0_REGS + DSPCACHE_L1PCFG) =
    HWREG(SOC_CACHE_0_REGS + DSPCACHE_L1PCFG) & 0xfffffff8;
    HWREG(SOC_CACHE_0_REGS + DSPCACHE_L1DCFG) =
    HWREG(SOC_CACHE_0_REGS + DSPCACHE_L1DCFG) & 0xfffffff8;
    HWREG(SOC_CACHE_0_REGS + DSPCACHE_L2CFG) =
    HWREG(SOC_CACHE_0_REGS + DSPCACHE_L2CFG) & 0xfffffff8;
    }

  • 忽略了一件事,这里往L1P搬运不能用copy_in函数,因为copy_in是用CPU的数据访问方式,而L1P空间是不能通过数据总线方式访问的,可以改用IDMA。所以前面的操作其实并没有搬进去。

    上面的错误是函数cossp_ctbl没找到。 

  • 1、IDMA有没有例程。在StarterWare中没有找到
    2、例程group的方式,可以找到表_cossp_ctbl,但是使用wiki中的方式,就是上帖中的方式,却找不到是什么原因。
    还是要使用GROUP的方式么?wiki这种使用函数名的方式,是不是不适合CCS5以上的版本?
  • IDMA的使用方式相对简单,按照手册sprufk5a上的说明应该不会有什么问题。memory to memory要用IDMA channel 1