You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在启动阶段初始化my_data内存段?

启动阶段清零my_data内存段的实现方案

我在链接脚本中分配了my_data内存段用于存储共享变量,但启动后进行内存转储时发现该区域存在未知值。需要在启动阶段将该区域清零,请问是否需要编写汇编代码实现?

我的链接脚本

MEMORY
{
   my_data : org = 0x52000000, len = 32k
   temp_data : org = 0x52008000, len = 32k
}

SECTIONS
{
    .MydataRAM_noinit (ORIGIN(my_data)): ALIGN(16)
    {
        __MydataRAM_noinit_start__ = .;
        KEEP(*(.test1))
        KEEP(*(.test2))
        __MydataRAM_noinit_end__ = .;
    } > my_data 

    __temp_data_start__ = ORIGIN(temp_data );
    __temp_data_end__ = ORIGIN(temp_data ) + LENGTH(temp_data );
  
}

现有RAM初始化汇编代码

ALIGN(4)
.globl      _sysraminit
.weak       _sysraminit
.type       _sysraminit, _ASM_FUNCTION_
_sysraminit:
    mov         r7, lr
    ldr         r0, =get_cluster_id
    blx         r0
    cmp r0, 0
    bne _exit_sysram /* exit if no cluster 0 */

    ldr         r0, =get_core_id
    blx         r0
    cmp r0, 0
    bne _exit_sysram /* exit if no core 0 */

    ldr         r3, = __temp_data_end__
    ldr         r2, = __temp_data_start__
    bl _clear_sysram    


_exit_sysram:
    bx r7

ALIGN(4)
_clear_sysram:
    cmp         r2, r3
    bne         1f
    bx lr

1:
    mov         r5, 0
    mov         r6, 0
2:
    strd        r5, r6, [r2], 8
    cmp         r2, r3
    bne         2b
    bx lr

解决方案

需要在启动汇编代码中添加对my_data段的清零逻辑,你可以复用现有的_clear_sysram函数,无需重新编写清零逻辑。具体修改步骤如下:

  1. 在_sysraminit函数中,清理完temp_data后,添加清理my_data的代码,利用链接脚本中已定义的__MydataRAM_noinit_start__和__MydataRAM_noinit_end__符号指定内存范围。

修改后的_sysraminit函数如下:

ALIGN(4)
.globl      _sysraminit
.weak       _sysraminit
.type       _sysraminit, _ASM_FUNCTION_
_sysraminit:
    mov         r7, lr
    ldr         r0, =get_cluster_id
    blx         r0
    cmp r0, 0
    bne _exit_sysram /* exit if no cluster 0 */

    ldr         r0, =get_core_id
    blx         r0
    cmp r0, 0
    bne _exit_sysram /* exit if no core 0 */

    ; 清理temp_data区域
    ldr         r3, = __temp_data_end__
    ldr         r2, = __temp_data_start__
    bl _clear_sysram    

    ; 新增:清理my_data区域
    ldr         r3, = __MydataRAM_noinit_end__
    ldr         r2, = __MydataRAM_noinit_start__
    bl _clear_sysram    


_exit_sysram:
    bx r7

说明

  • 现有_clear_sysram函数是通用的内存清零逻辑,只要传入起始地址(r2)和结束地址(r3),就能完成对应区域的清零操作,无需额外编写新的清零代码。
  • 保留了原有的集群0和核心0判断,确保只有主核心执行内存清零操作,避免多核心同时操作共享内存区域引发的竞争问题。

内容的提问来源于stack exchange,提问作者user2986042

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 04:42:07