dev(SF-60): Заменен mutex на atomic

This commit is contained in:
algin 2023-10-20 10:25:51 +03:00
parent 07c4f35520
commit 665ad56408
2 changed files with 31 additions and 44 deletions

View File

@ -31,17 +31,13 @@ void free_rtos::EthUpdClient::put_data(uint32_t src_ip, uint8_t * p_data, uint32
return;
}
{
LockGuard lock(rx_mut_);
UDPToggle toggle = in_toggle_.exchange(UDPToggle::UDP_BUSY);
state_ = UDPState::UDP_BUSY;
}
std::vector<uint8_t>& buff = buff_[!toggle_];
std::vector<uint8_t>& buff = buff_[toggle];
uint32_t new_size = buff.size() + len;
if(new_size > max_buf_size) {
state_ = UDPState::UDP_READY;
in_toggle_.exchange(toggle);
DebugP_log((char *)"Warning ! UDP client buffer overflow !\r\n");
return;
@ -52,18 +48,13 @@ void free_rtos::EthUpdClient::put_data(uint32_t src_ip, uint8_t * p_data, uint32
src_ip_ = src_ip;
{
LockGuard lock(rx_mut_);
state_ = UDPState::UDP_READY;
}
in_toggle_.exchange(toggle);
rx_sem_.post();
}
int32_t free_rtos::EthUpdClient::get_data(uint8_t * p_data, uint32_t len)
{
std::vector<uint8_t>& buff = buff_[toggle_];
std::vector<uint8_t>& buff = buff_[out_toggle_];
uint32_t size = buff.size();
if (size > len) {
@ -81,32 +72,27 @@ int32_t free_rtos::EthUpdClient::get_data(uint8_t * p_data, uint32_t len)
bool free_rtos::EthUpdClient::capture_buffer()
{
LockGuard lock(rx_mut_);
bool toggle = !toggle_;
std::vector<uint8_t>& buff = buff_[toggle];
UDPToggle desired = out_toggle_;
UDPToggle expected = static_cast<UDPToggle>((desired + 1)%UDPToggle::UDP_BUF_NUM);
if(state_ != UDPState::UDP_READY) {
return false;
if(in_toggle_.compare_exchange_weak(expected, desired) == false) {
return true;
}
if(buff.empty() == true) {
return false;
}
out_toggle_ = expected;
toggle_ = toggle;
return true;
return buff_[expected].empty();
}
size_t free_rtos::EthUpdClient::get_data_size()
{
if (buff_[toggle_].empty() == true) {
if(capture_buffer() == false) {
if (buff_[out_toggle_].empty() == true) {
if(capture_buffer() == true) {
return 0;
}
}
return buff_[toggle_].size();
return buff_[out_toggle_].size();
}
int32_t free_rtos::EthUpdClient::read(uint8_t * p_data, uint32_t len)
@ -115,8 +101,8 @@ int32_t free_rtos::EthUpdClient::read(uint8_t * p_data, uint32_t len)
return 0;
}
if(buff_[toggle_].empty() == true) {
while (capture_buffer() == false) {
if(buff_[out_toggle_].empty() == true) {
while (capture_buffer() == true) {
rx_sem_.pend();
}
}
@ -130,8 +116,8 @@ int32_t free_rtos::EthUpdClient::read_async(uint8_t * p_data, uint32_t len)
return 0;
}
if (buff_[toggle_].empty() == true) {
if(capture_buffer() == false) {
if (buff_[out_toggle_].empty() == true) {
if(capture_buffer() == true) {
return 0;
}
}
@ -141,7 +127,7 @@ int32_t free_rtos::EthUpdClient::read_async(uint8_t * p_data, uint32_t len)
void free_rtos::EthUpdClient::clear()
{
buff_[toggle_].clear();
buff_[out_toggle_].clear();
}
bool free_rtos::EthUpdClient::write(uint32_t ip_dst_be, uint8_t * p_data, uint32_t len)

View File

@ -16,14 +16,17 @@
#include <array>
#include <vector>
#include <atomic>
#include <iterator>
#include <cstdint>
namespace free_rtos {
enum UDPState : uint8_t {
UDP_READY = 0,
UDP_BUSY
enum UDPToggle : uint32_t {
UDP_BUF_0 = 0,
UDP_BUF_1,
UDP_BUF_NUM,
UDP_BUSY = UDP_BUF_NUM
};
class EthUpdClient {
@ -48,7 +51,7 @@ public:
}
if (buff_[toggle_].empty() == true) {
if(capture_buffer() == false) {
if(capture_buffer() == true) {
return 0;
}
}
@ -102,15 +105,13 @@ private:
TEthPkt eth_pkt_;
uint32_t src_ip_; /// Ip <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UDP
uint32_t src_ip_;
std::array<std::vector<uint8_t>, UDP_BUF_NUM> buff_;
std::atomic<UDPToggle> in_toggle_{UDPToggle::UDP_BUF_1};
UDPToggle out_toggle_{UDPToggle::UDP_BUF_0};
Semaphore rx_sem_;
Mutex rx_mut_;
std::array<std::vector<uint8_t>, 2> buff_;
bool toggle_{false};
UDPState state_{UDPState::UDP_READY};
//std::vector<uint8_t> buff_;
};
}