打印

关于预取指的问题,请教版主

[复制链接]
1973|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
凌晨依旧|  楼主 | 2010-7-9 10:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
版主:你好
   我现在主用STM32芯片发现一个问题,请教一下!
   我写了一段程序测试时间,
   使能Prefetch buffer测试时间是11.5us
   不使能Prefetch buffer测试时间是14.5us
   相差就差了3个us
   请问下版主,有什么问题吗,是不是哪里设置不对?
   烦请版主回复一下,谢谢!

   一下是程序
   使用GPIOA8口,是用示波器测得时间
   keyscantime是ram,

   GPIOA->ODR = GPIOA->ODR | 0x100;
    keyscantime++;
    keyscantime++;
    keyscantime++;
    keyscantime++;
    keyscantime++;
    keyscantime++;
    keyscantime++;
    keyscantime++;
    keyscantime++;
    keyscantime++;
   
    keyscantime++;
    keyscantime++;
    keyscantime++;
    keyscantime++;
    keyscantime++;
    keyscantime++;
    keyscantime++;
    keyscantime++;
    keyscantime++;
    keyscantime++;
   
    keyscantime++;
    keyscantime++;
    keyscantime++;
    keyscantime++;
    keyscantime++;
    keyscantime++;
    keyscantime++;
    keyscantime++;
    keyscantime++;
    keyscantime++;
   
    keyscantime++;
    keyscantime++;
    keyscantime++;
    keyscantime++;
    keyscantime++;
    keyscantime++;
    keyscantime++;
    keyscantime++;
    keyscantime++;
    keyscantime++;
   
    keyscantime++;
    keyscantime++;
    keyscantime++;
    keyscantime++;
    keyscantime++;
    keyscantime++;
    keyscantime++;
    keyscantime++;
    keyscantime++;
    keyscantime++;
    GPIOA->ODR = GPIOA->ODR & ~0x100;
沙发
香水城| | 2010-7-9 10:32 | 只看该作者
请问你的时钟频率设置是多少?Flash的等待周期是多少?

如果想有一个量化的分析,还需要知道这段程序的汇编代码。

使用特权

