Part Number:PROCESSOR-SDK-OMAPL138
目前出现一个问题,在40Khz的中断服务中:
1、在未置位某个标志时,中断服务程序是空闲无处理数据;
2、当置位某个标志时,开始执行一些数据的计算处理;此时由于数据未提前加载进入cache中,第一次计算时间非常大,超出2个中断时间间隔,当第一次计算完之后,实际计算占用时间只有半个中断的时间间隔。
请问,怎么在置位标志前,告诉dsp核,提前加载数据到cache中,避免第一次执行时超过中断间隔。
Shine:
请问是在中断里收这些数据的吗?如果是的话,这个没办法提前加载到cache中
,
Kevin Le82:
数据都已经存在的,只是在标志位置位的时候,开始计算而已
,
Kevin Le82:
计算中用到的函数也是不在cache中,导致第一次计算耗时大了好几倍
,
Shine:
那可以在标志位置位前,先用emda方式把数据搬移到cache里。
,
Kevin Le82:
计算函数的代码和相关计算数据都可以搬到cache吗?请问怎么操作,有相关例程吗
,
Shine:
可以参考starterware里的C:\ti\C6748_StarterWare_1_20_04_01\examples\lcdkC6748\cache_mmu例程。https://www.ti.com.cn/tool/cn/STARTERWARE-C6DSP
,
Kevin Le82:
Shine,你好,我看过你提示的参考代码;看例子只是一个edma3搬运uart数据的例子,感觉和cache没什么关系。cache是当前代码要访问某个内存地址的数据时,dsp核将该内存地址附近(cache line长度)数据搬运到dsp核的L1cache缓存中,而且cache缓存的数据是有特定格式的吧,应用程序应该是不能随便把内存数据搬运到cache所在的地址空间的
,
Shine:
这个例程有使能cache。This is a sample application file which invokes some APIs * from the EDMA3 device abstraction layer as well as UART * device abstraction layer to perform configuration, and * transfer of data between UART and CPU RAM by the * use of EDMA3 with cache and mmu being enabled.
,
Kevin Le82:
我的工程已经开启了cache的,我需要的是怎么将计算用到的数据、函数提前cache到L1缓存去,而不是置位启动标志后,执行到当前位置再急急忙忙加载到cache,这样由于第一次执行,加载时间会很长;平常连续执行15us的代码,第一次执行会到65us,已经超出我的中断间隔25us了。
,
Shine:
可以在置位启动标志之前,使能cache, 然后用edma方式把数据搬移到cache中。
,
Kevin Le82:
我重新又看了一遍那个uart的工程,里面只是启动edma3将数据搬运到一个#define UART_RBR_THR_REG ((0x01D0D000u) + (0u))寄存器中,但是对于应用程序来说,cache是相对比较小的。cache是由dsp核自己管理的,我用edma3去般,也不知道应该搬到cache的哪个地址,我怎么把函数的代码般到L1P cache,将数据搬到L1D cache中,cache的哪个地址段是我可以用的,而且代码里面使用的地址都是内存中的地址,这个怎么转换?
,
Shine:
Cache是没有地址的,不能直接写Cache。请问要处理的数据是放在DDR的吗?如果是的话,用EDMA搬移到L2 RAM,然后会自动搬移到L1 cache中。可以看一下下面的cache一致性文档。https://www.ti.com.cn/general/cn/docs/gencontent.tsp?contentId=64183
,
Kevin Le82:
你好,由于相关计算代码、数据都比较大,所以都是才ddr中;L2作为cache时也是没有地址的吧,L2即使划分一部分作为ram使用,计算过程也需要分段复制数据到L2Ram中,这个有相关例程吗?代码、数据分别怎么传输?
,
Shine:
数据很大的话,可以直接把DDR设成cache。通过MARn寄存器来设置需要cache的地址范围。4.4.4 Memory Attribute Registers (MARn)https://www.ti.com/lit/ug/sprufk5a/sprufk5a.pdf例程可以参考附件的rcsl里的rCSL_examples\evmOMAPL138\DSP_examples\cache\CACHE_dspLib_fft_dspL138。您看一下能否提高性能。quickStartOMAPL1x_rCSL-2.0-Setup.zip
,
Kevin Le82:
Cache.MAR192_223 = 12;
这样设置,是不是代表0xc2000000~0xc3ffffff都是cache了吧
目前工程是这么设置的
,
Kevin Le82:
Build.platformTable[“ti.platforms.evmOMAPL138:dsp”] = { externalMemoryMap: [ [ SR_0.name, SR_0 ], [ SR_1.name, SR_1 ], [ DSP_PROG.name, DSP_PROG ], [ DSP_DATA.name, DSP_DATA ], ], codeMemory: "DSP_PROG", dataMemory: "DSP_DATA", stackMemory: "DSP_DATA", l1DMode: "32k", l1PMode: "32k", l2Mode: "256k"};
开启了全部cache
,
Shine:
如果已经用了cache的话,想不出其他办法来提高性能了。
,
Kevin Le82:
目前想到的方法是,在未置位标志之前,也调用计算相关函数,但是在这些函数开头增加标志位是否置位判断,未置位着退出;这样置位后代码第一次执行会有所改善,由原来的65us到现在只需要35us左右,节约了30us;应该是由于进入就退出只缓存了比较少的代码,导致只加速了部分;第二次执行就会降为17us左右。加速不够,也有可能是数据未被缓存的问题,不知道怎么让dsp核缓存一下该函数计算用到的数据?用全局变量,记录计算用的第一个数据,使得DSP访问计算数据,被动触发cache,不知道这样会不会有效果?
,
Kevin Le82:
在另外一个贴的回复中,学到了一个touch数据的方法加速数据cache,但是对于代码有类似的函数吗?
参考文档
https://www.ti.com.cn/cn/lit/ug/sprug82a/sprug82a.pdf
,
Shine:
可以在c语言里调用汇编函数。
,
Kevin Le82:
touch的原理是通过ldw指令触发cache控制器执行cache动作,并不会修改touch的指针数据;对于函数代码,没有想到有什么操作可以达到这样的目的
,
Kevin Le82:
Shine,万分感谢!
数据可以使用touch来预取,
代码暂时还没有办法。
,
Shine:
感谢分享!