Skip to content

Commit 31ea039

Browse files
Add dynamic/static option for transport init (#361)
* Add dynamic/static option for transport init Signed-off-by: Cervenka Dusan <cervenka@acrios.com> * Add forgotten getRpmsgEndpoint function Signed-off-by: Cervenka Dusan <cervenka@acrios.com> * Update erpc_setup_rpmsg_lite_remote.cpp - typo correction in erpc_transport_rpmsg_lite_remote_init --------- Signed-off-by: Cervenka Dusan <cervenka@acrios.com> Co-authored-by: Michal Princ <michal.princ@nxp.com>
1 parent e8e2e63 commit 31ea039

24 files changed

+1052
-203
lines changed

erpc_c/setup/erpc_mbf_setup.h

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,30 @@ extern "C" {
3737
//@{
3838

3939
/*!
40-
* @brief Create MessageBuffer factory which is using static allocated buffers.
40+
* @brief Create MessageBuffer factory which is using dynamic allocated buffers.
4141
*/
42-
erpc_mbf_t erpc_mbf_static_init(void);
42+
erpc_mbf_t erpc_mbf_dynamic_init(void);
4343

4444
/*!
45-
* @brief Create MessageBuffer factory which is using dynamic allocated buffers.
45+
* @brief Deinit MessageBuffer factory.
46+
*
47+
* @param[in] mbf MessageBuffer factory which was initialized in init function.
4648
*/
47-
erpc_mbf_t erpc_mbf_dynamic_init(void);
49+
void erpc_mbf_dynamic_deinit(erpc_mbf_t mbf);
50+
51+
/*!
52+
* @brief Create MessageBuffer factory which is using RPMSG LITE TTY buffers.
53+
*
54+
* Has to be used with RPMSG lite TTY transport.
55+
*/
56+
erpc_mbf_t erpc_mbf_rpmsg_tty_init(erpc_transport_t transport);
57+
58+
/*!
59+
* @brief Deinit MessageBuffer factory.
60+
*
61+
* @param[in] mbf MessageBuffer factory which was initialized in init function.
62+
*/
63+
void erpc_mbf_rpmsg_tty_deinit(erpc_mbf_t mbf);
4864

4965
/*!
5066
* @brief Create MessageBuffer factory which is using RPMSG LITE zero copy buffers.
@@ -54,11 +70,23 @@ erpc_mbf_t erpc_mbf_dynamic_init(void);
5470
erpc_mbf_t erpc_mbf_rpmsg_init(erpc_transport_t transport);
5571

5672
/*!
57-
* @brief Create MessageBuffer factory which is using RPMSG LITE TTY buffers.
73+
* @brief Deinit MessageBuffer factory.
5874
*
59-
* Has to be used with RPMSG lite TTY transport.
75+
* @param[in] mbf MessageBuffer factory which was initialized in init function.
6076
*/
61-
erpc_mbf_t erpc_mbf_rpmsg_tty_init(erpc_transport_t transport);
77+
void erpc_mbf_rpmsg_deinit(erpc_mbf_t mbf);
78+
79+
/*!
80+
* @brief Create MessageBuffer factory which is using static allocated buffers.
81+
*/
82+
erpc_mbf_t erpc_mbf_static_init(void);
83+
84+
/*!
85+
* @brief Deinit MessageBuffer factory.
86+
*
87+
* @param[in] mbf MessageBuffer factory which was initialized in init function.
88+
*/
89+
void erpc_mbf_static_deinit(erpc_mbf_t mbf);
6290

6391
//@}
6492

erpc_c/setup/erpc_setup_dspi_master.cpp

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,50 @@ using namespace erpc;
1717
// Variables
1818
////////////////////////////////////////////////////////////////////////////////
1919

20-
ERPC_MANUALLY_CONSTRUCTED(DspiMasterTransport, s_transport);
20+
ERPC_MANUALLY_CONSTRUCTED_STATIC(DspiMasterTransport, s_dspiTransport);
2121

2222
////////////////////////////////////////////////////////////////////////////////
2323
// Code
2424
////////////////////////////////////////////////////////////////////////////////
2525

2626
erpc_transport_t erpc_transport_dspi_master_init(void *baseAddr, uint32_t baudRate, uint32_t srcClock_Hz)
2727
{
28-
s_transport.construct(reinterpret_cast<SPI_Type *>(baseAddr), baudRate, srcClock_Hz);
29-
(void)s_transport->init();
30-
return reinterpret_cast<erpc_transport_t>(s_transport.get());
28+
DspiMasterTransport *dspiTransport;
29+
30+
#if ERPC_ALLOCATION_POLICY == ERPC_ALLOCATION_POLICY_STATIC
31+
if (s_dspiTransport.isUsed())
32+
{
33+
dspiTransport = NULL;
34+
}
35+
else
36+
{
37+
s_dspiTransport.construct(reinterpret_cast<SPI_Type *>(baseAddr), baudRate, srcClock_Hz);
38+
dspiTransport = s_dspiTransport.get();
39+
}
40+
#elif ERPC_ALLOCATION_POLICY == ERPC_ALLOCATION_POLICY_DYNAMIC
41+
dspiTransport = new DspiMasterTransport(reinterpret_cast<SPI_Type *>(baseAddr), baudRate, srcClock_Hz);
42+
#else
43+
#error "Unknown eRPC allocation policy!"
44+
#endif
45+
46+
if (dspiTransport != NULL)
47+
{
48+
(void)dspiTransport->init();
49+
}
50+
51+
return reinterpret_cast<erpc_transport_t>(dspiTransport);
52+
}
53+
54+
void erpc_transport_dspi_master_deinit(erpc_transport_t transport)
55+
{
56+
#if ERPC_ALLOCATION_POLICY == ERPC_ALLOCATION_POLICY_STATIC
57+
(void)transport;
58+
s_dspiTransport.destroy();
59+
#elif ERPC_ALLOCATION_POLICY == ERPC_ALLOCATION_POLICY_DYNAMIC
60+
erpc_assert(transport != NULL);
61+
62+
DspiMasterTransport *dspiTransport = reinterpret_cast<DspiMasterTransport *>(transport);
63+
64+
delete dspiTransport;
65+
#endif
3166
}

erpc_c/setup/erpc_setup_dspi_slave.cpp

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,50 @@ using namespace erpc;
1717
// Variables
1818
////////////////////////////////////////////////////////////////////////////////
1919

20-
ERPC_MANUALLY_CONSTRUCTED(DspiSlaveTransport, s_transport);
20+
ERPC_MANUALLY_CONSTRUCTED_STATIC(DspiSlaveTransport, s_dspiTransport);
2121

2222
////////////////////////////////////////////////////////////////////////////////
2323
// Code
2424
////////////////////////////////////////////////////////////////////////////////
2525

2626
erpc_transport_t erpc_transport_dspi_slave_init(void *baseAddr, uint32_t baudRate, uint32_t srcClock_Hz)
2727
{
28-
s_transport.construct(reinterpret_cast<SPI_Type *>(baseAddr), baudRate, srcClock_Hz);
29-
(void)s_transport->init();
30-
return reinterpret_cast<erpc_transport_t>(s_transport.get());
28+
DspiSlaveTransport *dspiTransport;
29+
30+
#if ERPC_ALLOCATION_POLICY == ERPC_ALLOCATION_POLICY_STATIC
31+
if (s_dspiTransport.isUsed())
32+
{
33+
dspiTransport = NULL;
34+
}
35+
else
36+
{
37+
s_dspiTransport.construct(reinterpret_cast<SPI_Type *>(baseAddr), baudRate, srcClock_Hz);
38+
dspiTransport = s_dspiTransport.get();
39+
}
40+
#elif ERPC_ALLOCATION_POLICY == ERPC_ALLOCATION_POLICY_DYNAMIC
41+
dspiTransport = new DspiSlaveTransport(reinterpret_cast<SPI_Type *>(baseAddr), baudRate, srcClock_Hz);
42+
#else
43+
#error "Unknown eRPC allocation policy!"
44+
#endif
45+
46+
if (dspiTransport != NULL)
47+
{
48+
(void)dspiTransport->init();
49+
}
50+
51+
return reinterpret_cast<erpc_transport_t>(dspiTransport);
52+
}
53+
54+
void erpc_transport_dspi_slave_deinit(erpc_transport_t transport)
55+
{
56+
#if ERPC_ALLOCATION_POLICY == ERPC_ALLOCATION_POLICY_STATIC
57+
(void)transport;
58+
s_dspiTransport.destroy();
59+
#elif ERPC_ALLOCATION_POLICY == ERPC_ALLOCATION_POLICY_DYNAMIC
60+
erpc_assert(transport != NULL);
61+
62+
DspiSlaveTransport *dspiTransport = reinterpret_cast<DspiSlaveTransport *>(transport);
63+
64+
delete dspiTransport;
65+
#endif
3166
}

erpc_c/setup/erpc_setup_i2c_slave.cpp

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,49 @@ using namespace erpc;
1616
// Variables
1717
////////////////////////////////////////////////////////////////////////////////
1818

19-
static ManuallyConstructed<I2cSlaveTransport> s_transport;
19+
ERPC_MANUALLY_CONSTRUCTED_STATIC(I2cSlaveTransport, s_i2cTransport);
2020

2121
////////////////////////////////////////////////////////////////////////////////
2222
// Code
2323
////////////////////////////////////////////////////////////////////////////////
2424

2525
erpc_transport_t erpc_transport_i2c_slave_init(void *baseAddr, uint32_t baudRate, uint32_t srcClock_Hz)
2626
{
27-
s_transport.construct(reinterpret_cast<I2C_Type *>(baseAddr), baudRate, srcClock_Hz);
28-
(void)s_transport->init();
29-
return reinterpret_cast<erpc_transport_t>(s_transport.get());
27+
I2cSlaveTransport *i2cTransport;
28+
29+
#if ERPC_ALLOCATION_POLICY == ERPC_ALLOCATION_POLICY_STATIC
30+
if (s_i2cTransport.isUsed())
31+
{
32+
i2cTransport = NULL;
33+
}
34+
else
35+
{
36+
s_i2cTransport.construct(reinterpret_cast<I2C_Type *>(baseAddr), baudRate, srcClock_Hz);
37+
i2cTransport = s_i2cTransport.get();
38+
}
39+
#elif ERPC_ALLOCATION_POLICY == ERPC_ALLOCATION_POLICY_DYNAMIC
40+
i2cTransport = new I2cSlaveTransport(reinterpret_cast<I2C_Type *>(baseAddr), baudRate, srcClock_Hz);
41+
#else
42+
#error "Unknown eRPC allocation policy!"
43+
#endif
44+
45+
if (i2cTransport != NULL)
46+
{
47+
(void)i2cTransport->init();
48+
}
49+
50+
return reinterpret_cast<erpc_transport_t>(i2cTransport);
51+
}
52+
void erpc_transport_i2c_slave_deinit(erpc_transport_t transport)
53+
{
54+
#if ERPC_ALLOCATION_POLICY == ERPC_ALLOCATION_POLICY_STATIC
55+
(void)transport;
56+
s_i2cTransport.destroy();
57+
#elif ERPC_ALLOCATION_POLICY == ERPC_ALLOCATION_POLICY_DYNAMIC
58+
erpc_assert(transport != NULL);
59+
60+
I2cSlaveTransport *i2cTransport = reinterpret_cast<I2cSlaveTransport *>(transport);
61+
62+
delete i2cTransport;
63+
#endif
3064
}

erpc_c/setup/erpc_setup_mbf_dynamic.cpp

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,41 @@ class DynamicMessageBufferFactory : public MessageBufferFactory
4747
// Variables
4848
////////////////////////////////////////////////////////////////////////////////
4949

50-
ERPC_MANUALLY_CONSTRUCTED(DynamicMessageBufferFactory, s_msgFactory);
50+
ERPC_MANUALLY_CONSTRUCTED_STATIC(DynamicMessageBufferFactory, s_msgFactory);
5151

5252
erpc_mbf_t erpc_mbf_dynamic_init(void)
5353
{
54-
s_msgFactory.construct();
55-
return reinterpret_cast<erpc_mbf_t>(s_msgFactory.get());
54+
DynamicMessageBufferFactory *msgFactory;
55+
56+
#if ERPC_ALLOCATION_POLICY == ERPC_ALLOCATION_POLICY_STATIC
57+
if (s_msgFactory.isUsed())
58+
{
59+
msgFactory = NULL;
60+
}
61+
else
62+
{
63+
s_msgFactory.construct();
64+
msgFactory = s_msgFactory.get();
65+
}
66+
#elif ERPC_ALLOCATION_POLICY == ERPC_ALLOCATION_POLICY_DYNAMIC
67+
msgFactory = new DynamicMessageBufferFactory();
68+
#else
69+
#error "Unknown eRPC allocation policy!"
70+
#endif
71+
72+
return reinterpret_cast<erpc_mbf_t>(msgFactory);
73+
}
74+
75+
void erpc_mbf_dynamic_deinit(erpc_mbf_t mbf)
76+
{
77+
#if ERPC_ALLOCATION_POLICY == ERPC_ALLOCATION_POLICY_STATIC
78+
(void)mbf;
79+
s_msgFactory.destroy();
80+
#elif ERPC_ALLOCATION_POLICY == ERPC_ALLOCATION_POLICY_DYNAMIC
81+
erpc_assert(mbf != NULL);
82+
83+
DynamicMessageBufferFactory *msgFactory = reinterpret_cast<DynamicMessageBufferFactory *>(mbf);
84+
85+
delete msgFactory;
86+
#endif
5687
}

erpc_c/setup/erpc_setup_mbf_rpmsg.cpp

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,10 +105,42 @@ class RPMsgMessageBufferFactory : public MessageBufferFactory
105105
// Variables
106106
////////////////////////////////////////////////////////////////////////////////
107107

108-
ERPC_MANUALLY_CONSTRUCTED(RPMsgMessageBufferFactory, s_msgFactory);
108+
ERPC_MANUALLY_CONSTRUCTED_STATIC(RPMsgMessageBufferFactory, s_msgFactory);
109109

110110
erpc_mbf_t erpc_mbf_rpmsg_init(erpc_transport_t transport)
111111
{
112-
s_msgFactory.construct(reinterpret_cast<RPMsgBaseTransport *>(transport)->get_rpmsg_lite_instance());
113-
return reinterpret_cast<erpc_mbf_t>(s_msgFactory.get());
112+
RPMsgMessageBufferFactory *msgFactory;
113+
114+
#if ERPC_ALLOCATION_POLICY == ERPC_ALLOCATION_POLICY_STATIC
115+
if (s_msgFactory.isUsed())
116+
{
117+
msgFactory = NULL;
118+
}
119+
else
120+
{
121+
s_msgFactory.construct(reinterpret_cast<RPMsgBaseTransport *>(transport)->get_rpmsg_lite_instance());
122+
msgFactory = s_msgFactory.get();
123+
}
124+
#elif ERPC_ALLOCATION_POLICY == ERPC_ALLOCATION_POLICY_DYNAMIC
125+
msgFactory =
126+
new RPMsgMessageBufferFactory(reinterpret_cast<RPMsgBaseTransport *>(transport)->get_rpmsg_lite_instance());
127+
#else
128+
#error "Unknown eRPC allocation policy!"
129+
#endif
130+
131+
return reinterpret_cast<erpc_mbf_t>(msgFactory);
132+
}
133+
134+
void erpc_mbf_rpmsg_deinit(erpc_mbf_t mbf)
135+
{
136+
#if ERPC_ALLOCATION_POLICY == ERPC_ALLOCATION_POLICY_STATIC
137+
(void)mbf;
138+
s_msgFactory.destroy();
139+
#elif ERPC_ALLOCATION_POLICY == ERPC_ALLOCATION_POLICY_DYNAMIC
140+
erpc_assert(mbf != NULL);
141+
142+
RPMsgMessageBufferFactory *msgFactory = reinterpret_cast<RPMsgMessageBufferFactory *>(mbf);
143+
144+
delete msgFactory;
145+
#endif
114146
}

erpc_c/setup/erpc_setup_mbf_rpmsg_tty.cpp

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,10 +110,42 @@ class RPMsgTTYMessageBufferFactory : public MessageBufferFactory
110110
// Variables
111111
////////////////////////////////////////////////////////////////////////////////
112112

113-
ERPC_MANUALLY_CONSTRUCTED(RPMsgTTYMessageBufferFactory, s_msgFactory);
113+
ERPC_MANUALLY_CONSTRUCTED_STATIC(RPMsgTTYMessageBufferFactory, s_msgFactory);
114114

115115
erpc_mbf_t erpc_mbf_rpmsg_tty_init(erpc_transport_t transport)
116116
{
117-
s_msgFactory.construct(reinterpret_cast<RPMsgBaseTransport *>(transport)->get_rpmsg_lite_instance());
118-
return reinterpret_cast<erpc_mbf_t>(s_msgFactory.get());
117+
RPMsgTTYMessageBufferFactory *msgFactory;
118+
119+
#if ERPC_ALLOCATION_POLICY == ERPC_ALLOCATION_POLICY_STATIC
120+
if (s_msgFactory.isUsed())
121+
{
122+
msgFactory = NULL;
123+
}
124+
else
125+
{
126+
s_msgFactory.construct(reinterpret_cast<RPMsgBaseTransport *>(transport)->get_rpmsg_lite_instance());
127+
msgFactory = s_msgFactory.get();
128+
}
129+
#elif ERPC_ALLOCATION_POLICY == ERPC_ALLOCATION_POLICY_DYNAMIC
130+
msgFactory =
131+
new RPMsgTTYMessageBufferFactory(reinterpret_cast<RPMsgBaseTransport *>(transport)->get_rpmsg_lite_instance());
132+
#else
133+
#error "Unknown eRPC allocation policy!"
134+
#endif
135+
136+
return reinterpret_cast<erpc_mbf_t>(msgFactory);
137+
}
138+
139+
void erpc_mbf_rpmsg_tty_deinit(erpc_mbf_t mbf)
140+
{
141+
#if ERPC_ALLOCATION_POLICY == ERPC_ALLOCATION_POLICY_STATIC
142+
(void)mbf;
143+
s_msgFactory.destroy();
144+
#elif ERPC_ALLOCATION_POLICY == ERPC_ALLOCATION_POLICY_DYNAMIC
145+
erpc_assert(mbf != NULL);
146+
147+
RPMsgTTYMessageBufferFactory *msgFactory = reinterpret_cast<RPMsgTTYMessageBufferFactory *>(mbf);
148+
149+
delete msgFactory;
150+
#endif
119151
}

0 commit comments

Comments
 (0)