arm: add host uart driver tests

All host tests currently pass
Some async refactors may not work well on device, will try later
This commit is contained in:
2023-06-02 23:33:01 -07:00
parent 1f2f08e525
commit f274749050
14 changed files with 494 additions and 97 deletions

View File

@@ -3,6 +3,8 @@
#include <atomic>
#include <span>
#include "lock.h"
struct RingBuffer {
std::span<std::byte> buffer;
@@ -11,6 +13,8 @@ struct RingBuffer {
std::atomic<bool> full = 0;
bool Store(std::span<const std::byte> data) {
InterruptLock lock;
if (data.size() > FreeSpace()) {
return false;
}
@@ -26,6 +30,8 @@ struct RingBuffer {
}
bool Load(std::span<std::byte> out) {
InterruptLock lock;
if (out.size() > AvailableData()) {
return false;
}
@@ -41,6 +47,8 @@ struct RingBuffer {
}
bool Push(size_t amount) {
InterruptLock lock;
if (amount > FreeSpace()) {
return false;
}
@@ -52,6 +60,8 @@ struct RingBuffer {
}
bool Pop(size_t amount) {
InterruptLock lock;
if (amount > AvailableData()) {
return false;
}
@@ -62,9 +72,15 @@ struct RingBuffer {
return true;
}
size_t FreeSpace() const { return buffer.size() - AvailableData(); }
size_t FreeSpace() const {
InterruptLock lock;
return buffer.size() - AvailableData();
}
size_t AvailableData() const {
InterruptLock lock;
if (read_ptr == write_ptr) {
return full ? buffer.size() : 0;
}
@@ -72,10 +88,14 @@ struct RingBuffer {
}
uint8_t* RawReadPointer() const {
InterruptLock lock;
return reinterpret_cast<uint8_t*>(buffer.data() + read_ptr);
}
size_t ContiguousAvailableData() const {
InterruptLock lock;
if (read_ptr < write_ptr) {
return AvailableData();
}