博客 / 詳情

返回

sbi--Hart 各種操作

image.png
各個狀態流轉的解釋
STARTED :HART 處於正常執行狀態。
轉移到STOP_PENDING狀態:當調用 sbi_hart_stop 之後,當前HART會請求停止。

STOP_PENDING: HART 正在停止過程中。
轉移到 STOPPED狀態: 當HART停止過程完成時。
轉移到 STARTED狀態: 如果停止過程被取消。

STOPPED : HART 完全停止執行,可能被物理上關閉。
轉移到 START_PENDING 狀態: 當另一HART調用 sbi_hart_start 請求啓動該HART。

START_PENDING:HART 正在啓動過程中。
轉移到 STARTED 狀態: 當啓動過程完成時。
轉移到 STOPPED 狀態: 如果啓動失敗或被取消。

SUSPENDED:HART 處於平台特定的低功耗掛起狀態。
轉移到 RESUME_PENDING 狀態: 當有中斷或平台特定硬件事件觸發恢復。

SUSPEND_PENDING:HART 請求從 STARTED 狀態進入掛起狀態。
轉移到 SUSPENDED 狀態: 當掛起過程完成時。
轉移到 STARTED 狀態: 如果掛起過程被取消。

RESUME_PENDING中斷或平台特定事件觸發HART恢復到正常執行狀態。
轉移到 STARTED 狀態: 當恢復過程完成時。


// 啓動HART
fn hart_start(hart_id: usize, start_addr: usize, opaque: usize) -> SbiRet {
    const EXTENSION_HSM: usize = 0x48534D;    // HSM 擴展ID
    const FUNCTION_HART_START: usize = 0;     // 啓動HART的功能ID
    sbi_call(EXTENSION_HSM, FUNCTION_HART_START, hart_id, start_addr, opaque)
}

// 停止HART
fn hart_stop(hart_id: usize) -> SbiRet {
    const EXTENSION_HSM: usize = 0x48534D;    // HSM 擴展ID
    const FUNCTION_HART_STOP: usize = 1;      // 停止HART的功能ID
    sbi_call(EXTENSION_HSM, FUNCTION_HART_STOP, hart_id, 0, 0)
}

// 獲取HART狀態
fn hart_get_status(hart_id: usize) -> SbiRet {
    const EXTENSION_HSM: usize = 0x48534D;    // HSM 擴展ID
    const FUNCTION_HART_GET_STATUS: usize = 2; // 獲取HART狀態的功能ID
    sbi_call(EXTENSION_HSM, FUNCTION_HART_GET_STATUS, hart_id, 0, 0)
}

// 掛起HART
fn hart_suspend(suspend_type: usize, resume_addr: usize, opaque: usize) -> SbiRet {
    const EXTENSION_HSM: usize = 0x48534D;    // HSM 擴展ID
    const FUNCTION_HART_SUSPEND: usize = 3;   // 掛起HART的功能ID
    sbi_call(EXTENSION_HSM, FUNCTION_HART_SUSPEND, suspend_type, resume_addr, opaque)
}

#[no_mangle]
pub extern "C" fn main() -> ! {
    // 獲取當前的Hart ID
    let hart_id = mhartid::read();

    // 示例:啓動HART 1
    let start_addr = 0x80000000; // 假設啓動地址為0x80000000
    let opaque = 0;
    let start_ret = hart_start(1, start_addr, opaque);
    if start_ret.error != 0 {
        // 處理錯誤
        // 這是示例,實際環境應該有相應的錯誤處理邏輯
    }

    // 示例:停止HART 1
    let stop_ret = hart_stop(1);
    if stop_ret.error != 0 {
        // 處理錯誤
    }

    // 示例:獲取HART狀態
    let status_ret = hart_get_status(1);
    if status_ret.error != 0 {
        // 處理錯誤
    } else {
        let status = status_ret.value;
        // 根據狀態進行處理
    }

    // 示例:掛起HART
    let suspend_type = 0; // 掛起類型
    let resume_addr = 0x80000000; // 假設恢復地址為0x80000000
    let suspend_ret = hart_suspend(suspend_type, resume_addr, opaque);
    if suspend_ret.error != 0 {
        // 處理錯誤
    }

    loop {}
}

opaque 參數的作用

  • 傳遞用户數據:opaque 參數可以包含任意用户定義的數據。這些數據可以在被調用的Hart中被取出並用於特定的操作。
  • 上下文信息:可以用來傳遞一些上下文信息,比如某些特定的標誌、指針或其他需要傳遞的元數據。
  • 函數評估:在調試或評估函數時,可以用來傳遞額外的參數以幫助檢查函數行為。
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.