uV4如何在优化级别0的情况下,使得for循环实现在优化级别3时的运行速度?

2019-07-21 00:31发布

以下是uV4的优化级别设置:




以下是所要运行的程序(for循环实现从后面地址中提取数据送给shuzhu1[]):



for()循环的执行速度,在优化级别为0的情况下是在优化级别为3的情况下的10/14,
虽然在优化3的情况下执行速度快,但是debug效果很差,程序会乱跑,不能用优化3
而优化0情况下,虽然debug正常,但是执行速度比较慢
所以我就想是不是可以在优化级别0的情况下,通过某种方法使得for循环执行速度达到优化3情况下的速度(别的程序不用快,只要for循环快就行)
现在有两个想法:
1,for循环部分直接用汇编编写,在优化0的情况下把for循环替换成优化3下的for的反汇编指令
2,对现有的for循环优化,例如用指针什么的,或者用别的更快的循环方法代替for循环(具体还不知怎么办)


以下为优化0情况下和优化3情况下,for循环反汇编

优化0(黑 {MOD}部分):


优化3(黑 {MOD}部分)



哪位大神知道的,请给点意见,谢谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
15条回答
FreeRTOS
1楼-- · 2019-07-21 01:07


这样赋值会导致每次循环都进行一次读FLASH操作(0x60010000数值保存在FLASH)

建议:

uint32_t  temp = 0x60010000;

while(1)
{
    for(i=0; i<300; i++)
    {
        shuzu1 = *(volatile uint8_t*)temp;
    }
}
FreeRTOS
2楼-- · 2019-07-21 05:09
回复【5楼】等待烟花美:
---------------------------------
MDK的编译器还真没研究过,不过你提出的“for循环部分直接用汇编编写”其实比较好,并且比较稳妥,建议就用汇编代替for循环部分好了
FantaSy_
3楼-- · 2019-07-21 07:11
帮顶。。。。
等待烟花美
4楼-- · 2019-07-21 12:00
 精彩回答 2  元偷偷看……
等待烟花美
5楼-- · 2019-07-21 16:36
回复【3楼】FreeRTOS:
---------------------------------
非常感谢,这样改确实有用。按照你那样改,在优化0的情况下,与之前相比确实反汇编少了第一句话 LDR r0,[pc,#20],但是与优化3情况下相比,还是不太一样,想问一下怎么修改才能使得反汇编达到优化3那样的6条语句?
或者您知不知道uv4 MDK有没有类似#pragma OPTIMIZE(3)这样的指令,能够使得在优化设置为0的情况下,只对for循环进行优化3?
等待烟花美
6楼-- · 2019-07-21 19:09
回复【6楼】FreeRTOS:
---------------------------------
好的,非常感谢

一周热门 更多>