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; return;
} }
{ UDPToggle toggle = in_toggle_.exchange(UDPToggle::UDP_BUSY);
LockGuard lock(rx_mut_);
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; uint32_t new_size = buff.size() + len;
if(new_size > max_buf_size) { if(new_size > max_buf_size) {
state_ = UDPState::UDP_READY; in_toggle_.exchange(toggle);
DebugP_log((char *)"Warning ! UDP client buffer overflow !\r\n"); DebugP_log((char *)"Warning ! UDP client buffer overflow !\r\n");
return; return;
@ -52,18 +48,13 @@ void free_rtos::EthUpdClient::put_data(uint32_t src_ip, uint8_t * p_data, uint32
src_ip_ = src_ip; src_ip_ = src_ip;
{ in_toggle_.exchange(toggle);
LockGuard lock(rx_mut_);
state_ = UDPState::UDP_READY;
}
rx_sem_.post(); rx_sem_.post();
} }
int32_t free_rtos::EthUpdClient::get_data(uint8_t * p_data, uint32_t len) 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(); uint32_t size = buff.size();
if (size > len) { 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() bool free_rtos::EthUpdClient::capture_buffer()
{ {
LockGuard lock(rx_mut_); UDPToggle desired = out_toggle_;
bool toggle = !toggle_; UDPToggle expected = static_cast<UDPToggle>((desired + 1)%UDPToggle::UDP_BUF_NUM);
std::vector<uint8_t>& buff = buff_[toggle];
if(state_ != UDPState::UDP_READY) { if(in_toggle_.compare_exchange_weak(expected, desired) == false) {
return false; return true;
} }
if(buff.empty() == true) { out_toggle_ = expected;
return false;
}
toggle_ = toggle; return buff_[expected].empty();
return true;
} }
size_t free_rtos::EthUpdClient::get_data_size() size_t free_rtos::EthUpdClient::get_data_size()
{ {
if (buff_[toggle_].empty() == true) { if (buff_[out_toggle_].empty() == true) {
if(capture_buffer() == false) { if(capture_buffer() == true) {
return 0; return 0;
} }
} }
return buff_[toggle_].size(); return buff_[out_toggle_].size();
} }
int32_t free_rtos::EthUpdClient::read(uint8_t * p_data, uint32_t len) 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; return 0;
} }
if(buff_[toggle_].empty() == true) { if(buff_[out_toggle_].empty() == true) {
while (capture_buffer() == false) { while (capture_buffer() == true) {
rx_sem_.pend(); rx_sem_.pend();
} }
} }
@ -130,8 +116,8 @@ int32_t free_rtos::EthUpdClient::read_async(uint8_t * p_data, uint32_t len)
return 0; return 0;
} }
if (buff_[toggle_].empty() == true) { if (buff_[out_toggle_].empty() == true) {
if(capture_buffer() == false) { if(capture_buffer() == true) {
return 0; 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() 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) 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 <array>
#include <vector> #include <vector>
#include <atomic>
#include <iterator> #include <iterator>
#include <cstdint> #include <cstdint>
namespace free_rtos { namespace free_rtos {
enum UDPState : uint8_t { enum UDPToggle : uint32_t {
UDP_READY = 0, UDP_BUF_0 = 0,
UDP_BUSY UDP_BUF_1,
UDP_BUF_NUM,
UDP_BUSY = UDP_BUF_NUM
}; };
class EthUpdClient { class EthUpdClient {
@ -48,7 +51,7 @@ public:
} }
if (buff_[toggle_].empty() == true) { if (buff_[toggle_].empty() == true) {
if(capture_buffer() == false) { if(capture_buffer() == true) {
return 0; return 0;
} }
} }
@ -102,15 +105,13 @@ private:
TEthPkt eth_pkt_; 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_; 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_;
}; };
} }