硬汉嵌入式论坛

 找回密码
 立即注册
查看: 7769|回复: 6
收起左侧

[有问必答] 为什么V5外扩SRAM这么慢?

[复制链接]

3

主题

14

回帖

23

积分

新手上路

积分
23
发表于 2014-6-8 02:53:26 | 显示全部楼层 |阅读模式
我用V5开发板带的例程测了一下ExtSRAM的速度,发现每秒最多只能写45.5MB的数据。由于FSMC总线宽度是16位,实际ExtSRAM传输数据的频率只达到了22.7MHz,即44 ns写一次。而外扩芯片允许的最小读写时间都是10 ns,为什么速度提不上去呢?
下面是测试代码。


    /*-- FSMC Configuration ------------------------------------------------------*/
    p.FSMC_AddressSetupTime = 2;        /* 设置为1会出错; 2正常 */
    p.FSMC_AddressHoldTime = 0;
    p.FSMC_DataSetupTime = 2;            /* 设置为1出错,2正常 */
    p.FSMC_BusTurnAroundDuration = 0;
    p.FSMC_CLKDivision = 0;
    p.FSMC_DataLatency = 0;
    p.FSMC_AccessMode = FSMC_AccessMode_A;


    // 从CPU写数据到半个ExtSRAM(1MB),耗时22 ms
    iStartTime = bsp_GetRunTime();
    pSRAM = (uint32_t *)EXT_SRAM_ADDR;
    for (i = 0; i < EXT_SRAM_SIZE/4/2; i++)
    {
        *pSRAM++ = i;
    }
    iEndTime = bsp_GetRunTime();
    idTime = iEndTime - iStartTime;

    // DMA复制半个ExtSRAM内容(1MB)到另外半个ExtSRAM,耗时42 ms
    memcpy_32bitDMA(pSRAM, (uint32_t *)EXT_SRAM_ADDR, EXT_SRAM_SIZE / 4 / 2);
    iStartTime = bsp_GetRunTime();
    Wait_DMA_Finish();
    iEndTime = bsp_GetRunTime();
    idTime = iEndTime - iStartTime;
回复

使用道具 举报

747

主题

1049

回帖

3295

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3295
发表于 2014-6-8 11:17:48 | 显示全部楼层
是受到407内部 FSMC的速度限制。sram芯片的速度能力是足够了,有点浪费。

另外,寄存器到SRAM写测试,很大一部分时间消耗在循环变量和地址指针的累加计算上。CPU不可能每个机器周期都访问SRAM,中间需要寄存器运算指令时间。


你可以测试下面这段代码
    for (i = 0; i < EXT_SRAM_SIZE/4; i++)
    {
        *pSRAM = 0;
        *pSRAM = 0;
        *pSRAM = 0;
        *pSRAM = 0;  
    }
回复

使用道具 举报

3

主题

14

回帖

23

积分

新手上路

积分
23
 楼主| 发表于 2014-6-10 18:57:45 | 显示全部楼层

回 armfly 的帖子

armfly:
是受到407内部 FSMC的速度限制。sram芯片的速度能力是足够了,有点浪费。

另外,寄存器到SRAM写测试,很大一部分时间消耗在循环变量和地址指针的累加计算上。CPU不可能每个机器周期都访问SRAM,中间需要寄存器运算指令时间。


.......
// 从CPU写数据到ExtSRAM(8MB),耗时197 ms
for (i = 0; i < EXT_SRAM_SIZE/4; i++)
{
    *pSRAM = 0;
    *pSRAM = 0;
    *pSRAM = 0;
    *pSRAM = 0;  
}

// 如果循环内只保留一个写操作,即写2MB数据到ExtSRAM,耗时44 ms

for (i = 0; i < EXT_SRAM_SIZE/4; i++)
{
    *pSRAM = 0;
}


每个循环写4次比写1次多耗时 197 - 44 * 4 = 21 ms。这能说明什么问题?说明FSMC很慢?
回复

使用道具 举报

3

主题

14

回帖

23

积分

新手上路

积分
23
 楼主| 发表于 2014-6-11 22:05:25 | 显示全部楼层
