-
Notifications
You must be signed in to change notification settings - Fork 222
/
Copy pathunit_test_arbitrator_app1.cpp
255 lines (212 loc) · 5.62 KB
/
unit_test_arbitrator_app1.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
/*
* Copyright (c) 2016, Freescale Semiconductor, Inc.
* Copyright 2016 - 2024 NXP
* All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include "erpc_arbitrated_client_setup.h"
#include "erpc_mbf_setup.h"
#include "erpc_server_setup.h"
#include "erpc_transport_setup.h"
#include "FreeRTOS.h"
#include "semphr.h"
#include "task.h"
#include "c_test_firstInterface_server.h"
#include "c_test_secondInterface_client.h"
#include "unit_test.h"
#include "unit_test_wrapped.h"
#ifdef __cplusplus
extern "C" {
#endif
#if defined(RPMSG)
#include "rpmsg_lite.h"
#endif
#include "app_core1.h"
#include "board.h"
#include "mcmgr.h"
#if defined(__CC_ARM) || defined(__ARMCC_VERSION)
int main(void);
#endif
#ifdef __cplusplus
}
#endif
using namespace erpc;
int testClient();
#define APP_ERPC_READY_EVENT_DATA (1)
Mutex waitQuitMutex;
Thread g_initThread("runInit");
Thread g_serverThread("runServer");
Thread g_clientThread("runClient");
volatile int waitQuit = 0;
volatile int waitClient = 0;
volatile int isTestPassing = 0;
uint32_t startupData;
mcmgr_status_t status;
volatile int stopTest = 0;
extern const uint32_t erpc_generated_crc;
erpc_service_t service = NULL;
erpc_server_t server;
////////////////////////////////////////////////////////////////////////////////
// Code
////////////////////////////////////////////////////////////////////////////////
void increaseWaitQuit()
{
Mutex::Guard lock(waitQuitMutex);
waitQuit++;
}
void runServer(void *arg)
{
ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
erpc_status_t err;
err = erpc_server_run(server);
increaseWaitQuit();
if (err != kErpcStatus_Success)
{
// server error
while (1)
{
}
}
vTaskSuspend(NULL);
}
void runClient(void *arg)
{
ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
// wait until ERPC first (client) app will announce that it is ready.
while (waitClient == 0)
{
Thread::sleep(10000);
}
// wait until ERPC first (client) app will announce ready to quit state
while (true)
{
isTestPassing = testClient();
{
Thread::sleep(10000);
Mutex::Guard lock(waitQuitMutex);
if (waitQuit != 0 || isTestPassing != 0 || stopTest != 0)
{
enableFirstSide();
break;
}
}
}
while (true)
{
Thread::sleep(100000);
Mutex::Guard lock(waitQuitMutex);
if (waitQuit != 0)
{
break;
}
}
// send to ERPC first (client) app ready to quit state
quitSecondInterfaceServer();
increaseWaitQuit();
vTaskSuspend(NULL);
}
static void SignalReady(void)
{
/* Signal the other core we are ready by trigerring the event and passing the APP_ERPC_READY_EVENT_DATA */
MCMGR_TriggerEvent(kMCMGR_RemoteApplicationEvent, APP_ERPC_READY_EVENT_DATA);
}
void runInit(void *arg)
{
// Initialize MCMGR before calling its API
MCMGR_Init();
// Get the startup data
do
{
status = MCMGR_GetStartupData(&startupData);
} while (status != kStatus_MCMGR_Success);
erpc_transport_t transportClient;
erpc_transport_t transportServer;
erpc_mbf_t message_buffer_factory;
erpc_client_t client;
#if defined(RPMSG)
// RPMsg-Lite transport layer initialization
transportClient = erpc_transport_rpmsg_lite_rtos_remote_init(101, 100, (void *)startupData, 0, SignalReady, NULL);
// MessageBufferFactory initialization
message_buffer_factory = erpc_mbf_rpmsg_init(transportClient);
#elif defined(MU)
// MU transport layer initialization
transportClient = erpc_transport_mu_init(MU_BASE);
message_buffer_factory = erpc_mbf_dynamic_init();
#endif
// eRPC client side initialization
client = erpc_arbitrated_client_init(transportClient, message_buffer_factory, &transportServer);
initInterfaces(client);
// eRPC server side initialization
server = erpc_server_init(transportServer, message_buffer_factory);
erpc_arbitrated_client_set_crc(client, erpc_generated_crc);
// adding server to client for nested calls.
erpc_arbitrated_client_set_server(client, server);
erpc_arbitrated_client_set_server_thread_id(client, (void *)g_serverThread.getThreadId());
// adding the service to the server
service = create_FirstInterface_service();
erpc_add_service_to_server(server, service);
#if defined(MU)
SignalReady();
#endif
// unblock server and client task
xTaskNotifyGive((TaskHandle_t)g_serverThread.getThreadId());
xTaskNotifyGive((TaskHandle_t)g_clientThread.getThreadId());
vTaskSuspend(NULL);
}
int main(void)
{
BOARD_InitHardware();
g_initThread.init(&runInit, 1, 256 * 4);
g_serverThread.init(&runServer, 3, 1536 * 4);
g_clientThread.init(&runClient, 2, 1536 * 4);
g_initThread.start();
g_serverThread.start();
g_clientThread.start();
vTaskStartScheduler();
while (1)
{
}
}
extern "C" {
void stopSecondSide()
{
++stopTest;
}
int32_t getResultFromSecondSide()
{
return isTestPassing;
}
void testCasesAreDone(void)
{
increaseWaitQuit();
}
void quitFirstInterfaceServer()
{
/* removing the service from the server */
erpc_remove_service_from_server(server, service);
destroy_FirstInterface_service(service);
// Stop server part
erpc_server_stop(server);
}
void whenReady()
{
waitClient++;
}
}
int testClient()
{
int number = 15;
for (int i = 0; i < number; i++)
{
secondSendInt(i + number);
}
for (int i = number - 1; i >= 0; i--)
{
if (i + number != secondReceiveInt())
{
return -1;
}
}
return 0;
}