/*
 * Copyright (c) 1997-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.
 */

/**
 * @file
 * @brief "do nothing" kernel service
 *
 * This module provides a "do nothing" kernel service.
 *
 * This service is primarily used by other kernel services that need a way to
 * resume the execution of a kernel request that could not be completed in a
 * single invocation of the _k_server fiber. However, it can also be used by
 * a task to measure the overhead involved in issuing a kernel service request.
 */

#include <micro_private.h>
#include <toolchain.h>
#include <sections.h>

/**
 *
 * @brief Perform "do nothing" kernel request
 *
 * @return N/A
 */
void _k_nop(struct k_args *A)
{
	ARG_UNUSED(A);
}

/**
 *
 * @brief "do nothing" kernel request
 *
 * This routine is a request for the _k_server to run a "do nothing" routine.
 *
 * @return N/A
 */
void _task_nop(void)
{
	struct k_args A;

	A.Comm = _K_SVC_NOP;
	KERNEL_ENTRY(&A);
}
