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

RISC-V裸机仿真中增大.rodata数组尺寸导致DMA触发阶段程序挂起的问题求助

RISC-V裸机仿真中增大.rodata数组尺寸导致DMA触发阶段程序挂起的问题求助

大家好,我现在在做RISC-V裸机仿真的DMA测试,遇到了一个非常奇怪的问题:当要写入内存的数据数组尺寸较小时(比如约2000个64位字),程序能正常执行,DMA也能被正确触发并完成;但当数组增大到约8000个64位字时,程序直接挂起,甚至连main函数开头的printf("[CORE] Start Testing!\n");都没有输出,完全没反应。

测试场景说明

我需要把一个静态常量64位数组写入到内存的0x88000000地址处(仿真的DRAM总大小为256MiB),写完后通过MMIO寄存器配置并触发DMA单元,最后等待DMA完成操作。

数据数组示例

我的数据数组定义如下(省略了后续大量重复/相似元素):

static const unsigned long long data[] = {
    0x00000000FFFFFFFFULL,
    0x0000000000000000ULL,
    0xF4B4F4FCF48CF84EULL,
    0xF47EF47DF47DF47EULL,
    0xF481F47DF483F48BULL,
    0xF47FF47DF47EF480ULL,
    0xF499F47DF47DF47EULL,
    ...
};

完整测试代码

#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <math.h>
#include "mmio.h"  // 用于安全MMIO访问的工具头文件
#include "data.h"   // 包含上述data数组的定义

// MMIO寄存器基地址与偏移定义
#define MMIO_TRIGGER_REG      0x4000UL
#define MMIO_COUNT_REG        0x4004UL
#define MMIO_NUM_EVENTS_REG   0x4008UL
#define MMIO_DONE_REG         0x400CUL
#define BASE_ADDR             ((volatile uint64_t *)0x88000000)

int main() {
    printf("[CORE] Start Testing!\n");

    // 将数据写入目标内存地址
    const int data_len = sizeof(data) / sizeof(int64_t);
    __asm__ volatile ("fence");
    for (int i = 0; i < data_len; i++) {
        BASE_ADDR[i] = data[i];
    }
    __asm__ volatile("fence":::"memory");
    printf("[CORE] wrote all %d values memory.\n", data_len);

    // 配置DMA寄存器
    __asm__ volatile ("fence");
    reg_write32(MMIO_COUNT_REG, data_len / 2);
    reg_write32(MMIO_NUM_EVENTS_REG, data_len);
    // 触发DMA操作
    reg_write8(MMIO_TRIGGER_REG, 1);
    __asm__ volatile("fence":::"memory");

    // 循环等待DMA完成
    while (reg_read8(MMIO_DONE_REG) == 0) {}

    return 0;
}

我的排查思路与疑问

我已经确认MMIO寄存器的地址定义、目标内存地址范围都是正确的:8000个64位字仅占64KB,写入0x88000000后结束地址为0x8800FA00,远在256MiB的DRAM范围内,不存在越界问题。

现在完全搞不懂为什么数组尺寸变大后程序直接挂起,连开头的打印都无法输出。会不会是数组过大导致链接时的内存布局异常?或者是裸机环境下的栈空间不足?还是数据存储在.rodata段时超出了某个限制?

如果需要,我可以提供链接脚本或其他相关文件,麻烦各位帮忙分析下可能的原因,非常感谢!

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 08:38:02