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中被取出并用于特定的操作。
  • 上下文信息:可以用来传递一些上下文信息,比如某些特定的标志、指针或其他需要传递的元数据。
  • 函数评估:在调试或评估函数时,可以用来传递额外的参数以帮助检查函数行为。

putao
8 声望1 粉丝

推动世界向前发展,改善民生。