![](/img/trans.png)
[英]Whisper simulator for RISC-V: C++ Program either gets caught in infinite loop or get aborted
[英]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.