Step 3: time_used

This commit is contained in:
Jack Halford 2019-12-15 11:14:10 +01:00
parent ec7ee599a1
commit 27e6f2684b
5 changed files with 25 additions and 33 deletions

View file

@ -15,7 +15,6 @@ fn execute(input: []u8) void {
if (eql(u8, input, "tasks")) return task.introspect();
if (eql(u8, input, "lspci")) return pci.lspci();
if (eql(u8, input, "uptime")) return time.uptime();
if (eql(u8, input, "topbar")) return topbar();
println("{}: command not found", input);
}

View file

@ -26,9 +26,7 @@ export fn kmain(magic: u32, info: *const multiboot.MultibootInfo) noreturn {
pci.scan();
task.new(@ptrToInt(topbar)) catch unreachable;
// task.new(@ptrToInt(console.loop)) catch unreachable;
task.new(@ptrToInt(console.loop)) catch unreachable;
// task.schedule();
console.loop();
while (true) asm volatile ("hlt");
while (true) task.schedule();
}

View file

@ -1,5 +1,6 @@
pub usingnamespace @import("index.zig");
var timer_last_count: u64 = 0;
var boot_task = Task{ .tid = 0, .esp = 0x47 };
const ListOfTasks = std.TailQueue(*Task);
var first_task = ListOfTasks.Node.init(&boot_task);
@ -16,9 +17,17 @@ var tid_counter: u16 = 1;
///ASM
extern fn switch_tasks(new_esp: u32, old_esp_addr: u32) void;
pub fn update_time_used() void {
const current_count = time.offset_us;
const elapsed = current_count - timer_last_count;
timer_last_count = current_count;
current_task.data.time_used += elapsed;
}
pub const Task = packed struct {
esp: usize,
tid: u16,
time_used: u64 = 0,
//context: isr.Context,
//cr3: usize,
@ -26,6 +35,7 @@ pub const Task = packed struct {
// Allocate and initialize the thread structure.
var t = try vmem.create(Task);
t.time_used = 0;
t.tid = tid_counter;
tid_counter +%= 1;
assert(tid_counter != 0); //overflow
@ -49,15 +59,9 @@ pub const Task = packed struct {
};
pub fn new(entrypoint: usize) !void {
// println("currently: {}", current_task.data.tid);
// println("first: {}", tasks.first.?.data.tid);
// println("last: {}", tasks.last.?.data.tid);
const node = try vmem.create(ListOfTasks.Node);
node.data = try Task.create(entrypoint);
tasks.append(node);
// println("currently: {}", current_task.data.tid);
// println("first: {}", tasks.first.?.data.tid);
// println("last: {}", tasks.last.?.data.tid);
}
pub fn switch_to(new_task: *ListOfTasks.Node) void {
@ -72,26 +76,18 @@ pub fn switch_to(new_task: *ListOfTasks.Node) void {
}
pub fn schedule() void {
// println("currently: {}", current_task.data.tid);
// println("first: {}", tasks.first.?.data.tid);
// println("last: {}", tasks.last.?.data.tid);
update_time_used();
if (current_task.next) |next| {
// println("switching to {}", next.data.tid);
switch_to(next);
} else if (tasks.first) |head| {
// println("switching to {}", head.data.tid);
if (head.data != current_task.data) switch_to(head);
} else {
introspect();
}
// if (current_task.data.tid == 0) switch_to(tasks.last.?.*);
// if (current_task.data.tid == 1) switch_to(tasks.first.?.*);
// if (current_task.tid == 2) tasks[0].?.switch_to();
}
pub fn introspect() void {
var it = tasks.first;
println("{} tasks", tasks.len);
update_time_used();
while (it) |node| : (it = node.next) {
if (node.data != current_task.data) println("{}", node.data);
if (node.data == current_task.data) println("*{}", node.data);

View file

@ -1,14 +1,13 @@
usingnamespace @import("index.zig");
pub var offset_s: u32 = 0;
pub var offset_us: u32 = 0;
pub var offset_us: u64 = 0;
pub fn increment(value: u32) void {
const sum = offset_us + value;
offset_s += sum / 1000000;
offset_us = sum % 1000000;
offset_us += value;
}
pub fn uptime() void {
const offset_ms = offset_us / 1000;
var offset_ms: u64 = offset_us / 1000;
const offset_s: u64 = offset_ms / 1000;
offset_ms = @mod(offset_ms, 1000);
println("{}.{:.3}", offset_s, offset_ms);
}

View file

@ -68,9 +68,11 @@ pub fn topbar() void {
const cursor = vga.cursor;
vga.cursor = 0;
vga.background = Color.Red;
vga.cursor_enabled = false;
time.uptime();
vga.cursor_enabled = true;
vga.cursor = cursor;
vga.background = bg;
task.schedule();
@ -85,6 +87,7 @@ fn printCallback(context: void, string: []const u8) Errors!void {
const VGA = struct {
vram: []VGAEntry,
cursor: usize,
cursor_enabled: bool = true,
foreground: Color,
background: Color,
@ -132,7 +135,7 @@ const VGA = struct {
self.cursor += 1;
},
}
self.updateCursor();
if (self.cursor_enabled) self.updateCursor();
}
////
@ -142,11 +145,8 @@ const VGA = struct {
// string: String to be printed.
//
pub fn writeString(self: *VGA, string: []const u8) void {
for (string) |char| {
self.writeChar(char);
}
self.updateCursor();
for (string) |char| self.writeChar(char);
if (self.cursor_enabled) self.updateCursor();
}
////