mirror of
https://github.com/AmbiML/sparrow-kata-full.git
synced 2025-07-01 16:42:04 +00:00
Mutex guards kata-uart-client read and write
Change-Id: I5757dcf68f64359b743f458f336a813aeb43c069 GitOrigin-RevId: 1c6c85f95c6509cc915df1b82076942cd540c441
This commit is contained in:
parent
7c3cc70ab1
commit
4043c8b5b7
@ -9,9 +9,11 @@ component DebugConsole {
|
|||||||
|
|
||||||
dataport Buf tx_dataport;
|
dataport Buf tx_dataport;
|
||||||
uses dataport_io_inf uart_tx;
|
uses dataport_io_inf uart_tx;
|
||||||
|
has mutex tx_mutex;
|
||||||
|
|
||||||
dataport Buf rx_dataport;
|
dataport Buf rx_dataport;
|
||||||
uses dataport_io_inf uart_rx;
|
uses dataport_io_inf uart_rx;
|
||||||
|
has mutex rx_mutex;
|
||||||
|
|
||||||
provides LoggerInterface logger;
|
provides LoggerInterface logger;
|
||||||
uses ProcessControlInterface proc_ctrl;
|
uses ProcessControlInterface proc_ctrl;
|
||||||
|
@ -7,15 +7,19 @@ use kata_io as io;
|
|||||||
// C interface to external UART driver.
|
// C interface to external UART driver.
|
||||||
extern "C" {
|
extern "C" {
|
||||||
static rx_dataport: *mut cty::c_uchar;
|
static rx_dataport: *mut cty::c_uchar;
|
||||||
static tx_dataport: *mut cty::c_uchar;
|
|
||||||
fn uart_rx_update(n: cty::size_t);
|
fn uart_rx_update(n: cty::size_t);
|
||||||
|
fn rx_mutex_lock();
|
||||||
|
fn rx_mutex_unlock();
|
||||||
|
|
||||||
|
static tx_dataport: *mut cty::c_uchar;
|
||||||
fn uart_tx_update(n: cty::size_t);
|
fn uart_tx_update(n: cty::size_t);
|
||||||
|
fn tx_mutex_lock();
|
||||||
|
fn tx_mutex_unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Console logging interface.
|
// Console logging interface.
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "C" fn logger_log(msg: *const cstr_core::c_char) {
|
pub extern "C" fn logger_log(msg: *const cstr_core::c_char) {
|
||||||
// TODO(sleffler): is the uart driver ok w/ multiple writers?
|
|
||||||
let output: &mut dyn io::Write = &mut self::Tx {};
|
let output: &mut dyn io::Write = &mut self::Tx {};
|
||||||
unsafe {
|
unsafe {
|
||||||
let _ = writeln!(output, "{}", CStr::from_ptr(msg).to_str().unwrap());
|
let _ = writeln!(output, "{}", CStr::from_ptr(msg).to_str().unwrap());
|
||||||
@ -27,9 +31,11 @@ pub struct Rx {}
|
|||||||
impl io::Read for Rx {
|
impl io::Read for Rx {
|
||||||
fn read(&mut self, buf: &mut [u8]) -> Result<usize, io::Error> {
|
fn read(&mut self, buf: &mut [u8]) -> Result<usize, io::Error> {
|
||||||
unsafe {
|
unsafe {
|
||||||
|
rx_mutex_lock();
|
||||||
uart_rx_update(buf.len());
|
uart_rx_update(buf.len());
|
||||||
let port = core::slice::from_raw_parts(rx_dataport, buf.len());
|
let port = core::slice::from_raw_parts(rx_dataport, buf.len());
|
||||||
buf.copy_from_slice(&port);
|
buf.copy_from_slice(&port);
|
||||||
|
rx_mutex_unlock();
|
||||||
}
|
}
|
||||||
Ok(buf.len())
|
Ok(buf.len())
|
||||||
}
|
}
|
||||||
@ -40,9 +46,11 @@ pub struct Tx {}
|
|||||||
impl io::Write for Tx {
|
impl io::Write for Tx {
|
||||||
fn write(&mut self, buf: &[u8]) -> Result<usize, io::Error> {
|
fn write(&mut self, buf: &[u8]) -> Result<usize, io::Error> {
|
||||||
unsafe {
|
unsafe {
|
||||||
|
tx_mutex_lock();
|
||||||
let port = core::slice::from_raw_parts_mut(tx_dataport, buf.len());
|
let port = core::slice::from_raw_parts_mut(tx_dataport, buf.len());
|
||||||
port.copy_from_slice(buf);
|
port.copy_from_slice(buf);
|
||||||
uart_tx_update(buf.len());
|
uart_tx_update(buf.len());
|
||||||
|
tx_mutex_unlock();
|
||||||
}
|
}
|
||||||
Ok(buf.len())
|
Ok(buf.len())
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user