簡體   English   中英

從RISC-V裸機程序調用printf syscall時,使用C ++模擬器失敗

[英]Using C++ Emulator fails when calling printf syscall from a RISC-V baremetal program

我正在一個基於Rocket-Chip工具的項目中。 我編寫了一個簡單的裸機程序,該程序在Spike上也能很好地工作(即使有多個內核...等等)。

問題是,當我在C ++模擬器中運行它時,后者在第一個printf調用中停止。

我的問題是:是否可以從C仿真器調用syscall(如printf,putchar ..)? 還是有什么方法可以從模擬中打印出程序的結果,例如獲取數據存儲器之類的東西? (我為此苦苦掙扎,但沒有找到將數據變量保存到何處)。

PS:該程序基於riscv-tests / benchmarks ,系統調用已在此處定義。

是否可以從C仿真器調用syscall(如printf,putchar ..)?

是已經定義了這些功能在這里的代碼庫

根據代碼庫,數據地址由全局外部變量指向,您需要從該地址讀取4個64位數據索引

extern volatile uint64_t tohost;
extern volatile uint64_t fromhost;

使用此syscall實現的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];
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM