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
相关产品推荐
相关产品推荐

