Compare commits

...

52 Commits

Author SHA1 Message Date
Philipp Oppermann
ca8cd46863 Update 2020-03-22 11:58:16 +01:00
Philipp Oppermann
816f8746fb Implement a ScancodeStream type 2020-03-20 14:14:45 +01:00
Philipp Oppermann
255982a8b7 Implement scancode queue 2020-03-20 13:03:41 +01:00
Philipp Oppermann
f885f17b70 Implement a simple poll-loop executor 2020-03-19 16:46:37 +01:00
Philipp Oppermann
83b67df8af Merge branch 'post-10' into post-11 2020-03-08 14:39:38 +01:00
Philipp Oppermann
02c36bae29 Merge branch 'post-09' into post-10 2020-03-08 14:39:38 +01:00
Philipp Oppermann
70deb3168e Merge branch 'post-08' into post-09 2020-03-08 14:39:38 +01:00
Philipp Oppermann
9d4a960bcb Merge branch 'post-07' into post-08 2020-03-08 14:39:38 +01:00
Philipp Oppermann
564ba9f9ac Merge branch 'post-06' into post-07 2020-03-08 14:39:38 +01:00
Philipp Oppermann
8a4f3ab2a8 Merge branch 'post-05' into post-06 2020-03-08 14:39:37 +01:00
Philipp Oppermann
e402af005b Merge branch 'post-04' into post-05 2020-03-08 14:39:37 +01:00
Philipp Oppermann
d7e505da9e Update x86_64 dependency to version 0.9.6 2020-03-08 14:39:27 +01:00
Philipp Oppermann
714d9cef7d Merge branch 'post-10' into post-11 2020-03-08 14:30:38 +01:00
Philipp Oppermann
7b0d8f05ba Fix code for x86_64 v0.9.5 update 2020-03-08 14:30:33 +01:00
Philipp Oppermann
3735ae51c9 Merge branch 'post-10' into post-11 2020-03-08 14:29:03 +01:00
Philipp Oppermann
f230ee4258 Merge branch 'post-09' into post-10 2020-03-08 14:29:00 +01:00
Philipp Oppermann
a5d409b777 Merge branch 'post-08' into post-09 2020-03-08 14:28:03 +01:00
Philipp Oppermann
33df0bb2a3 Merge branch 'post-07' into post-08 2020-03-08 14:28:03 +01:00
Philipp Oppermann
9a61e1724b Merge branch 'post-06' into post-07 2020-03-08 14:27:58 +01:00
Philipp Oppermann
dbe1353fd2 Merge branch 'post-05' into post-06 2020-03-08 14:27:42 +01:00
Philipp Oppermann
813bc41a74 Merge branch 'post-04' into post-05 2020-03-08 14:27:42 +01:00
Philipp Oppermann
2039cd7a64 Update x86_64 to version 0.9.5 2020-03-08 14:27:36 +01:00
Philipp Oppermann
a430d5ef06 Merge branch 'post-10' into post-11 2020-03-06 11:58:45 +01:00
Philipp Oppermann
39f14b6d0b Merge pull request #763 from phil-opp/post-10-update-linked-list-alloc
Update linked_list_allocator to v0.8.0
2020-03-06 11:58:23 +01:00
Philipp Oppermann
dd1daf2652 Update linked_list_allocator to v0.8.0 2020-03-06 11:47:49 +01:00
Philipp Oppermann
f4331daa25 Merge branch 'post-10' into post-11 2020-02-26 12:48:22 +01:00
Philipp Oppermann
9a415c85b9 Merge branch 'post-09' into post-10 2020-02-26 12:47:51 +01:00
Philipp Oppermann
79a0172ace Merge branch 'post-08' into post-09 2020-02-26 12:47:32 +01:00
Philipp Oppermann
9af6337f67 Merge branch 'post-07' into post-08 2020-02-26 12:47:23 +01:00
Philipp Oppermann
725e03b5c5 Merge branch 'post-06' into post-07 2020-02-26 12:47:07 +01:00
Philipp Oppermann
16afb268f8 Merge branch 'post-05' into post-06 2020-02-26 12:46:19 +01:00
Philipp Oppermann
5ef73aaa30 Merge branch 'post-04' into post-05 2020-02-26 12:46:09 +01:00
Philipp Oppermann
ebb862de2a Run cargo update for post-04 2020-02-26 12:46:04 +01:00
Philipp Oppermann
d588dca953 Merge branch 'post-03' into post-04 2020-02-26 12:45:45 +01:00
Philipp Oppermann
f23269ed93 Merge branch 'post-02' into post-03 2020-02-26 12:45:27 +01:00
Philipp Oppermann
46264d08ca Run cargo update 2020-02-26 12:43:51 +01:00
Philipp Oppermann
921dd54207 Merge branch 'post-10' into post-11 2020-02-26 12:22:10 +01:00
Philipp Oppermann
c7cc718ae3 Merge branch 'post-09' into post-10 2020-02-26 12:22:06 +01:00
Philipp Oppermann
8fc746555d Merge branch 'post-08' into post-09 2020-02-26 12:21:28 +01:00
Philipp Oppermann
9324ea45a5 Merge branch 'post-07' into post-08 2020-02-26 12:21:28 +01:00
Philipp Oppermann
d35ab51629 Merge pull request #756 from RKennedy9064/post-07
Updated pc-keyboard to `0.5.0`
2020-02-26 12:18:13 +01:00
Ryan Kennedy
de509e058f Switched to HandleControl::Ignore 2020-02-25 10:32:39 -06:00
Ryan Kennedy
2a8f499f73 Might help if I use cargo fmt 2020-02-22 19:02:57 -06:00
Ryan Kennedy
2634bb2d37 Updated pc-keyboard to 0.5.0 2020-02-22 18:55:21 -06:00
Philipp Oppermann
3a6d3153a4 Don't panic on overflow in allocator; return null pointer instead (#738) 2020-02-04 09:47:39 +01:00
Philipp Oppermann
9fb6c1d0bd Merge branch 'post-10' into post-11 2020-02-04 09:39:02 +01:00
Philipp Oppermann
5ed04baab0 Update linked_list_allocator dependency 2020-02-04 09:38:52 +01:00
Philipp Oppermann
00fedc801e Use LinkedListAllocator::lock instead of self.inner.lock() 2020-01-30 13:03:34 +01:00
Philipp Oppermann
0f74db4812 Implement align_up using align_offset from Rust's standard library (#723)
Improve `align_up` performance using a bitmask
2020-01-28 10:39:14 +01:00
Philipp Oppermann
93fd330ab9 Use bitmask instead of align_offset 2020-01-28 10:29:53 +01:00
Philipp Oppermann
3ad5f117c2 Use checked addition for allocator implementations (#726) 2020-01-27 13:25:08 +01:00
Philipp Oppermann
d1678f5a96 Implement align_up using align_offset from Rust's standard library 2020-01-22 11:35:29 +01:00
11 changed files with 266 additions and 108 deletions

162
Cargo.lock generated
View File

@@ -1,13 +1,10 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
[[package]]
name = "array-init"
version = "0.0.4"
name = "autocfg"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "23589ecb866b460d3a0f1278834750268c607e8e28a1b982c907219f3178cd72"
dependencies = [
"nodrop",
]
checksum = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d"
[[package]]
name = "bit_field"
@@ -26,6 +23,9 @@ name = "blog_os"
version = "0.1.0"
dependencies = [
"bootloader",
"conquer-once",
"crossbeam-queue",
"futures-util",
"lazy_static",
"linked_list_allocator",
"pc-keyboard",
@@ -33,30 +33,83 @@ dependencies = [
"spin",
"uart_16550",
"volatile",
"x86_64 0.8.1",
"x86_64",
]
[[package]]
name = "bootloader"
version = "0.8.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d596849a47f28abdea62d7a6a25c4f6e69c3d9b09b0a2877db6e9cda004ca993"
version = "0.8.8"
[[package]]
name = "cast"
version = "0.2.3"
name = "cfg-if"
version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4b9434b9a5aa1450faa3f9cb14ea0e8c53bb5d2b3c1bfd1ab4fc03e9f33fbfb0"
checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
[[package]]
name = "conquer-once"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6f7644600a548ecad74e4a918392af1798f7dd045be610be3203b9e129b4f98f"
dependencies = [
"rustc_version",
"conquer-util",
]
[[package]]
name = "conquer-util"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "654fb2472cc369d311c547103a1fa81d467bef370ae7a0680f65939895b1182a"
[[package]]
name = "cpuio"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "22b8e308ccfc5acf3b82f79c0eac444cf6114cb2ac67a230ca6c177210068daa"
[[package]]
name = "crossbeam-queue"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c695eeca1e7173472a32221542ae469b3e9aac3a4fc81f7696bcad82029493db"
dependencies = [
"cfg-if",
"crossbeam-utils",
]
[[package]]
name = "crossbeam-utils"
version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8"
dependencies = [
"autocfg",
"cfg-if",
]
[[package]]
name = "futures-core"
version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f25592f769825e89b92358db00d26f965761e094951ac44d3663ef25b7ac464a"
[[package]]
name = "futures-task"
version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7b0a34e53cf6cdcd0178aa573aed466b646eb3db769570841fda0c7ede375a27"
[[package]]
name = "futures-util"
version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "22766cf25d64306bedf0384da004d05c9974ab104fcc4528f1236181c18004c5"
dependencies = [
"futures-core",
"futures-task",
"pin-utils",
]
[[package]]
name = "lazy_static"
version = "1.4.0"
@@ -68,24 +121,27 @@ dependencies = [
[[package]]
name = "linked_list_allocator"
version = "0.6.4"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "47314ec1d29aa869ee7cb5a5be57be9b1055c56567d59c3fb6689926743e0bea"
checksum = "18c618c431dfe4419afbe22852f6aceffbc17bd82ba0a18b982def291000824c"
dependencies = [
"spin",
"spinning_top",
]
[[package]]
name = "nodrop"
version = "0.1.14"
name = "lock_api"
version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb"
checksum = "79b2de95ecb4691949fea4716ca53cdbcfccb2c612e19644a8bad05edcf9f47b"
dependencies = [
"scopeguard",
]
[[package]]
name = "pc-keyboard"
version = "0.3.1"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fff50ab09ba31bcebc0669f4e64c0952fae1acdca9e6e0587e68e4e8443808ac"
checksum = "c48392db76c4e9a69e0b3be356c5f97ebb7b14413c5e4fd0af4755dbf86e2fce"
[[package]]
name = "pic8259_simple"
@@ -97,28 +153,16 @@ dependencies = [
]
[[package]]
name = "rustc_version"
version = "0.2.3"
name = "pin-utils"
version = "0.1.0-alpha.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"
dependencies = [
"semver",
]
checksum = "5894c618ce612a3fa23881b152b608bafb8c56cfc22f434a3ba3120b40f7b587"
[[package]]
name = "semver"
version = "0.9.0"
name = "scopeguard"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403"
dependencies = [
"semver-parser",
]
[[package]]
name = "semver-parser"
version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
[[package]]
name = "spin"
@@ -127,20 +171,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"
[[package]]
name = "uart_16550"
version = "0.2.1"
name = "spinning_top"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "803ea8cb602dbb32c1a657a866d2dd79fe7dbeab0fb2ac667cb4dcc7de12a58b"
checksum = "32d801a3a53bcf5071f85fef8d5cab9e5f638fc5580a37e6eb7aba4b37438d24"
dependencies = [
"bitflags",
"x86_64 0.7.7",
"lock_api",
]
[[package]]
name = "ux"
version = "0.1.3"
name = "uart_16550"
version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "88dfeb711b61ce620c0cb6fd9f8e3e678622f0c971da2a63c4b3e25e88ed012f"
checksum = "d44b0f30cb82b0fbc15b78ade1064226529ad52028bc8cb8accb98ff6f3d7131"
dependencies = [
"bitflags",
"x86_64",
]
[[package]]
name = "volatile"
@@ -150,25 +197,10 @@ checksum = "6af0edf5b4faacc31fc51159244d78d65ec580f021afcef7bd53c04aeabc7f29"
[[package]]
name = "x86_64"
version = "0.7.7"
version = "0.9.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1f27d9168654aee1b0c1b73746caeb4aa33248f8b8c8f6e100e697fcc2a794b2"
checksum = "4206b60c9f99766329b66962aa8ddc01df6c7edd02edc046b7a69d5df9fcdbcf"
dependencies = [
"array-init",
"bit_field",
"bitflags",
"cast",
"ux",
]
[[package]]
name = "x86_64"
version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f21672dcbed52bc09eea030d189600c0189c66c97bc5b31779eb780e064a201f"
dependencies = [
"array-init",
"bit_field",
"bitflags",
"cast",
]

View File

@@ -16,16 +16,29 @@ harness = false
bootloader = { version = "0.8.0", features = ["map_physical_memory"]}
volatile = "0.2.6"
spin = "0.5.2"
x86_64 = "0.8.1"
x86_64 = "0.9.6"
uart_16550 = "0.2.0"
pic8259_simple = "0.1.1"
pc-keyboard = "0.3.1"
linked_list_allocator = "0.6.4"
pc-keyboard = "0.5.0"
linked_list_allocator = "0.8.0"
[dependencies.lazy_static]
version = "1.0"
features = ["spin_no_std"]
[dependencies.crossbeam-queue]
version = "0.2.1"
default-features = false
features = ["alloc"]
[dependencies.conquer-once]
version = "0.2.0"
default-features = false
[dependencies.futures-util]
version = "0.3.4"
default-features = false
features = ["alloc", "async-await"]
[package.metadata.bootimage]
test-args = [

View File

@@ -21,7 +21,7 @@ static ALLOCATOR: Locked<FixedSizeBlockAllocator> = Locked::new(FixedSizeBlockAl
pub fn init_heap(
mapper: &mut impl Mapper<Size4KiB>,
frame_allocator: &mut impl FrameAllocator<Size4KiB>,
) -> Result<(), MapToError> {
) -> Result<(), MapToError<Size4KiB>> {
let page_range = {
let heap_start = VirtAddr::new(HEAP_START as u64);
let heap_end = heap_start + HEAP_SIZE - 1u64;
@@ -74,11 +74,9 @@ impl<A> Locked<A> {
}
}
/// Align the given address `addr` upwards to alignment `align`.
///
/// Requires that `align` is a power of two.
fn align_up(addr: usize, align: usize) -> usize {
let remainder = addr % align;
if remainder == 0 {
addr // addr already aligned
} else {
addr - remainder + align
}
(addr + align - 1) & !(align - 1)
}

View File

@@ -26,7 +26,7 @@ impl BumpAllocator {
/// memory range is unused. Also, this method must be called only once.
pub unsafe fn init(&mut self, heap_start: usize, heap_size: usize) {
self.heap_start = heap_start;
self.heap_end = heap_start + heap_size;
self.heap_end = heap_start.saturating_add(heap_size);
self.next = heap_start;
}
}
@@ -36,7 +36,10 @@ unsafe impl GlobalAlloc for Locked<BumpAllocator> {
let mut bump = self.lock(); // get a mutable reference
let alloc_start = align_up(bump.next, layout.align());
let alloc_end = alloc_start + layout.size();
let alloc_end = match alloc_start.checked_add(layout.size()) {
Some(end) => end,
None => return ptr::null_mut(),
};
if alloc_end > bump.heap_end {
ptr::null_mut() // out of memory

View File

@@ -86,7 +86,7 @@ impl LinkedListAllocator {
/// Returns the allocation start address on success.
fn alloc_from_region(region: &ListNode, size: usize, align: usize) -> Result<usize, ()> {
let alloc_start = align_up(region.start_addr(), align);
let alloc_end = alloc_start + size;
let alloc_end = alloc_start.checked_add(size).ok_or(())?;
if alloc_end > region.end_addr() {
// region too small
@@ -122,10 +122,10 @@ unsafe impl GlobalAlloc for Locked<LinkedListAllocator> {
unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
// perform layout adjustments
let (size, align) = LinkedListAllocator::size_align(layout);
let mut allocator = self.inner.lock();
let mut allocator = self.lock();
if let Some((region, alloc_start)) = allocator.find_region(size, align) {
let alloc_end = alloc_start + size;
let alloc_end = alloc_start.checked_add(size).expect("overflow");
let excess_size = region.end_addr() - alloc_end;
if excess_size > 0 {
allocator.add_free_region(alloc_end, excess_size);
@@ -140,6 +140,6 @@ unsafe impl GlobalAlloc for Locked<LinkedListAllocator> {
// perform layout adjustments
let (size, _) = LinkedListAllocator::size_align(layout);
self.inner.lock().add_free_region(ptr as usize, size)
self.lock().add_free_region(ptr as usize, size)
}
}

View File

@@ -80,13 +80,14 @@ extern "x86-interrupt" fn timer_interrupt_handler(_stack_frame: &mut InterruptSt
}
extern "x86-interrupt" fn keyboard_interrupt_handler(_stack_frame: &mut InterruptStackFrame) {
use pc_keyboard::{layouts, DecodedKey, Keyboard, ScancodeSet1};
use pc_keyboard::{layouts, DecodedKey, HandleControl, Keyboard, ScancodeSet1};
use spin::Mutex;
use x86_64::instructions::port::Port;
lazy_static! {
static ref KEYBOARD: Mutex<Keyboard<layouts::Us104Key, ScancodeSet1>> =
Mutex::new(Keyboard::new(layouts::Us104Key, ScancodeSet1));
static ref KEYBOARD: Mutex<Keyboard<layouts::Us104Key, ScancodeSet1>> = Mutex::new(
Keyboard::new(layouts::Us104Key, ScancodeSet1, HandleControl::Ignore)
);
}
let mut keyboard = KEYBOARD.lock();

View File

@@ -6,6 +6,8 @@
#![feature(const_fn)]
#![feature(alloc_layout_extra)]
#![feature(const_in_array_repeat_expressions)]
#![feature(wake_trait)]
#![feature(async_closure)]
#![test_runner(crate::test_runner)]
#![reexport_test_harness_main = "test_main"]
@@ -18,6 +20,7 @@ pub mod gdt;
pub mod interrupts;
pub mod memory;
pub mod serial;
pub mod task;
pub mod vga_buffer;
pub fn init() {

View File

@@ -6,7 +6,6 @@
extern crate alloc;
use alloc::{boxed::Box, rc::Rc, vec, vec::Vec};
use blog_os::println;
use bootloader::{entry_point, BootInfo};
use core::panic::PanicInfo;
@@ -16,6 +15,7 @@ entry_point!(kernel_main);
fn kernel_main(boot_info: &'static BootInfo) -> ! {
use blog_os::allocator;
use blog_os::memory::{self, BootInfoFrameAllocator};
use blog_os::task::{simple_executor::SimpleExecutor, Task, keyboard};
use x86_64::VirtAddr;
println!("Hello World{}", "!");
@@ -27,29 +27,10 @@ fn kernel_main(boot_info: &'static BootInfo) -> ! {
allocator::init_heap(&mut mapper, &mut frame_allocator).expect("heap initialization failed");
// allocate a number on the heap
let heap_value = Box::new(41);
println!("heap_value at {:p}", heap_value);
// create a dynamically sized vector
let mut vec = Vec::new();
for i in 0..500 {
vec.push(i);
}
println!("vec at {:p}", vec.as_slice());
// create a reference counted vector -> will be freed when count reaches 0
let reference_counted = Rc::new(vec![1, 2, 3]);
let cloned_reference = reference_counted.clone();
println!(
"current reference count is {}",
Rc::strong_count(&cloned_reference)
);
core::mem::drop(reference_counted);
println!(
"reference count is {} now",
Rc::strong_count(&cloned_reference)
);
let mut executor = SimpleExecutor::new();
executor.spawn(Task::new(example_task()));
executor.spawn(Task::new(keyboard::print_keypresses()));
executor.run();
#[cfg(test)]
test_main();
@@ -58,6 +39,15 @@ fn kernel_main(boot_info: &'static BootInfo) -> ! {
blog_os::hlt_loop();
}
async fn async_number() -> u32 {
42
}
async fn example_task() {
let number = async_number().await;
println!("async number: {}", number);
}
/// This function is called on panic.
#[cfg(not(test))]
#[panic_handler]

52
src/task/keyboard.rs Normal file
View File

@@ -0,0 +1,52 @@
use conquer_once::spin::OnceCell;
use crossbeam_queue::ArrayQueue;
use futures_util::stream::{Stream, StreamExt};
use core::{pin::Pin, task::{Context, Poll}};
use pc_keyboard::{layouts, DecodedKey, HandleControl, Keyboard, ScancodeSet1};
use crate::print;
static SCANCODE_QUEUE: OnceCell<ArrayQueue<u8>> = OnceCell::uninit();
pub struct ScancodeStream {
_private: (),
}
impl ScancodeStream {
pub fn new() -> Self {
SCANCODE_QUEUE.try_init_once(|| ArrayQueue::new(100))
.expect("ScancodeStream::new should only be called once");
ScancodeStream {
_private: (),
}
}
}
impl Stream for ScancodeStream {
type Item = u8;
fn poll_next(self: Pin<&mut Self>, context: &mut Context) -> Poll<Option<u8>> {
let queue = SCANCODE_QUEUE
.try_get()
.expect("scancode queue not initialized");
match queue.pop() {
Ok(scancode) => Poll::Ready(Some(scancode)),
Err(crossbeam_queue::PopError) => Poll::Pending,
}
}
}
pub async fn print_keypresses() {
let mut scancodes = ScancodeStream::new();
let mut keyboard = Keyboard::new(layouts::Us104Key, ScancodeSet1, HandleControl::Ignore);
while let Some(scancode) = scancodes.next().await {
if let Ok(Some(key_event)) = keyboard.add_byte(scancode) {
if let Some(key) = keyboard.process_keyevent(key_event) {
match key {
DecodedKey::Unicode(character) => print!("{}", character),
DecodedKey::RawKey(key) => print!("{:?}", key),
}
}
}
}
}

22
src/task/mod.rs Normal file
View File

@@ -0,0 +1,22 @@
use alloc::boxed::Box;
use core::task::{Context, Poll};
use core::{future::Future, pin::Pin};
pub mod keyboard;
pub mod simple_executor;
pub struct Task {
future: Pin<Box<dyn Future<Output = ()>>>,
}
impl Task {
pub fn new(future: impl Future<Output = ()> + 'static) -> Task {
Task {
future: Box::pin(future),
}
}
fn poll(&mut self, context: &mut Context) -> Poll<()> {
self.future.as_mut().poll(context)
}
}

View File

@@ -0,0 +1,44 @@
use super::Task;
use alloc::{collections::VecDeque, sync::Arc, task::Wake};
use core::task::{Context, Poll, Waker};
pub struct SimpleExecutor {
task_queue: VecDeque<Task>,
}
impl SimpleExecutor {
pub fn new() -> SimpleExecutor {
SimpleExecutor {
task_queue: VecDeque::new(),
}
}
pub fn spawn(&mut self, task: Task) {
self.task_queue.push_back(task)
}
pub fn run(&mut self) {
while let Some(mut task) = self.task_queue.pop_front() {
let waker = DummyWaker.to_waker();
let mut context = Context::from_waker(&waker);
match task.poll(&mut context) {
Poll::Ready(()) => {} // task done
Poll::Pending => self.task_queue.push_back(task),
}
}
}
}
struct DummyWaker;
impl Wake for DummyWaker {
fn wake(self: Arc<Self>) {
// do nothing
}
}
impl DummyWaker {
fn to_waker(self) -> Waker {
Waker::from(Arc::new(self))
}
}