Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用C++;Emulator从RISC-V裸机程序调用printf syscall时失败_C++_C_Riscv_Bare Metal_Chisel - Fatal编程技术网

C++ 使用C++;Emulator从RISC-V裸机程序调用printf syscall时失败

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..)

我在做一个基于火箭芯片工具的项目。我制作了一个简单的裸金属程序,可以在Spike上很好地工作(即使有多个核…等等)

问题是,当我在C++仿真器中运行时,后者在第一个Prtf调用中停止。 我的问题是:是否可以从C仿真器调用系统调用(比如printf、putchar..)?或者有什么方法可以从模拟中打印出程序的结果,比如提取数据内存之类的?(我很难做到这一点,但我没有找到它将数据变量保存在哪里)

PS:该程序基于已经在那里定义的系统调用

是否可以从C调用系统调用(如printf、putchar..) 仿真器

是,这些函数已经在代码库中定义

根据代码库,数据地址由全局外部变量指向,从这个地址您需要读取4个索引的64位数据

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++仿真器?