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
*
* Created on: 15 мар. 2023 г.
* Created on: 15 <EFBFBD><EFBFBD><EFBFBD>. 2023 <EFBFBD>.
* Author: sychev
*/
#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;
}
/// Копируем данные в буфер
/// <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) {
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();
}
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();
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_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);
/// Удаляем скопированные данные из буфера
/// <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);
}
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()
{
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->Chk_sum = 0;
/// Копируем данные
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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_) {
uint32_t self_ip = ip_iface_.getSelfIpAddr();
uint32_t chk_sum32 = 0;

View File

@ -1,7 +1,7 @@
/*
* eth_udp_client.hpp
*
* Created on: 15 ìàð. 2023 ã.
* Created on: 15 <EFBFBD><EFBFBD><EFBFBD>. 2023 <EFBFBD>.
* Author: sychev
*/
@ -29,12 +29,15 @@ public:
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);
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:
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:
const uint32_t max_buf_size = 0x100000; // 1Mb
@ -54,7 +57,7 @@ private:
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
client->put_data(src_ip, p_data + sizeof(TUdpHeader), BASE_SWAP16(hdr->Length) - sizeof(TUdpHeader));
rx_sem_.post();
return 0;
}

View File

@ -30,6 +30,11 @@ public:
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:
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>
Semaphore rx_sem_;
///HandlerStore handlers_; /// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> udp-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
};