【问题标题】:How do i set up data memory address when using "riscv32/64-unknown-elf-gcc"?使用“riscv32/64-unknown-elf-gcc”时如何设置数据内存地址?
【发布时间】:2021-11-01 02:13:18
【问题描述】:

我设计了 RISCV32IM 处理器,并使用“riscv32/64-unknown-elf-gcc”生成测试代码。 指令内存设置已通过以下选项(-Ttext 选项)解决,但数据内存设置尚未解决。

riscv64-unknown-elf-gcc -v -march=rv32im -mabi=ilp32 -nostartfiles -x c  -Ttext 40000000 -o main.o main.c

能否知道是否可以设置我想要的数据内存地址?

【问题讨论】:

    标签: gcc riscv


    【解决方案1】:

    看起来你需要链接linker script,比如:

    OUTPUT_ARCH( "riscv" )
    ENTRY(_start)
    
    SECTIONS
    {
      . = 0x40000000;
      .text.init : { *(.text.init) }
      . = ALIGN(0x1000);
      .text : { *(.text) }
      . = ALIGN(0x1000);
      .data : { *(.data) }
      .bss : { *(.bss) }
      _end = .;
    }
    
    • _start 是起始符号,0x40000000 是内存起始地址, 后跟以 0x1000 对齐的部分名称。
    • text这是程序本身
    • data 是静态初始化变量
    • bss 是静态分配的变量

    【讨论】:

    • 感谢您的帮助!我使用下面的命令解决了这个问题。 “riscv64-unknown-elf-gcc -v -march=rv32im -mabi=ilp32 -nostartfiles -x c -Ttext 40000000 -Tdata 50000000 -Tbss 60000000 -o main.o main.c”
    • 我还有一个问题。使用 malloc() 函数编译时会生成大量代码。 riscv32im 处理器(我设计的)在没有操作系统的情况下工作,应该在内存非常小的环境中运行。是否可以使用 malloc() 函数生成仅访问分配的数据内存的代码? "*(volatile unsigned int *) 0xf10007fc = (int) 0x4;"我希望有一种方法可以避免一遍又一遍地使用这种代码。
    • 我建议您使用链接器文件,它更简单,但当然可以随心所欲。如果你的代码很小,你可能不会使用 malloc / free,但你必须清楚你的内存大小限制!在这种情况下,您可以直接读/写内存地址。当程序很少并且其中有很多循环时,我总是这样做。甚至使用汇编语言。
    • 谢谢你的回答!!我还使用了 malloc() 和 free() 函数。使用这些函数的编译结果的一部分汇编代码如下。 malloc()、free() 和 malloc_r() 函数被创建为代码。我想获得与直接访问内存的代码相同的结果。 "400000c4 :" "400000d0 :" "400000dc <_malloc_r>:"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-31
    • 2021-01-05
    • 1970-01-01
    相关资源
    最近更新 更多