C++程序  |  158行  |  6.48 KB

/*
 * Copyright (C) 2016 The Android Open Source Project
 *
 * 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.
 */

#ifndef _CHRE_H_
#define _CHRE_H_

/**
 * This header file includes all the headers which combine to fully defined
 * the interface for the Context Hub Runtime Environment (CHRE).  This is the
 * environment in which a nanoapp runs.
 *
 * This interface is of interest to both implementors of CHREs and
 * authors of nanoapps.  The API documentation attempts to address concerns
 * of both.
 *
 * See individual header files for API specific, and general comments below
 * for overall platform information.
 */

#include "chre_event.h"
#include "chre_nanoapp.h"
#include "chre_re.h"
#include "chre_sensor.h"
#include "chre_version.h"


/**
 * Entry points.
 *
 * The following entry points are required to be handled by the CHRE
 * implementation, and the functions must all be implemented by nanoapps.
 * o nanoappStart function (see chre_nanoapp.h)
 * o nanoappHandleEvent function (see chre_nanoapp.h)
 * o nanoappEnd function (see chre_nanoapp.h)
 * o bss section zeroed out (prior to nanoappStart)
 * o static variables initialized (prior to nanoappStart)
 * o global C++ constructors called (prior to nanoappStart)
 * o global C++ destructors called (after nanoappEnd)
 */


/**
 * Threading model.
 *
 * A CHRE implementation is free to chose among many different
 * threading models, including a single threaded system or a multi-threaded
 * system with preemption.  The current platform definition is agnostic to this
 * underlying choice [1].
 *
 * However, the Platform does require that all nanoapps are treated as
 * non-reentrant.  That is, any of the functions of the nanoapp, including
 * the entry points defined above and the memory freeing callbacks defined
 * below, cannot be invoked by the CHRE if a previous invocation
 * hasn't completed.  Note this means no nanoapp function can be invoked
 * from an interrupt context.
 *
 * For example, if a nanoapp is currently in nanoappHandleEvent(), the CHRE is
 * not allowed to call nanoappHandleEvent() again, or to call a memory freeing
 * callback.  Similarly, if a nanoapp is currently in a memory freeing
 * callback, the CHRE is not allowed to call nanoappHandleEvent(), or invoke
 * another memory freeing callback.
 *
 * There is one exception to this rule: If an invocation of chreSendEvent()
 * or chreSendMessageToHost() fails (returns 'false'), it is allowed to
 * immediately invoke the memory freeing callback passed into that function.
 * This is a rare case, and one where otherwise a CHRE implementation is
 * likely to leak memory.
 *
 * For a nanoapp author, this means no thought (outside of our one exception)
 * needs to be given to synchronization issues with global objects, as they
 * will, by definition, only be accessed by a single thread at once.
 *
 *
 * [1] Note to CHRE implementors: A future version of the CHRE platform may
 * require multi-threading with preemption.  This is mentioned as a heads up,
 * and to allow implementors deciding between implementation approaches to
 * make the most informed choice.
 */

/**
 * Notes on timing.
 *
 * Nanoapps should expect to be running on a highly constrained system, with
 * little memory and little CPU.  Any single nanoapp should expect to
 * be one of several nanoapps on the system, which also share the CPU with the
 * CHRE and possibly other services as well.
 *
 * Thus, a nanoapp needs to be efficient in its memory and CPU usage.
 * Also, as noted in the Threading Model section, a CHRE implementation may
 * be single threaded.  As a result, all methods invoked in a nanoapp
 * (like nanoappStart, nanoappHandleEvent, memory free callbacks, etc.)
 * must run "quickly".  "Quickly" is difficult to define, as there is a
 * diversity of Context Hub hardware.  For Android N, there is no firm
 * definition of "quickly", but expect this term to gain definition in
 * future releases as we get feedback from partners.
 *
 * In order to write a nanoapp that will be able to adopt to future
 * stricter notions of "quickly", all nanoapp methods should be written so
 * they execute in a small amount of time.  Some nanoapps may have the need
 * to occasionally perform a large block of calculations, which may seem
 * to violate this.  The recommended approach in this case is to
 * split up the large block of calculations into smaller batches.  In one
 * call into the nanoapp, the nanoapp can perform the first batch, and then
 * send an event (chreSendEvent()) to itself indicating which batch should be
 * done next.  This will allow the nanoapp to perform the entire calculation
 * over time, without monopolizing system resources.
 */

/**
 * Floating point support.
 *
 * The C type 'float' is used in this API, and thus a CHRE implementation
 * is required to support 'float's.
 *
 * Support of the C types 'double' and 'long double' is optional for a
 * CHRE implementation.  Note that if a CHRE decides to support them, unlike
 * 'float' support, there is no requirement that this support is particularly
 * efficient.  So nanoapp authors should be aware this may be inefficient.
 *
 * If a CHRE implementation choses not to support 'double' or
 * 'long double', then the build toolchain setup provided needs to set
 * the preprocessor define CHRE_NO_DOUBLE_SUPPORT.
 */

/**
 * CHRE and Nanoapp compatibility.
 *
 * The Android N release introduces the first version of this API.
 * It is anticipated that there will be a lot of feedback from
 * Android partners on this initial API.  To allow more flexibility
 * in addressing that feedback, there is no plan to assure
 * binary compatibility between the Android N and Android O CHRE
 * implementations and nanoapps.
 *
 * That is, a nanoapp built with the Android O version of this
 * API should not expect to run on a CHRE built with
 * the Android N API.  Similarly, a nanoapp build with the
 * Android N API should not expect to run on a CHRE
 * build with the Android O API.  Such a nanoapp will need to
 * recompiled with the appropriate API in order to work.
 */

#endif  /* _CHRE_H_ */