This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] EK-TM4C1294XL:RAMFUNC aka 在 RAM 外运行函数比从闪存运行慢

Guru**** 2473260 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/681200/ek-tm4c1294xl-ramfunc-aka-running-functions-out-of-ram-is-slower-than-running-from-flash

器件型号:EK-TM4C1294XL

在大多数 MCU 上、从 RAM 运行函数的速度通常要快得多、但是我创建了一个快速基准测试项目、证明从 RAM 运行相同函数的速度要慢25%左右。  

请参阅以下代码:

"

/********* /
/* MISC_NOP
*
*该函数执行一定数量的 NOP。
***/
/********* /
void MISC_NOP (无符号 int nops)

unsigned int i;

for (i=0;<nops;i++))

NOP();

#pragma CODE_SECTION (MISC_NOP_RAM、".TI.ramfunc");
/********* /
/* MISC_NOP_RAM
*
*该函数执行一定数量的 NOP。
***/
/********* /
void MISC_NOPS_RAM (无符号 int nops)

unsigned int i;

for (i=0;<nops;i++))

NOP();

"

RAM 中的一个需要~13uS、而闪存中的一个需要~10uS。

链接器:

"

存储器

/*存储在内部闪存中并从内部闪存执行的应用程序*/
闪存(RX):origin = APP_BASE,length = 0x00100000
/*应用程序使用内部 RAM 进行数据*/
SRAM (rwx):origin = 0x20000000,length = 0x00030000
SRAM_RAMFUNC (rwx):origin = 0x20030000,length = 0x00010000

/*内存中的段分配*/

部分

.intvecs:> app_base
.text:> FLASH
.const:> FLASH
.cinit:>闪存
.pinit:> FLASH
init_array:> FLASH

.vtable:> RAM_base
.data :> SRAM
.bss:> SRAM
.sysmem:> SRAM
.stack:> SRAM,填充0xAA5555

.TI.ramfunc:{} load = FLASH,
运行= SRAM_RAMFUNC、
Load_start (RamfuncsLoadStart)、
load_size (RamfuncsLoadSize)、
Load_End (RamfuncsLoadEnd)、
RUN_START (RamfuncsRunStart)、
run_size (RamfuncsRunSize)、
RUN_END (RamfuncsRunEnd)、
PAGE = 0、ALIGN (4)

"

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您使用了什么级别的优化? 如果不进行优化、索引"i"存储在系统 RAM 中、每次重新读取。 当从 RAM 执行时、这些读取和写入与操作码的读取相互竞争。 闪存有一个到 CPU 的独立总线接口、所以 RAM 的读取和写入可在闪存读取的同时发生。 这可能会解释您的结果。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我将与供应商的 Bob 非常相似地发表评论-同时注意到以下两点:

    • 建议程序始终使用代码区域(即闪存)、因为 Cortex-M4F 具有可同时执行指令提取和数据访问的独立总线。
    •  如果您"级联 NOP"、而不 是"将它们扣为人质"、那么您的测量结果(而不是您的结果)肯定会发生变化(如此受限/有限)

    由于 ARM 设计已经证明优于(超过其他设计)-"Flash 与 SRAM"的性能-可能证明是一种"优势"-不是一种责任...