blob: 3d8e7f7587d6762597a965ac698168bdbe0e6505 [file] [log] [blame]
/* mailbox_r.c */
/*
* Copyright (c) 1997-2010, 2013-2014 Wind River Systems, Inc.
*
* SPDX-License-Identifier: Apache-2.0
*/
#include "receiver.h"
#include "master.h"
#ifdef MAILBOX_BENCH
/*
* Function prototypes.
*/
void mailbox_get(struct k_mbox *mailbox,
int size,
int count,
unsigned int *time);
/*
* Function declarations.
*/
/* mailbox transfer speed test */
/**
*
* @brief Receive task
*
* @return N/A
*/
void mailrecvtask(void)
{
int getsize;
unsigned int gettime;
int getcount;
struct getinfo getinfo;
getcount = NR_OF_MBOX_RUNS;
getsize = 0;
mailbox_get(&MAILB1, getsize, getcount, &gettime);
getinfo.time = gettime;
getinfo.size = getsize;
getinfo.count = getcount;
/* acknowledge to master */
k_msgq_put(&MB_COMM, &getinfo, K_FOREVER);
for (getsize = 8; getsize <= MESSAGE_SIZE; getsize <<= 1) {
mailbox_get(&MAILB1, getsize, getcount, &gettime);
getinfo.time = gettime;
getinfo.size = getsize;
getinfo.count = getcount;
/* acknowledge to master */
k_msgq_put(&MB_COMM, &getinfo, K_FOREVER);
}
}
/**
*
* @brief Receive data portions from the specified mailbox
*
* @return 0
*
* @param mailbox The mailbox to read data from.
* @param size Size of each data portion.
* @param count Number of data portions.
* @param time Resulting time.
*/
void mailbox_get(struct k_mbox *mailbox,
int size,
int count,
unsigned int *time)
{
int i;
unsigned int t;
s32_t return_value = 0;
struct k_mbox_msg Message;
Message.rx_source_thread = K_ANY;
Message.size = size;
/* sync with the sender */
k_sem_take(&SEM0, K_FOREVER);
t = BENCH_START();
for (i = 0; i < count; i++) {
return_value |= k_mbox_get(mailbox,
&Message,
&data_recv,
K_FOREVER);
}
t = TIME_STAMP_DELTA_GET(t);
*time = SYS_CLOCK_HW_CYCLES_TO_NS_AVG(t, count);
if (bench_test_end() < 0) {
PRINT_OVERFLOW_ERROR();
}
if (return_value != 0) {
k_panic();
}
}
#endif /* MAILBOX_BENCH */