目前出现一个问题,在40Khz的中断服务中:
1、在未置位某个标志时,中断服务程序是空闲无处理数据;
2、当置位某个标志时,开始执行一些数据的计算处理;此时由于数据未提前加载进入cache中,第一次计算时间非常大,超出2个中断时间间隔,当第一次计算完之后,实际计算占用时间只有半个中断的时间间隔。
请问,怎么在置位标志前,告诉dsp核,提前加载数据到cache中,避免第一次执行时超过中断间隔。
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.
目前出现一个问题,在40Khz的中断服务中:
1、在未置位某个标志时,中断服务程序是空闲无处理数据;
2、当置位某个标志时,开始执行一些数据的计算处理;此时由于数据未提前加载进入cache中,第一次计算时间非常大,超出2个中断时间间隔,当第一次计算完之后,实际计算占用时间只有半个中断的时间间隔。
请问,怎么在置位标志前,告诉dsp核,提前加载数据到cache中,避免第一次执行时超过中断间隔。
可以参考starterware里的C:\ti\C6748_StarterWare_1_20_04_01\examples\lcdkC6748\cache_mmu例程。
https://www.ti.com.cn/tool/cn/STARTERWARE-C6DSP
这个例程有使能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.
我重新又看了一遍那个uart的工程,里面只是启动edma3将数据搬运到一个#define UART_RBR_THR_REG ((0x01D0D000u) + (0u))寄存器中,但是对于应用程序来说,cache是相对比较小的。cache是由dsp核自己管理的,我用edma3去般,也不知道应该搬到cache的哪个地址,我怎么把函数的代码般到L1P cache,将数据搬到L1D cache中,cache的哪个地址段是我可以用的,而且代码里面使用的地址都是内存中的地址,这个怎么转换?
Cache是没有地址的,不能直接写Cache。请问要处理的数据是放在DDR的吗?如果是的话,用EDMA搬移到L2 RAM,然后会自动搬移到L1 cache中。可以看一下下面的cache一致性文档。
https://www.ti.com.cn/general/cn/docs/gencontent.tsp?contentId=64183
数据很大的话,可以直接把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
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
目前想到的方法是,在未置位标志之前,也调用计算相关函数,但是在这些函数开头增加标志位是否置位判断,未置位着退出;这样置位后代码第一次执行会有所改善,由原来的65us到现在只需要35us左右,节约了30us;应该是由于进入就退出只缓存了比较少的代码,导致只加速了部分;第二次执行就会降为17us左右。加速不够,也有可能是数据未被缓存的问题,不知道怎么让dsp核缓存一下该函数计算用到的数据?用全局变量,记录计算用的第一个数据,使得DSP访问计算数据,被动触发cache,不知道这样会不会有效果?