Linux Audio

Check our new training course

Loading...
/* mailbox_b.c */

/*
 * Copyright (c) 1997-2010, 2013-2014 Wind River Systems, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "master.h"

#ifdef MAILBOX_BENCH

static struct k_msg Message;

#ifdef FLOAT
#define PRINT_HEADER()                                                       \
	PRINT_STRING                                                             \
	   ("|   size(B) |       time/packet (usec)       |          MB/sec" \
	    "                |\n", output_file);
#define PRINT_ONE_RESULT()                                                   \
	PRINT_F(output_file, "|%11lu|%32.3f|%32f|\n", putsize, puttime / 1000.0, \
	     (1000.0 * putsize) / puttime)

#define PRINT_OVERHEAD()                                                     \
	PRINT_F(output_file,						\
	     "| message overhead:  %10.3f     usec/packet                   "\
	     "            |\n", EmptyMsgPutTime / 1000.0)

#define PRINT_XFER_RATE()                                                     \
	double NettoTransferRate;                                                 \
	NettoTransferRate = 1000.0 * (putsize >> 1) / (puttime - EmptyMsgPutTime);\
	PRINT_F(output_file,						\
	     "| raw transfer rate:     %10.3f MB/sec (without"		\
	     " overhead)                 |\n", NettoTransferRate)

#else
#define PRINT_HEADER()                                                       \
	PRINT_STRING                                                             \
	   ("|   size(B) |       time/packet (nsec)       |          KB/sec" \
	    "                |\n", output_file);

#define PRINT_ONE_RESULT()                                                   \
	PRINT_F(output_file, "|%11lu|%32lu|%32lu|\n", putsize, puttime,	\
	     (uint32_t)((1000000 * (uint64_t)putsize) / puttime))

#define PRINT_OVERHEAD()                                                     \
	PRINT_F(output_file,						\
	     "| message overhead:  %10u     nsec/packet                     "\
	     "          |\n", EmptyMsgPutTime)

#define PRINT_XFER_RATE()                                                    \
	PRINT_F(output_file, "| raw transfer rate:     %10lu KB/sec (without" \
	     " overhead)                 |\n",                               \
	     (uint32_t)(1000000 * (uint64_t)(putsize >> 1)                   \
	     / (puttime - EmptyMsgPutTime)))

#endif


/*
 * Function prototypes.
 */
void mailbox_put(uint32_t size, int count, uint32_t *time);

/*
 * Function declarations.
 */

/**
 *
 * @brief Mailbox transfer speed test
 *
 * @return N/A
 */
void mailbox_test(void)
{
	uint32_t putsize;
	uint32_t puttime;
	int putcount;
	unsigned int EmptyMsgPutTime;
	GetInfo getinfo;

	PRINT_STRING(dashline, output_file);
	PRINT_STRING("|                "
				 "M A I L B O X   M E A S U R E M E N T S"
				 "                      |\n", output_file);
	PRINT_STRING(dashline, output_file);
	PRINT_STRING("| Send mailbox message to waiting high "
				 "priority task and wait                 |\n", output_file);
	PRINT_F(output_file, "| repeat for %4d times and take the "
			"average                                  |\n",
			NR_OF_MBOX_RUNS);
	PRINT_STRING(dashline, output_file);
	PRINT_HEADER();
	PRINT_STRING(dashline, output_file);
	task_sem_reset(SEM0);
	task_sem_give(STARTRCV);

	putcount = NR_OF_MBOX_RUNS;

	putsize = 0;
	mailbox_put(putsize, putcount, &puttime);
	/* waiting for ack */
	task_fifo_get(MB_COMM, &getinfo, TICKS_UNLIMITED);
	PRINT_ONE_RESULT();
	EmptyMsgPutTime = puttime;
	for (putsize = 8; putsize <= MESSAGE_SIZE; putsize <<= 1) {
		mailbox_put(putsize, putcount, &puttime);
		/* waiting for ack */
		task_fifo_get(MB_COMM, &getinfo, TICKS_UNLIMITED);
		PRINT_ONE_RESULT();
	}
	PRINT_STRING(dashline, output_file);
	PRINT_OVERHEAD();
	PRINT_XFER_RATE();
}


/**
 *
 * @brief Write the number of data chunks into the mailbox
 *
 * @param size    The size of the data chunk.
 * @param count   Number of data chunks.
 * @param time    The total time.
 *
 * @return N/A
 */
void mailbox_put(uint32_t size, int count, uint32_t *time)
{
	int i;
	unsigned int t;

	Message.rx_task = ANYTASK;
	Message.tx_data = data_bench;
	Message.size = size;

	/* first sync with the receiver */
	task_sem_give(SEM0);
	t = BENCH_START();
	for (i = 0; i < count; i++) {
		task_mbox_put(MAILB1, 1, &Message, TICKS_UNLIMITED);
	}
	t = TIME_STAMP_DELTA_GET(t);
	*time = SYS_CLOCK_HW_CYCLES_TO_NS_AVG(t, count);
	check_result();
}

#endif /* MAILBOX_BENCH */