评论回复
板凳
凌晨依旧|  楼主 | 2010-7-9 10:43 | 只看该作者
回版主:时钟使用的是8M经过pll倍频到72M的,我测试过了 系统确实是使用的72M,Flash的等待周期设的是2,我尝试设为0,系统完蛋。
以下是这段程序的汇编代码:直接IAR编译出来的
//   44     GPIOA->ODR = GPIOA->ODR | 0x100;
??testvoid_1:
        LDR.N    R1,??DataTable9  ;; 0x4001080c
        LDR      R1,[R1, #+0]
        ORRS     R1,R1,#0x100
        LDR.N    R2,??DataTable9  ;; 0x4001080c
        STR      R1,[R2, #+0]
//   45     keyscantime++;
        LDR.N    R1,??testvoid_2  ;; keyscantime
        LDRB     R1,[R1, #+0]
        ADDS     R1,R1,#+1
        LDR.N    R2,??testvoid_2  ;; keyscantime
        STRB     R1,[R2, #+0]
//   46     keyscantime++;
        LDR.N    R1,??testvoid_2  ;; keyscantime
        LDRB     R1,[R1, #+0]
        ADDS     R1,R1,#+1
        LDR.N    R2,??testvoid_2  ;; keyscantime
        STRB     R1,[R2, #+0]
//   47     keyscantime++;
        LDR.N    R1,??testvoid_2  ;; keyscantime
        LDRB     R1,[R1, #+0]
        ADDS     R1,R1,#+1
        LDR.N    R2,??testvoid_2  ;; keyscantime
        STRB     R1,[R2, #+0]
//   48     keyscantime++;
        LDR.N    R1,??testvoid_2  ;; keyscantime
        LDRB     R1,[R1, #+0]
        ADDS     R1,R1,#+1
        LDR.N    R2,??testvoid_2  ;; keyscantime
        STRB     R1,[R2, #+0]
//   49     keyscantime++;
        LDR.N    R1,??testvoid_2  ;; keyscantime
        LDRB     R1,[R1, #+0]
        ADDS     R1,R1,#+1
        LDR.N    R2,??testvoid_2  ;; keyscantime
        STRB     R1,[R2, #+0]
//   50     keyscantime++;
        LDR.N    R1,??testvoid_2  ;; keyscantime
        LDRB     R1,[R1, #+0]
        ADDS     R1,R1,#+1
        LDR.N    R2,??testvoid_2  ;; keyscantime
        STRB     R1,[R2, #+0]
//   51     keyscantime++;
        LDR.N    R1,??testvoid_2  ;; keyscantime
        LDRB     R1,[R1, #+0]
        ADDS     R1,R1,#+1
        LDR.N    R2,??testvoid_2  ;; keyscantime
        STRB     R1,[R2, #+0]
//   52     keyscantime++;
        LDR.N    R1,??testvoid_2  ;; keyscantime
        LDRB     R1,[R1, #+0]
        ADDS     R1,R1,#+1
        LDR.N    R2,??testvoid_2  ;; keyscantime
        STRB     R1,[R2, #+0]
//   53     keyscantime++;
        LDR.N    R1,??testvoid_2  ;; keyscantime
        LDRB     R1,[R1, #+0]
        ADDS     R1,R1,#+1
        LDR.N    R2,??testvoid_2  ;; keyscantime
        STRB     R1,[R2, #+0]
//   54     keyscantime++;
        LDR.N    R1,??testvoid_2  ;; keyscantime
        LDRB     R1,[R1, #+0]
        ADDS     R1,R1,#+1
        LDR.N    R2,??testvoid_2  ;; keyscantime
        STRB     R1,[R2, #+0]
//   55     
//   56     keyscantime++;
        LDR.N    R1,??testvoid_2  ;; keyscantime
        LDRB     R1,[R1, #+0]
        ADDS     R1,R1,#+1
        LDR.N    R2,??testvoid_2  ;; keyscantime
        STRB     R1,[R2, #+0]
//   57     keyscantime++;
        LDR.N    R1,??testvoid_2  ;; keyscantime
        LDRB     R1,[R1, #+0]
        ADDS     R1,R1,#+1
        LDR.N    R2,??testvoid_2  ;; keyscantime
        STRB     R1,[R2, #+0]
//   58     keyscantime++;
        LDR.N    R1,??testvoid_2  ;; keyscantime
        LDRB     R1,[R1, #+0]
        ADDS     R1,R1,#+1
        LDR.N    R2,??testvoid_2  ;; keyscantime
        STRB     R1,[R2, #+0]
//   59     keyscantime++;
        LDR.N    R1,??testvoid_2  ;; keyscantime
        LDRB     R1,[R1, #+0]
        ADDS     R1,R1,#+1
        LDR.N    R2,??testvoid_2  ;; keyscantime
        STRB     R1,[R2, #+0]
//   60     keyscantime++;
        LDR.N    R1,??testvoid_2  ;; keyscantime
        LDRB     R1,[R1, #+0]
        ADDS     R1,R1,#+1
        LDR.N    R2,??testvoid_2  ;; keyscantime
        STRB     R1,[R2, #+0]
//   61     keyscantime++;
        LDR.N    R1,??testvoid_2  ;; keyscantime
        LDRB     R1,[R1, #+0]
        ADDS     R1,R1,#+1
        LDR.N    R2,??testvoid_2  ;; keyscantime
        STRB     R1,[R2, #+0]
//   62     keyscantime++;
        LDR.N    R1,??testvoid_2  ;; keyscantime
        LDRB     R1,[R1, #+0]
        ADDS     R1,R1,#+1
        LDR.N    R2,??testvoid_2  ;; keyscantime
        STRB     R1,[R2, #+0]
//   63     keyscantime++;
        LDR.N    R1,??testvoid_2  ;; keyscantime
        LDRB     R1,[R1, #+0]
        ADDS     R1,R1,#+1
        LDR.N    R2,??testvoid_2  ;; keyscantime
        STRB     R1,[R2, #+0]
//   64     keyscantime++;
        LDR.N    R1,??testvoid_2  ;; keyscantime
        LDRB     R1,[R1, #+0]
        ADDS     R1,R1,#+1
        LDR.N    R2,??testvoid_2  ;; keyscantime
        STRB     R1,[R2, #+0]
//   65     keyscantime++;
        LDR.N    R1,??testvoid_2  ;; keyscantime
        LDRB     R1,[R1, #+0]
        ADDS     R1,R1,#+1
        LDR.N    R2,??testvoid_2  ;; keyscantime
        STRB     R1,[R2, #+0]
//   66     
//   67     keyscantime++;
        LDR.N    R1,??testvoid_2  ;; keyscantime
        LDRB     R1,[R1, #+0]
        ADDS     R1,R1,#+1
        LDR.N    R2,??testvoid_2  ;; keyscantime
        STRB     R1,[R2, #+0]
//   68     keyscantime++;
        LDR.N    R1,??testvoid_2  ;; keyscantime
        LDRB     R1,[R1, #+0]
        ADDS     R1,R1,#+1
        LDR.N    R2,??testvoid_2  ;; keyscantime
        STRB     R1,[R2, #+0]
//   69     keyscantime++;
        LDR.N    R1,??testvoid_2  ;; keyscantime
        LDRB     R1,[R1, #+0]
        ADDS     R1,R1,#+1
        LDR.N    R2,??testvoid_2  ;; keyscantime
        STRB     R1,[R2, #+0]
//   70     keyscantime++;
        LDR.N    R1,??testvoid_2  ;; keyscantime
        LDRB     R1,[R1, #+0]
        ADDS     R1,R1,#+1
        LDR.N    R2,??testvoid_2  ;; keyscantime
        STRB     R1,[R2, #+0]
//   71     keyscantime++;
        LDR.N    R1,??testvoid_2  ;; keyscantime
        LDRB     R1,[R1, #+0]
        ADDS     R1,R1,#+1
        LDR.N    R2,??testvoid_2  ;; keyscantime
        STRB     R1,[R2, #+0]
//   72     keyscantime++;
        LDR.N    R1,??testvoid_2  ;; keyscantime
        LDRB     R1,[R1, #+0]
        ADDS     R1,R1,#+1
        LDR.N    R2,??testvoid_2  ;; keyscantime
        STRB     R1,[R2, #+0]
//   73     keyscantime++;
        LDR.N    R1,??testvoid_2  ;; keyscantime
        LDRB     R1,[R1, #+0]
        ADDS     R1,R1,#+1
        LDR.N    R2,??testvoid_2  ;; keyscantime
        STRB     R1,[R2, #+0]
//   74     keyscantime++;
        LDR.N    R1,??testvoid_2  ;; keyscantime
        LDRB     R1,[R1, #+0]
        ADDS     R1,R1,#+1
        LDR.N    R2,??testvoid_2  ;; keyscantime
        STRB     R1,[R2, #+0]
//   75     keyscantime++;
        LDR.N    R1,??testvoid_2  ;; keyscantime
        LDRB     R1,[R1, #+0]
        ADDS     R1,R1,#+1
        LDR.N    R2,??testvoid_2  ;; keyscantime
        STRB     R1,[R2, #+0]
//   76     keyscantime++;
        LDR.N    R1,??testvoid_2  ;; keyscantime
        LDRB     R1,[R1, #+0]
        ADDS     R1,R1,#+1
        LDR.N    R2,??testvoid_2  ;; keyscantime
        STRB     R1,[R2, #+0]
//   77     
//   78     keyscantime++;
        LDR.N    R1,??testvoid_2  ;; keyscantime
        LDRB     R1,[R1, #+0]
        ADDS     R1,R1,#+1
        LDR.N    R2,??testvoid_2  ;; keyscantime
        STRB     R1,[R2, #+0]
//   79     keyscantime++;
        LDR.N    R1,??testvoid_2  ;; keyscantime
        LDRB     R1,[R1, #+0]
        ADDS     R1,R1,#+1
        LDR.N    R2,??testvoid_2  ;; keyscantime
        STRB     R1,[R2, #+0]
//   80     keyscantime++;
        LDR.N    R1,??testvoid_2  ;; keyscantime
        LDRB     R1,[R1, #+0]
        ADDS     R1,R1,#+1
        LDR.N    R2,??testvoid_2  ;; keyscantime
        STRB     R1,[R2, #+0]
//   81     keyscantime++;
        LDR.N    R1,??testvoid_2  ;; keyscantime
        LDRB     R1,[R1, #+0]
        ADDS     R1,R1,#+1
        LDR.N    R2,??testvoid_2  ;; keyscantime
        STRB     R1,[R2, #+0]
//   82     keyscantime++;
        LDR.N    R1,??testvoid_2  ;; keyscantime
        LDRB     R1,[R1, #+0]
        ADDS     R1,R1,#+1
        LDR.N    R2,??testvoid_2  ;; keyscantime
        STRB     R1,[R2, #+0]
//   83     keyscantime++;
        LDR.N    R1,??testvoid_2  ;; keyscantime
        LDRB     R1,[R1, #+0]
        ADDS     R1,R1,#+1
        LDR.N    R2,??testvoid_2  ;; keyscantime
        STRB     R1,[R2, #+0]
//   84     keyscantime++;
        LDR.N    R1,??testvoid_2  ;; keyscantime
        LDRB     R1,[R1, #+0]
        ADDS     R1,R1,#+1
        LDR.N    R2,??testvoid_2  ;; keyscantime
        STRB     R1,[R2, #+0]
//   85     keyscantime++;
        LDR.N    R1,??testvoid_2  ;; keyscantime
        LDRB     R1,[R1, #+0]
        ADDS     R1,R1,#+1
        LDR.N    R2,??testvoid_2  ;; keyscantime
        STRB     R1,[R2, #+0]
//   86     keyscantime++;
        LDR.N    R1,??testvoid_2  ;; keyscantime
        LDRB     R1,[R1, #+0]
        ADDS     R1,R1,#+1
        LDR.N    R2,??testvoid_2  ;; keyscantime
        STRB     R1,[R2, #+0]
//   87     keyscantime++;
        LDR.N    R1,??testvoid_2  ;; keyscantime
        LDRB     R1,[R1, #+0]
        ADDS     R1,R1,#+1
        LDR.N    R2,??testvoid_2  ;; keyscantime
        STRB     R1,[R2, #+0]
//   88     
//   89     keyscantime++;
        LDR.N    R1,??testvoid_2  ;; keyscantime
        LDRB     R1,[R1, #+0]
        ADDS     R1,R1,#+1
        LDR.N    R2,??testvoid_2  ;; keyscantime
        STRB     R1,[R2, #+0]
//   90     keyscantime++;
        LDR.N    R1,??testvoid_2  ;; keyscantime
        LDRB     R1,[R1, #+0]
        ADDS     R1,R1,#+1
        LDR.N    R2,??testvoid_2  ;; keyscantime
        STRB     R1,[R2, #+0]
//   91     keyscantime++;
        LDR.N    R1,??testvoid_2  ;; keyscantime
        LDRB     R1,[R1, #+0]
        ADDS     R1,R1,#+1
        LDR.N    R2,??testvoid_2  ;; keyscantime
        STRB     R1,[R2, #+0]
//   92     keyscantime++;
        LDR.N    R1,??testvoid_2  ;; keyscantime
        LDRB     R1,[R1, #+0]
        ADDS     R1,R1,#+1
        LDR.N    R2,??testvoid_2  ;; keyscantime
        STRB     R1,[R2, #+0]
//   93     keyscantime++;
        LDR.N    R1,??testvoid_2  ;; keyscantime
        LDRB     R1,[R1, #+0]
        ADDS     R1,R1,#+1
        LDR.N    R2,??testvoid_2  ;; keyscantime
        STRB     R1,[R2, #+0]
//   94     keyscantime++;
        LDR.N    R1,??testvoid_2  ;; keyscantime
        LDRB     R1,[R1, #+0]
        ADDS     R1,R1,#+1
        LDR.N    R2,??testvoid_2  ;; keyscantime
        STRB     R1,[R2, #+0]
//   95     keyscantime++;
        LDR.N    R1,??testvoid_2  ;; keyscantime
        LDRB     R1,[R1, #+0]
        ADDS     R1,R1,#+1
        LDR.N    R2,??testvoid_2  ;; keyscantime
        STRB     R1,[R2, #+0]
//   96     keyscantime++;
        LDR.N    R1,??testvoid_2  ;; keyscantime
        LDRB     R1,[R1, #+0]
        ADDS     R1,R1,#+1
        LDR.N    R2,??testvoid_2  ;; keyscantime
        STRB     R1,[R2, #+0]
//   97     keyscantime++;
        LDR.N    R1,??testvoid_2  ;; keyscantime
        LDRB     R1,[R1, #+0]
        ADDS     R1,R1,#+1
        LDR.N    R2,??testvoid_2  ;; keyscantime
        STRB     R1,[R2, #+0]
//   98     keyscantime++;
        LDR.N    R1,??testvoid_2  ;; keyscantime
        LDRB     R1,[R1, #+0]
        ADDS     R1,R1,#+1
        LDR.N    R2,??testvoid_2  ;; keyscantime
        STRB     R1,[R2, #+0]

使用特权

评论回复
地板
香水城| | 2010-7-9 10:56 | 只看该作者
STM32的Flash接口是64位的,即每读取64位指令需要3个时钟周期(72MHz)。

而Prefetch Buffer有2个64位的缓冲,在CPU从一个Buffer取指令的同时,读取另一个Buffer的数据,减少了CPU等待取指令的时间。你可以根据这个原理,按照每条指令执行的时间,具体地计算一下使用Prefetch Buffer可以节省多少时间。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

18

帖子

1

粉丝