dev(SF-60): Заменен mutex на atomic
This commit is contained in:
parent
07c4f35520
commit
665ad56408
@ -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)
|
||||||
|
|||||||
@ -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_;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user