lab 03
Some checks failed
Build Rust Doc And Run tests / build-doc (push) Has been cancelled
Build Rust Doc And Run tests / run-tests (push) Has been cancelled

This commit is contained in:
Tateisi 2025-08-03 11:54:14 +08:00
parent 5ab1ca507c
commit 8b2f8bf2a3
9 changed files with 140 additions and 23 deletions

View file

@ -1,28 +1,16 @@
#![no_std]
#![no_main]
#[macro_use]
extern crate user_lib;
const LEN: usize = 100;
use user_lib::{
println, task_info, TaskInfo,
};
#[no_mangle]
fn main() -> i32 {
let p = 3u64;
let m = 998244353u64;
let iter: usize = 200000;
let mut s = [0u64; LEN];
let mut cur = 0usize;
s[cur] = 1;
for i in 1..=iter {
let next = if cur + 1 == LEN { 0 } else { cur + 1 };
s[next] = s[cur] * p % m;
cur = next;
if i % 10000 == 0 {
println!("power_3 [{}/{}]", i, iter);
}
}
println!("{}^{} = {}(MOD {})", p, iter, s[cur], m);
println!("Test power_3 OK!");
pub fn main() -> usize {
let info = TaskInfo::new();
assert_eq!(0, task_info(&info));
println!("task_info {:?}", info);
0
}

View file

@ -0,0 +1,16 @@
#![no_std]
#![no_main]
extern crate user_lib;
use user_lib::{
println, task_info, TaskInfo,
};
#[no_mangle]
pub fn main() -> usize {
let info = TaskInfo::new();
assert_eq!(0, task_info(&info));
println!("task_info {:?}", info);
0
}

View file

@ -45,3 +45,35 @@ pub fn yield_() -> isize {
pub fn get_time() -> isize {
sys_get_time()
}
#[derive(Copy, Clone, PartialEq, Debug)]
pub enum TaskStatus {
UnInit,
Ready,
Running,
Exited,
}
const MAX_SYSCALL_NUM: usize = 500;
#[derive(Debug)]
pub struct TaskInfo {
pub status: TaskStatus,
pub syscall_times: [u32; MAX_SYSCALL_NUM],
pub time: usize,
}
impl TaskInfo {
pub fn new() -> Self {
TaskInfo {
status: TaskStatus::UnInit,
syscall_times: [0; MAX_SYSCALL_NUM],
time: 0,
}
}
}
pub fn task_info(info: &TaskInfo) -> isize {
sys_task_info(info)
}

View file

@ -1,9 +1,12 @@
use core::arch::asm;
use crate::TaskInfo;
const SYSCALL_WRITE: usize = 64;
const SYSCALL_EXIT: usize = 93;
const SYSCALL_YIELD: usize = 124;
const SYSCALL_GET_TIME: usize = 169;
pub const SYSCALL_TASK_INFO: usize = 410;
fn syscall(id: usize, args: [usize; 3]) -> isize {
let mut ret: isize;
@ -34,3 +37,7 @@ pub fn sys_yield() -> isize {
pub fn sys_get_time() -> isize {
syscall(SYSCALL_GET_TIME, [0, 0, 0])
}
pub fn sys_task_info(info: &TaskInfo) -> isize {
syscall(SYSCALL_TASK_INFO, [info as *const _ as usize, 0, 0])
}