我测试了一下普通内存的读写,发现也很慢。下面的代码是向CPU内的SRAM写2MB数据,竟然耗时18 ms。查看汇编指令,总共执行了约2100224条指令,也就是说,168MHz Cortex-M4的性能只达到了116.7MIPS。STM32F4号称210 DMIPS,为什么实际效果这么差?如果在SRAM中运行,速度更慢,耗时26 ms,只有80.8 DMIPS。我用Timer测过HCLK,CPU主频确实是168 MHz。下面是测试代码和汇编代码。
=========================== 测试代码 ==========================

    // 从CPU写数据到整个WordBuf(4KB),写512遍(共2MB)    uint32_t WordBuf[1024];
    iStartTime = bsp_GetRunTime();
    for (k=0; k<512; k++)
    {
        pSRAM = WordBuf;
        for (i = 0; i < 1024; i++)
        {
            *pSRAM++ = i;
        }
    }
    iEndTime = bsp_GetRunTime();
    idTime = iEndTime - iStartTime;

=========================== 对应的汇编代码 ==========================
0x20005896 F44F3B80  MOV           r11,#0x10000
   487:         iStartTime = bsp_GetRunTime();
0x2000589A F7FFFC01  BL.W          bsp_GetRunTime (0x200050A0)
0x2000589E 4680      MOV           r8,r0
   488:         for (k=0; k<512; k++)
   489:         {
0x200058A0 F04F0900  MOV           r9,#0x00
0x200058A4 E009      B             0x200058BA
   490:                 pSRAM = WordBuf;
0x200058A6 AD0E      ADD           r5,sp,#0x38                                  <------ 运行 512次
   491:                 for (i = 0; i < 1024; i++)
   492:                 {
0x200058A8 2400      MOVS          r4,#0x00                                     <------ 运行 512次
0x200058AA E001      B             0x200058B0                                   <------ 运行 512次
   493:                         *pSRAM++ = i;   // 26 ms
   494:                 }
   495:         }
0x200058AC C510      STM           r5!,{r4}                                          <------ 运行 524288次
0x200058AE 1C64      ADDS          r4,r4,#1                                        <------ 运行 524288次
0x200058B0 F5B46F80  CMP           r4,#0x400                                 <------ 运行 524288次
0x200058B4 D3FA      BCC           0x200058AC                                 <------ 运行 524288次
0x200058B6 F1090901  ADD           r9,r9,#0x01                                <------ 运行 512次
0x200058BA F5B97F00  CMP           r9,#0x200                                 <------ 运行 512次
0x200058BE D3F2      BCC           0x200058A6                                 <------ 运行 512次
   496:         iEndTime = bsp_GetRunTime();
0x200058C0 F7FFFBEE  BL.W          bsp_GetRunTime (0x200050A0)
0x200058C4 4607      MOV           r7,r0
回复

使用道具 举报

747

主题

1049

回帖

3295

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3295
发表于 2014-6-11 22:39:41 | 显示全部楼层
210DMIP 是从FLASH取指运行的速度指标。你用内存拷贝数据来衡量CPU速度是不正确的。
CPU内部FLASH是多字节同步读取,具有硬件加速机制,等效于无等待执行指令。
而访问内存是需要多条指令组合实现的。

407的FSMC 相比103的FSMC速度快了几倍。
回复

使用道具 举报

116

主题

800

回帖

1148

积分

至尊会员

积分
1148
QQ
发表于 2014-6-12 08:20:19 | 显示全部楼层
这跟你板子布线也有很大关系吧
回复

使用道具 举报

3

主题

14

回帖

23

积分

新手上路

积分
23
 楼主| 发表于 2014-7-18 20:48:43 | 显示全部楼层

回 jcx0324 的帖子

jcx0324:这跟你板子布线也有很大关系吧(2014-06-12 08:20)嬀/color]
不关布线的事儿。你看顶楼程序FSMC的参数就知道了。SRAM芯片的时间参数是10ns,地址和数据设置的稳定时间是2个HCLK,已经到SRAM芯片的理论极限了。所以跟布线无关,是FSMC慢。
    p.FSMC_AddressSetupTime = 2;        /* 设置为1会出错; 2正常 */
    p.FSMC_AddressHoldTime = 0;
    p.FSMC_DataSetupTime = 2;            /* 设置为1出错,2正常 */
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-6-12 23:52 , Processed in 0.310918 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表