dev(UML-1462): Добавлено асинхронное чтение и исправлен баг

This commit is contained in:
algin 2023-07-17 17:51:18 +03:00
parent e40ceb8842
commit 75b28d8ab9
4 changed files with 52 additions and 23 deletions

View File

@ -1,7 +1,7 @@
/* /*
* eth_udp_client.cpp * eth_udp_client.cpp
* *
* Created on: 15 мар. 2023 г. * Created on: 15 <EFBFBD><EFBFBD><EFBFBD>. 2023 <EFBFBD>.
* Author: sychev * Author: sychev
*/ */
#include "free_rtos/ethernet_ip/eth_udp_client.hpp" #include "free_rtos/ethernet_ip/eth_udp_client.hpp"
@ -32,11 +32,11 @@ void free_rtos::EthUpdClient::put_data(uint32_t src_ip, uint8_t * p_data, uint32
return; return;
} }
/// Копируем данные в буфер /// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD>
{ {
LockGuard lock(rx_mut_); /// Блокируем мьютекс LockGuard lock(rx_mut_); /// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// Ограничиваем максимальный размер данных в буфере /// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (buff_.size() < max_buf_size) { if (buff_.size() < max_buf_size) {
buff_.insert(buff_.end(), p_data, p_data + len); buff_.insert(buff_.end(), p_data, p_data + len);
} }
@ -47,17 +47,8 @@ void free_rtos::EthUpdClient::put_data(uint32_t src_ip, uint8_t * p_data, uint32
rx_sem_.post(); rx_sem_.post();
} }
int32_t free_rtos::EthUpdClient::read(uint8_t * p_data, uint32_t len) int32_t free_rtos::EthUpdClient::get_data(uint8_t * p_data, uint32_t len)
{ {
if ((p_data == nullptr) || (len == 0)) {
return 0;
}
/// Если буфер пуст, ожидаем приема данных
if (buff_.empty()) {
rx_sem_.pend();
}
uint32_t size = buff_.size(); uint32_t size = buff_.size();
if (size > len) { if (size > len) {
@ -65,19 +56,47 @@ int32_t free_rtos::EthUpdClient::read(uint8_t * p_data, uint32_t len)
} }
{ {
LockGuard lock(rx_mut_); /// Блокируем мьютекс LockGuard lock(rx_mut_); /// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
auto item_begin = buff_.begin(); auto item_begin = buff_.begin();
auto item_end = item_begin + size; auto item_end = item_begin + size;
/// Извлекаем данные из буфера и копипуем в буфер пользователя /// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::copy(item_begin, item_end, p_data); std::copy(item_begin, item_end, p_data);
/// Удаляем скопированные данные из буфера /// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
buff_.erase(item_begin, item_end); buff_.erase(item_begin, item_end);
} }
return size; return size;
} }
int32_t free_rtos::EthUpdClient::read(uint8_t * p_data, uint32_t len)
{
if ((p_data == nullptr) || (len == 0)) {
return 0;
}
/// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
while (buff_.empty()) { // Не заменять на if ! Иначе следующий прием получит пустой буфер т.к. семафор может быть не сброшен !
rx_sem_.pend();
}
return get_data(p_data, len);
}
int32_t free_rtos::EthUpdClient::read_async(uint8_t * p_data, uint32_t len)
{
if ((p_data == nullptr) || (len == 0)) {
return 0;
}
/// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (buff_.empty()) {
return 0;
}
return get_data(p_data, len);
}
void free_rtos::EthUpdClient::clear() void free_rtos::EthUpdClient::clear()
{ {
LockGuard lock(rx_mut_); LockGuard lock(rx_mut_);
@ -100,10 +119,10 @@ int32_t free_rtos::EthUpdClient::write(uint32_t ip_dst_be, uint8_t * p_data, uin
hdr->Length = BASE_SWAP16(eth_pkt_.length); hdr->Length = BASE_SWAP16(eth_pkt_.length);
hdr->Chk_sum = 0; hdr->Chk_sum = 0;
/// Копируем данные /// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
memcpy(p_udp_data, p_data, len); memcpy(p_udp_data, p_data, len);
/// Если нужно считать контроольную сумму /// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
if (use_checksum_) { if (use_checksum_) {
uint32_t self_ip = ip_iface_.getSelfIpAddr(); uint32_t self_ip = ip_iface_.getSelfIpAddr();
uint32_t chk_sum32 = 0; uint32_t chk_sum32 = 0;

View File

@ -1,7 +1,7 @@
/* /*
* eth_udp_client.hpp * eth_udp_client.hpp
* *
* Created on: 15 ìàð. 2023 ã. * Created on: 15 <EFBFBD><EFBFBD><EFBFBD>. 2023 <EFBFBD>.
* Author: sychev * Author: sychev
*/ */
@ -29,12 +29,15 @@ public:
int32_t read(uint8_t * p_data, uint32_t len); int32_t read(uint8_t * p_data, uint32_t len);
int32_t read_async(uint8_t * p_data, uint32_t len);
int32_t write(uint32_t ip_dst_be, uint8_t * p_data, uint32_t len); int32_t write(uint32_t ip_dst_be, uint8_t * p_data, uint32_t len);
void clear(); ///î÷èñòêà ïðèåìíîãî áóôåðà void clear(); ///<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
private: private:
void put_data(uint32_t src_ip, uint8_t * p_data, uint32_t len); void put_data(uint32_t src_ip, uint8_t * p_data, uint32_t len);
int32_t get_data(uint8_t * p_data, uint32_t len);
private: private:
const uint32_t max_buf_size = 0x100000; // 1Mb const uint32_t max_buf_size = 0x100000; // 1Mb
@ -54,7 +57,7 @@ private:
const TEthMacPorts port_id_; const TEthMacPorts port_id_;
uint32_t src_ip_; /// Ip Àäðåñ èñòî÷íèêà ïàêåòà UDP uint32_t src_ip_; /// Ip <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UDP
}; };
} }

View File

@ -68,6 +68,8 @@ int32_t free_rtos::EthUdpServer::Process(uint8_t * p_data, uint32_t len)
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> udp /// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> udp
client->put_data(src_ip, p_data + sizeof(TUdpHeader), BASE_SWAP16(hdr->Length) - sizeof(TUdpHeader)); client->put_data(src_ip, p_data + sizeof(TUdpHeader), BASE_SWAP16(hdr->Length) - sizeof(TUdpHeader));
rx_sem_.post();
return 0; return 0;
} }

View File

@ -30,6 +30,11 @@ public:
virtual uint32_t Sender(uint8_t * p_data, size_t scatter_segment) override; virtual uint32_t Sender(uint8_t * p_data, size_t scatter_segment) override;
int32_t select(uint32_t ticks = SystemP_WAIT_FOREVER)
{
return rx_sem_.pend(ticks);
}
private: private:
EthIpIface& ip_iface_; EthIpIface& ip_iface_;
@ -37,7 +42,7 @@ private:
std::map<uint16_t, std::shared_ptr<EthUpdClient>> connections_; /// <20><><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> std::map<uint16_t, std::shared_ptr<EthUpdClient>> connections_; /// <20><><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Semaphore rx_sem_;
///HandlerStore handlers_; /// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> udp-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ///HandlerStore handlers_; /// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> udp-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}; };