TI中文支持网
TI专业的中文技术问题搜集分享网站

AM3359 执行速度慢

您好,我写了一个裸机程序(简单的整数加法运算)运行在AM3359的ICE上,主频默认720MHZ,但执行的速度非常慢,1000次加法花了240us,我想知道一般是什么原因导致的?谢谢^_^

Yaoming Qin:

检查下cache是否设置,还有编译器的优化选项

jianyi wang:

回复 Yaoming Qin:

您好,这个问题我解决了一部分。慢的一部分原因是虽然打开了Cache、但却没有使能MMU(这个错误比较低级-_-#)。

使能MMU(参考starterware),打开Cache后,1000次加法花了4us的时间,但如果只使能MMU,不打开Cache(默认是关闭的),时间却是250us左右,这个差别有点大,而且250us的时间也太长,我正在调查原因,您要有头绪的话,请指点一下,不胜感激。

Yaoming Qin:

回复 jianyi wang:

这个和你的代码有关系的,看你的代码是不是有很多内存的访问,而且访问的内存比较集中,越是集中,这样cache的效率就越高,反差就越大

jianyi wang:

回复 Yaoming Qin:

您好,我的代码很简单,就是一个循环。

for(Index=0;index<1000;index++)

{

    Data += index;

}

现在的问题是,如果用Cache,得到的时间4us很靠谱,不用Cache得到的时间250us很离谱。

就像我最初遇到的问题,是因为没有使能MMU,那么这个问题是不是也是因为我没有使能某些单元呢?

jianyi wang:

回复 jianyi wang:

求关注

zou Samen:

怎么样使能 cache呢

jianyi wang:

回复 zou Samen:

■文档参考:

Cortex-A8Technical Reference Manual(Revisionr3p2).pdf

3.2.25 c1, Control Register 章

■代码参考:

AM3359 的SDK :

C:\ti\am335x_sysbios_ind_sdk_1.0.0.1\sdk\starterware\starterware-starterware-src\system_config\armv7a\cgttms470_ccs\cp15.c

void CP15ICacheDisable(void)

{

   asm("    mrc     p15, #0, r0, c1, c0, #0\n\t"

       "    bic     r0,  r0, #0x00001000\n\t"

       "    mcr     p15, #0, r0, c1, c0, #0");

}

/**

* \brief      This API disable the Data cache.

*

* \param      None.

*

* \return     None.

*

**/

void CP15DCacheDisable(void)

{

   asm("    mrc     p15, #0, r0, c1, c0, #0\n\t"

       "    bic     r0,  r0, #0x00000004\n\t"

       "    mcr     p15, #0, r0, c1, c0, #0");

}

/**

* \brief      This API Enables the Instruction cache.

*

* \param      None.

*

* \return     None.

*

**/

void CP15ICacheEnable(void)

{

   asm("    mrc     p15, #0, r0, c1, c0, #0\n\t"

       "    orr     r0,  r0, #0x00001000 \n\t"

       "    mcr     p15, #0, r0, c1, c0, #0 \n\t");

}

/**

* \brief      This API Enables the Data cache.

*

* \param      None.

*

* \retiurn     None.

*

* Note: MMU shall be enabled before enabling D-Cache

**/

void CP15DCacheEnable(void)

{

   asm("    mrc     p15, #0, r0, c1, c0, #0\n\t"

       "    orr     r0,  r0, #0x00000004\n\t"

       "    mcr     p15, #0, r0, c1, c0, #0");

}

Yaoming Qin:

回复 jianyi wang:

如果可以,你可以连上仿真器,开到反汇编,通过CP15的CYCLE COUNT, 单步看看每条指令花了几个CYCLE,同时对比是否开CACHE有多大区别。

jianyi wang:

回复 Yaoming Qin:

谢谢您的回答,连仿真器是个很好的解决方案,可惜对我来说有点困难^_^.

我计算了执行这么多循环大概所需的理论时间,发现其实真正的执行时间很少,大部分时间花在了从RAM内读取指令上,下面是大概的数据。

·读取指令时间:180us(按最大值算的,其实应该小很多)

·执行指令时间:2us

所以我怀疑是不是内存配置出错了?我的MMU配置是直接拿SDK的例子里的,应该不会错呀(请参考附件)。难道我得到的数据就是对的,AM3359比较慢?

Yaoming Qin:

回复 jianyi wang:

这个读取指令的时间的确太长了点,我有点怀疑你计算的准确性,你是用什么方法测试的读取指令的,MMU关键是配cacheable,如果你把对应的位配对了就ok了。AM3359用的arm core,这部分ti没有做修改,所以速度上没有问题,我比较关心你的这些方法的准确性,你最好还是搞个仿真器看看吧

赞(0)
未经允许不得转载:TI中文支持网 » AM3359 执行速度慢
分享到: 更多 (0)