C++ 使用C++;Emulator从RISC-V裸机程序调用printf syscall时失败
我在做一个基于火箭芯片工具的项目。我制作了一个简单的裸金属程序,可以在Spike上很好地工作(即使有多个核…等等) 问题是,当我在C++仿真器中运行时,后者在第一个Prtf调用中停止。 我的问题是:是否可以从C仿真器调用系统调用(比如printf、putchar..)?或者有什么方法可以从模拟中打印出程序的结果,比如提取数据内存之类的?(我很难做到这一点,但我没有找到它将数据变量保存在哪里) PS:该程序基于已经在那里定义的系统调用 是否可以从C调用系统调用(如printf、putchar..) 仿真器 是,这些函数已经在代码库中定义 根据代码库,数据地址由全局外部变量指向,从这个地址您需要读取4个索引的64位数据C++ 使用C++;Emulator从RISC-V裸机程序调用printf syscall时失败,c++,c,riscv,bare-metal,chisel,C++,C,Riscv,Bare Metal,Chisel,我在做一个基于火箭芯片工具的项目。我制作了一个简单的裸金属程序,可以在Spike上很好地工作(即使有多个核…等等) 问题是,当我在C++仿真器中运行时,后者在第一个Prtf调用中停止。 我的问题是:是否可以从C仿真器调用系统调用(比如printf、putchar..)?或者有什么方法可以从模拟中打印出程序的结果,比如提取数据内存之类的?(我很难做到这一点,但我没有找到它将数据变量保存在哪里) PS:该程序基于已经在那里定义的系统调用 是否可以从C调用系统调用(如printf、putchar..)
extern volatile uint64_t tohost;
extern volatile uint64_t fromhost;
使用此系统调用实现的printf(),putchar()
static uintptr_t syscall(uintptr_t which, uint64_t arg0, uint64_t arg1, uint64_t arg2)
{
volatile uint64_t magic_mem[8] __attribute__((aligned(64)));
magic_mem[0] = which;
magic_mem[1] = arg0;
magic_mem[2] = arg1;
magic_mem[3] = arg2;
__sync_synchronize();
tohost = (uintptr_t)magic_mem;
while (fromhost == 0)
;
fromhost = 0;
__sync_synchronize();
return magic_mem[0];
}
什么是C++仿真器?如果C++使用C++语言标记的目的是什么?请不要使用无关的标签。@ VTT C++模拟器是用于模拟软件的CABA(循环精确比特精确)模拟器,考虑到你的个性化硬件。Spple只是一个功能模拟器,它不考虑硬件。@ Gerhardh,因为模拟器是用C++编程的,但是运行在C.上的程序我知道。我在这里举了一个小例子:在模拟器上执行此操作将正确打印hello消息。然后我又做了一个,但是这次它给了我<代码> ********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************有什么想法吗?这里
uint64\t magic\u mem[8]\u\u属性(对齐(64))代码>数组大小为8*8
,因此在208588
cycleI解决此问题后,可能是它的溢出导致失败。我说,如果我把例如printf(“某物”)代码>不带标记\n不能在pk或裸金属的两种情况下打印。我没有调查真正的源代码,但我认为这是因为printf是在系统调用中重新实现的,我没有使用标准的。此外,我猜Spike仍在等待\n打印文本。不管怎么说,它现在起作用了。我想知道的是,如何使用SIP来调试程序,特别是C++仿真器?