lab 03
This commit is contained in:
parent
5ab1ca507c
commit
8b2f8bf2a3
9 changed files with 140 additions and 23 deletions
|
@ -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
|
||||
}
|
||||
|
|
16
user/src/bin/04taskinfo.rs
Normal file
16
user/src/bin/04taskinfo.rs
Normal 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
|
||||
}
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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])
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue