#![cfg(feature = "baremetal")]
use super::Platform;
use super::{FileHandle, FileMode, FileResult, SeekWhence};
pub struct BareMetalPlatform;
impl Platform for BareMetalPlatform {
fn get_timestamp(&self) -> u64 {
static mut COUNTER: u64 = 0;
unsafe {
COUNTER += 1;
COUNTER
}
}
fn get_timestamp_us(&self) -> u64 {
static mut COUNTER_US: u64 = 0;
unsafe {
COUNTER_US += 1;
COUNTER_US
}
}
fn spin_lock(&self, lock: &mut u32) {
while unsafe {
core::sync::atomic::AtomicU32::from_ptr(lock as *mut u32)
.compare_exchange(
0,
1,
core::sync::atomic::Ordering::Acquire,
core::sync::atomic::Ordering::Relaxed,
)
.is_err()
} {
core::hint::spin_loop();
}
}
fn spin_unlock(&self, lock: &mut u32) {
unsafe {
core::sync::atomic::AtomicU32::from_ptr(lock as *mut u32)
.store(0, core::sync::atomic::Ordering::Release);
}
}
fn compiler_barrier(&self) {
core::sync::atomic::compiler_fence(core::sync::atomic::Ordering::SeqCst);
}
fn full_memory_barrier(&self) {
core::sync::atomic::fence(core::sync::atomic::Ordering::SeqCst);
}
fn memcpy(&self, dest: *mut u8, src: *const u8, size: usize) {
unsafe {
let mut i = 0;
while i < size {
*dest.add(i) = *src.add(i);
i += 1;
}
}
}
fn memset(&self, dest: *mut u8, value: u8, size: usize) {
unsafe {
let mut i = 0;
while i < size {
*dest.add(i) = value;
i += 1;
}
}
}
fn delay_ms(&self, ms: u32) {
let delay_cycles = ms as u32 * 1000;
unsafe {
let mut i = 0;
while i < delay_cycles {
core::hint::spin_loop();
i += 1;
}
}
}
fn delay_us(&self, us: u32) {
let delay_cycles = us;
unsafe {
let mut i = 0;
while i < delay_cycles {
core::hint::spin_loop();
i += 1;
}
}
}
fn file_open(&self, _path: &str, _mode: FileMode) -> FileResult<FileHandle> {
Err(())
}
fn file_close(&self, _handle: FileHandle) -> FileResult<()> {
Err(())
}
fn file_write(
&self,
_handle: FileHandle,
_buffer: *const u8,
_size: usize,
) -> FileResult<usize> {
Err(())
}
fn file_read(&self, _handle: FileHandle, _buffer: *mut u8, _size: usize) -> FileResult<usize> {
Err(())
}
fn file_seek(&self, _handle: FileHandle, _offset: i64, _whence: SeekWhence) -> FileResult<u64> {
Err(())
}
fn file_remove(&self, _path: &str) -> FileResult<()> {
Err(())
}
fn file_size(&self, _path: &str) -> FileResult<usize> {
Err(())
}
fn crc32(&self, _data: *const u8, _size: usize) -> u32 {
0
}
}
pub fn get_baremetal_platform() -> &'static dyn Platform {
&BareMetalPlatform
}