新唐MCU技术
直播中

哈哈哈

11年用户 963经验值
擅长:可编程逻辑 电源/新能源
私信 关注
[问答]

请问使用 NUC505 时如何将代码放入 SRAM 中执行?

使用 NUC505 时如何将代码放入 SRAM 中执行?

回帖(2)

夏日余晖

2025-8-28 17:02:35
  1. 主要添加:

    /* Relocate vector table in SRAM for fast interrupt handling. */

    {

    #if defined ( __CC_ARM )

    extern uint32_t __Vectors[];

    extern uint32_t __Vectors_Size[];

    extern uint32_t Image$$

    ER_VECTOR2
    ZI$$Base[];

    ```
    printf("Relocate vector table in SRAM (0x%08X) for fast interrupt handling.n", Image$$ER_VECTOR2$$ZI$$Base);
    memcpy((void *) Image$$ER_VECTOR2$$ZI$$Base, (void *) __Vectors, (unsigned int) __Vectors_Size);
    SCB->VTOR = (uint32_t) Image$$ER_VECTOR2$$ZI$$Base;
    ```


#elif defined (ICCARM)

#pragma section = "VECTOR2"

extern uint32_t __Vectors[];

extern uint32_t __Vectors_Size[];


printf("Relocate vector table in SRAM (0xX) for fast interrupt handling.n", __section_begin("VECTOR2"));

memcpy((void *) __section_begin(“VECTOR2”), (void *) __Vectors, (unsigned int) __Vectors_Size);

SCB->VTOR = (uint32_t) __section_begin("VECTOR2");


#endif

}


  1. 添加分散文件,如下图:

示例代码请参考:NUC505BSPV3.01.000SampleCodeBootTemplateMainOnSRAM


  1. 要在调试模式下执行代码,请将初始化文件更改为 SPIROM.ini。


举报

贾小龙

2025-9-3 18:02:42

要在 NUC505 微控制器中将代码放入 SRAM 中执行,需通过以下步骤实现。核心原理是将代码从 Flash 复制到 SRAM 并重定向程序执行,分为局部函数在 SRAM 运行完整代码在 SRAM 运行两种方式:




方法 1:指定函数在 SRAM 执行


1. 修改链接脚本 (LD Script)


.ld 链接脚本中定义 SRAM 区域和专用段(如 .sram_text):


MEMORY {
    FLASH (rx)  : ORIGIN = 0x00000000, LENGTH = 256K
    SRAM (rwx)  : ORIGIN = 0x20000000, LENGTH = 64K   /* SRAM 起始地址 */
}

SECTIONS {
    .sram_text : {
        . = ALIGN(4);
        *(.sram_text)       /* 存放指定到 SRAM 的函数 */
        . = ALIGN(4);
    } > SRAM AT> FLASH      /* 运行时在 SRAM,但存储在 Flash */

    /* 其他标准段(.text, .data 等)保留在 Flash */
}

2. 函数添加段属性


在 C 代码中,用 __attribute__ 将函数放入 .sram_text 段:


void __attribute__((section(".sram_text"))) sram_function(void) {
    // 此函数将在 SRAM 中执行
}

3. 复制代码到 SRAM


在启动文件(如 startup_NUC505.s)或初始化代码中添加复制逻辑:


extern uint32_t _ssram_text;   /* SRAM 段起始地址 */
extern uint32_t _esram_text;   /* SRAM 段结束地址 */
extern uint32_t _lsram_text;   /* Flash 中的加载地址 */

void copy_to_sram(void) {
    uint32_t *src = &_lsram_text;   // Flash 中的源码地址
    uint32_t *dst = &_ssram_text;   // SRAM 中的目标地址
    uint32_t size = (uint32_t)(&_esram_text - &_ssram_text);

    for (uint32_t i = 0; i < size; i++) {
        dst[i] = src[i];            // 逐字复制
    }
}

main() 之前调用 copy_to_sram()(如在 SystemInit() 中)。


4. 关键注意事项



  • 中断处理:若 SRAM 函数涉及中断,复制中断向量表到 SRAM 并设置 VTOR:
    SCB->VTOR = (uint32_t)0x20000000; // 指向 SRAM 中的向量表

  • 位置无关代码(PIC):确保函数编译为 PIC(GCC 使用 -fpic)。

  • 优化:使用 __RAM_FUNC 宏(若 IDE 支持)或手动优化性能。




方法 2:完整代码在 SRAM 执行


若需整个程序在 SRAM 运行:



  1. 修改链接脚本:将所有段(.text.data 等)映射到 SRAM:
    SECTIONS {
       .text : { *(.text*) } > SRAM
       .data : { *(.data*) } > SRAM
       ...
    }

  2. 复制代码:在启动阶段将全部代码从 Flash 复制到 SRAM(参考方法 1 的复制逻辑)。

  3. 跳转到 SRAM:复制后跳转到 SRAM 的入口地址:
    LDR R0, =0x20000000   ; SRAM 起始地址
    BX R0                 ; 跳转到 SRAM 执行

  4. 设置 VTOR:更新向量表到 SRAM:
    SCB->VTOR = 0x20000000;




关键配置



  • SRAM 地址:查阅手册确认 SRAM 起始地址(通常为 0x20000000)。

  • 启动文件:修改启动文件以包含复制操作。

  • 编译器优化:避免绝对地址依赖,使用相对跳转(BL 而非直接地址调用)。




验证步骤



  1. 编译后查看 .map 文件,确认函数地址在 SRAM 范围内(如 0x2000xxxx)。

  2. 使用调试器单步跟踪,验证函数在 SRAM 中执行。

  3. 若使用中断,确认 VTOR 设置正确。


通过以上步骤,可高效利用 NUC505 的 SRAM 运行关键代码,提升实时性能。具体操作需根据您的开发环境(Keil/IAR/GCC)调整细节。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分