From 665ad564089b2731712f971e494c31d76a559a91 Mon Sep 17 00:00:00 2001 From: algin Date: Fri, 20 Oct 2023 10:25:51 +0300 Subject: [PATCH] =?UTF-8?q?dev(SF-60):=20=D0=97=D0=B0=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=20mutex=20=D0=BD=D0=B0=20atomic?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../free_rtos/ethernet_ip/eth_udp_client.cpp | 52 +++++++------------ .../free_rtos/ethernet_ip/eth_udp_client.hpp | 23 ++++---- 2 files changed, 31 insertions(+), 44 deletions(-) diff --git a/components/free_rtos/ethernet_ip/eth_udp_client.cpp b/components/free_rtos/ethernet_ip/eth_udp_client.cpp index 2e98b33..8496080 100644 --- a/components/free_rtos/ethernet_ip/eth_udp_client.cpp +++ b/components/free_rtos/ethernet_ip/eth_udp_client.cpp @@ -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& buff = buff_[!toggle_]; + std::vector& 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& buff = buff_[toggle_]; + std::vector& 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& buff = buff_[toggle]; + UDPToggle desired = out_toggle_; + UDPToggle expected = static_cast((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) diff --git a/components/free_rtos/ethernet_ip/eth_udp_client.hpp b/components/free_rtos/ethernet_ip/eth_udp_client.hpp index e1a6079..b97edbe 100644 --- a/components/free_rtos/ethernet_ip/eth_udp_client.hpp +++ b/components/free_rtos/ethernet_ip/eth_udp_client.hpp @@ -16,14 +16,17 @@ #include #include +#include #include #include 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 ����� ��������� ������ UDP + uint32_t src_ip_; + + std::array, UDP_BUF_NUM> buff_; + std::atomic in_toggle_{UDPToggle::UDP_BUF_1}; + UDPToggle out_toggle_{UDPToggle::UDP_BUF_0}; Semaphore rx_sem_; - Mutex rx_mut_; - - std::array, 2> buff_; - bool toggle_{false}; - UDPState state_{UDPState::UDP_READY}; - //std::vector buff_; }; }