各位专家,大家好!
请帮忙解答一下,我的情况是这么样。
6678使用4个核,core0~core3;
core0,运行NDK网络程序;
core1~core3,运行处理程序,core1的程序不同;其中core2与core3的程序是同一个程序,通过coreNum实现不同的处理,同时Platform中通过修改L2SRAM的全局地址区分两个核的程序空间,将所有section均映射到L2SRAM.
core0不使用cache,core1~core3使用cache;
4个核的cmd映射为:core0是evm6678的ndk例程,core~core3均通过PLATFORM的L2SRAM映射到自己的LOCAL SRAM地址,比如core1为0x11800000,core2为0x12800000,core3为0x13800000;
现在的问题是:
通过仿真下载调试:
20次下载并同时运行,均正常工作;
烧写到FLASH后的结果:
a, 4个核,core1~core3均把cache设置为0K,即不使用cache,每次4个核都能正常启动并运行;
b, 4个核,core1~core2均把cache设置为32K,core3的cache设置为0K,每次4个核都能正常启动并运行;
c, 4个核,core1~core3均把cache设置为32K,每次4个核都能正常启动但是运行一会有core1~core3有随机的运行几秒就停止的情况出现,脸上仿真器看,停止的core已经abort,每次都出现到相同的位置,到一条死循环的指令:abort() at exitc:109 0x00869e80;
附带:设置成cache 0k的代码
/* Cache */
CACHE_setL1PSize(CACHE_L1_0KCACHE);
CACHE_setL1DSize(CACHE_L1_0KCACHE);
CACHE_setL2Size(CACHE_0KCACHE);
CACHE_invAllL1p(CACHE_WAIT);
CACHE_wbInvAllL1d(CACHE_WAIT);
CSL_XMC_invalidatePrefetchBuffer();
_mfence();
_mfence();
附带:设置成cache 32k的代码
/* Cache */
CACHE_setL1PSize(CACHE_L1_32KCACHE);
CACHE_setL1DSize(CACHE_L1_32KCACHE);
CACHE_setL2Size(CACHE_0KCACHE);
CACHE_invAllL1p(CACHE_WAIT);
CACHE_wbInvAllL1d(CACHE_WAIT);
CSL_XMC_invalidatePrefetchBuffer();
_mfence();
_mfence();
感谢各位专家,分析一下,小弟非常感谢!
xiaodong Li2:
补充:
DSP的内核电压目前为1.0V固定,已试过内核电压改为1.1V与1.1V+VID的方式,结果均一样;
两个一个奇怪的现象是:将core3的程序全部映射到DDR3没有被使用的一段空间里,即程序在DDR3里运行,cache设置如下:
/* Cache */ CACHE_setL1PSize(CACHE_L1_0KCACHE); CACHE_setL1DSize(CACHE_L1_0KCACHE); CACHE_setL2Size(CACHE_32KCACHE); CACHE_invAllL1p(CACHE_WAIT); CACHE_wbInvAllL1d(CACHE_WAIT); CSL_XMC_invalidatePrefetchBuffer(); _mfence(); _mfence();
程序每次上电程序均能从FLASH引导运行,并且也不跑飞,唯一的就是运行速度变慢了。
xiaodong Li2:
请专家分析下:
core2与core3的程序相同,均使用L1D作为CACHE,在使用需要有什么注意的,才能避免异常情况的发生。
Andy Yin1:
回复 xiaodong Li2:
多核共享的代码可以是一份存于共享memory,也可以是每个core各自保存一份存于各自私有的memory,但是每个core的堆栈必须是独立的;如果使能了cache,在多核访问共享数据时存在cache一致性的问题,需要软件去维护cache一致性。