Skip to content

Commit 0101e6e

Browse files
committed
feat: add rt_prio arg to DataHandler
1 parent 70237af commit 0101e6e

3 files changed

Lines changed: 22 additions & 6 deletions

File tree

inc/udmaio/DataHandlerAbstract.hpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,24 +33,27 @@ class DataHandlerAbstract : public Logger, private boost::noncopyable {
3333

3434
boost::asio::io_service _svc;
3535
boost::asio::posix::stream_descriptor _sd;
36+
const bool _rt_prio;
3637

3738
void _start_read();
3839
void _handle_input(const boost::system::error_code& ec);
3940

4041
protected:
41-
bool _receive_packets; ///< Enable segmentation of stream into SOF/EOF delimited frames
42+
const bool _receive_packets; ///< Enable segmentation of stream into SOF/EOF delimited frames
4243

4344
public:
4445
/// @brief Construct a Data Handler
4546
/// @param dma Interface to the AXI DMA core
4647
/// @param desc Interface to the SGDMA descriptors
4748
/// @param mem Interface to the memory holding the SGDMA data buffers
4849
/// @param receive_packets Receive packets/frames delimited by SOF/EOF. If not set, receive stream as-is without regard for packets
50+
/// @param rt_prio Set receiving thread to use RT scheduling priority
4951
explicit DataHandlerAbstract(std::string name,
5052
UioAxiDmaIf& dma,
5153
UioMemSgdma& desc,
5254
DmaBufferAbstract& mem,
53-
bool receive_packets = true);
55+
bool receive_packets = true,
56+
bool rt_prio = false);
5457
virtual ~DataHandlerAbstract();
5558

5659
/// @brief Stop the data reception

inc/udmaio/DataHandlerSync.hpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,9 @@ class DataHandlerSync : public DataHandlerAbstract {
3232
UioMemSgdma& desc,
3333
DmaBufferAbstract& mem,
3434
bool receive_packets = true,
35-
size_t queue_size = 64)
36-
: DataHandlerAbstract{name, dma, desc, mem, receive_packets}, _queue{queue_size} {}
35+
size_t queue_size = 64,
36+
bool rt_prio = false)
37+
: DataHandlerAbstract{name, dma, desc, mem, receive_packets, rt_prio}, _queue{queue_size} {}
3738

3839
virtual ~DataHandlerSync();
3940

src/DataHandlerAbstract.cpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,23 +12,26 @@
1212
#include "udmaio/DataHandlerAbstract.hpp"
1313

1414
#include <functional>
15-
#include <iomanip>
1615
#include <iostream>
1716
#include <vector>
1817

18+
#include <pthread.h>
19+
1920
namespace udmaio {
2021

2122
DataHandlerAbstract::DataHandlerAbstract(std::string name,
2223
UioAxiDmaIf& dma,
2324
UioMemSgdma& desc,
2425
DmaBufferAbstract& mem,
25-
bool receive_packets)
26+
bool receive_packets,
27+
bool rt_prio)
2628
: Logger(name)
2729
, _dma{dma}
2830
, _desc{desc}
2931
, _mem{mem}
3032
, _svc{}
3133
, _sd{_svc, _dma.get_fd_int()}
34+
, _rt_prio{rt_prio}
3235
, _receive_packets{receive_packets} {
3336
BOOST_LOG_SEV(_lg, bls::trace) << "ctor";
3437
};
@@ -95,6 +98,15 @@ void DataHandlerAbstract::_handle_input(const boost::system::error_code& ec) {
9598
void DataHandlerAbstract::operator()() {
9699
BOOST_LOG_SEV(_lg, bls::trace) << "started";
97100

101+
if (_rt_prio) {
102+
// Set real-time scheduling
103+
sched_param sch_params = {.sched_priority = sched_get_priority_max(SCHED_FIFO)};
104+
if (pthread_setschedparam(pthread_self(), SCHED_FIFO, &sch_params)) {
105+
BOOST_LOG_SEV(_lg, bls::error)
106+
<< "Failed to set thread scheduling: Permission denied or invalid policy";
107+
}
108+
}
109+
98110
_start_read();
99111
_svc.run();
100112

0 commit comments

Comments
 (0)