0
mirror of https://github.com/Indemsys/Frequency_Inverter.git synced 2026-04-22 02:23:27 +00:00
Files
2022-01-04 12:22:53 +02:00

291 lines
10 KiB
C

/*HEADER*********************************************************************
*
* Copyright (c) 2008 Freescale Semiconductor;
* All Rights Reserved
*
* Copyright (c) 2004-2008 Embedded Access Inc.;
* All Rights Reserved
*
* Copyright (c) 1989-2008 ARC International;
* All Rights Reserved
*
***************************************************************************
*
* THIS SOFTWARE IS PROVIDED BY FREESCALE "AS IS" AND ANY EXPRESSED OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL FREESCALE OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*
**************************************************************************
*
* $FileName: message.h$
* $Version : 3.0.6.0$
* $Date : Jun-26-2009$
*
* Comments:
*
* This include file is used to define constants and data types for the
* message component.
*
*END************************************************************************/
#ifndef __message_h__
#define __message_h__
#include <mqx_cnfg.h>
#if (!MQX_USE_MESSAGES) && (! defined (MQX_DISABLE_CONFIG_CHECK))
#error MESSAGE component is currently disabled in MQX kernel. Please set MQX_USE_MESSAGES to 1 in user_config.h and recompile kernel.
#endif
/*--------------------------------------------------------------------------*/
/* CONSTANT DEFINITIONS */
/* Error codes */
#define MSGPOOL_OUT_OF_MESSAGES (MSG_ERROR_BASE|0x01)
#define MSGPOOL_OUT_OF_POOLS (MSG_ERROR_BASE|0x02)
#define MSGPOOL_INVALID_POOL_ID (MSG_ERROR_BASE|0x03)
#define MSGPOOL_ALL_MESSAGES_NOT_FREE (MSG_ERROR_BASE|0x04)
#define MSGPOOL_MESSAGE_SIZE_TOO_SMALL (MSG_ERROR_BASE|0x05)
#define MSGPOOL_POOL_NOT_CREATED (MSG_ERROR_BASE|0x06)
#define MSGQ_INVALID_QUEUE_ID (MSG_ERROR_BASE|0x10)
#define MSGQ_QUEUE_IN_USE (MSG_ERROR_BASE|0x11)
#define MSGQ_NOT_QUEUE_OWNER (MSG_ERROR_BASE|0x12)
#define MSGQ_QUEUE_IS_NOT_OPEN (MSG_ERROR_BASE|0x13)
#define MSGQ_MESSAGE_NOT_AVAILABLE (MSG_ERROR_BASE|0x14)
#define MSGQ_INVALID_MESSAGE_PRIORITY (MSG_ERROR_BASE|0x15)
#define MSGQ_INVALID_MESSAGE (MSG_ERROR_BASE|0x16)
#define MSGQ_QUEUE_FULL (MSG_ERROR_BASE|0x17)
#define MSGQ_RECEIVE_TIMEOUT (MSG_ERROR_BASE|0x18)
#define MSGQ_TOO_MANY_QUEUES (MSG_ERROR_BASE|0x19)
#define MSGQ_MESSAGE_IS_QUEUED (MSG_ERROR_BASE|0x1A)
#define MSGQ_INVALID_QUEUE_NUMBER (MSG_ERROR_BASE|0x1B)
#define MSG_CANNOT_CREATE_COMPONENT (MSG_ERROR_BASE|0x20)
/* What the msg component valid field should be */
#define MESSAGE_VALID (_mqx_uint)(0x6d657373) /* "mess" */
/* What a NULL pool id looks like. Used for error returns from functions */
#define MSGPOOL_NULL_POOL_ID ((_pool_id)0)
/* Maximum number of data bytes in a message. */
#define MSGPOOL_MESSAGE_DATA_SIZE \
(MAX_UINT_16 - sizeof(MESSAGE_HEADER_STRUCT))
/* What a NULL queue id looks like. Used for error returns from functions */
#define MSGQ_NULL_QUEUE_ID ((_queue_id)0)
/* For _msgq_receive, receives from any queue */
#define MSGQ_ANY_QUEUE ((_queue_id)0)
/* For open queue, this queue number will return a free queue_id */
#define MSGQ_FREE_QUEUE (0)
/* The maximum priority level for the message */
#define MSG_MAX_PRIORITY (0xF)
/* The lowest queue provided by msgq_open with an MSGQ_MSGQ_ANY_QUEUE request. */
#define MSGQ_FIRST_USER_QUEUE (8)
/*--------------------------------------------------------------------------*/
/*
* MESSAGE STRUCTURE CONTROL FIELD BIT DEFINITIONS
*/
#define MSG_HDR_ENDIAN_MASK (0x40)
#define MSG_DATA_ENDIAN_MASK (0x20)
#define MSG_HDR_LITTLE_ENDIAN (0x40)
#define MSG_DATA_LITTLE_ENDIAN (0x20)
#define MSG_HDR_BIG_ENDIAN (0x00)
#define MSG_DATA_BIG_ENDIAN (0x00)
/* Is the message an urgent message */
#define MSG_HDR_URGENT (0x10)
#define MSG_HDR_PRIORITY_MASK (0x0F)
/* NOTE that the lower nibble of the control field is the message priority */
#define MSG_IS_HDR_LITTLE_ENDIAN(ctrl) \
(((ctrl) & MSG_HDR_ENDIAN_MASK) == MSG_HDR_LITTLE_ENDIAN)
#define MSG_IS_DATA_LITTLE_ENDIAN(ctrl) \
(((ctrl) & MSG_DATA_ENDIAN_MASK) == MSG_DATA_LITTLE_ENDIAN)
#define MSG_IS_HDR_BIG_ENDIAN(ctrl) \
(((ctrl) & MSG_HDR_ENDIAN_MASK) == MSG_HDR_BIG_ENDIAN)
#define MSG_IS_DATA_BIG_ENDIAN(ctrl) \
(((ctrl) & MSG_DATA_ENDIAN_MASK) == MSG_DATA_BIG_ENDIAN)
/*
* ENDIAN
* Indicate in messages the endianness of the message
*/
#if PSP_ENDIAN == MQX_LITTLE_ENDIAN
#define MSG_HDR_ENDIAN MSG_HDR_LITTLE_ENDIAN
#define MSG_DATA_ENDIAN MSG_DATA_LITTLE_ENDIAN
#else
#define MSG_HDR_ENDIAN MSG_HDR_BIG_ENDIAN
#define MSG_DATA_ENDIAN MSG_DATA_BIG_ENDIAN
#endif
#define MSG_MUST_CONVERT_HDR_ENDIAN(ctrl) \
(((ctrl) & MSG_HDR_ENDIAN_MASK) != MSG_HDR_ENDIAN)
#define MSG_MUST_CONVERT_DATA_ENDIAN(ctrl) \
(((ctrl) & MSG_DATA_ENDIAN_MASK) != MSG_DATA_ENDIAN)
#if PSP_ENDIAN == MQX_LITTLE_ENDIAN
#define MSG_SET_DATA_ENDIAN(ctrl) (ctrl |= MSG_DATA_LITTLE_ENDIAN)
#else
#define MSG_SET_DATA_ENDIAN(ctrl) (ctrl &= ~MSG_DATA_LITTLE_ENDIAN)
#endif
/*--------------------------------------------------------------------------*/
/*
* TYPEDEFS FOR _CODE_PTR_ FUNCTIONS
*/
typedef void (_CODE_PTR_ MSGQ_NOTIFICATION_FPTR)( pointer);
/*--------------------------------------------------------------------------*/
/* DATATYPE DEFINITIONS */
typedef pointer _pool_id; /* what a pool_id looks like */
typedef uint_16 _msg_size; /* what a message size looks like */
#if MQX_USE_32BIT_MESSAGE_QIDS
typedef uint_32 _queue_number; /* what a queue number is */
typedef uint_32 _queue_id; /* What a queue_id looks like */
#else
typedef uint_16 _queue_number; /* what a queue number is */
typedef uint_16 _queue_id; /* What a queue_id looks like */
#endif
/*--------------------------------------------------------------------------*/
/* MESSAGE HEADER STRUCT */
/*!
* \brief This structure defines the first field (header) of any message.
*
* Any pool of messsages must have at least this size and must start with a
* message header.
*
* \see _msg_alloc
* \see _msg_alloc_system
* \see _msg_free
* \see _msgq_poll
* \see _msgq_receive
* \see _msgq_receive_for
* \see _msgq_receive_ticks
* \see _msgq_receive_until
* \see _msgq_send
*/
typedef struct message_header_struct
{
/*!
* \brief The size of the DATA field in bytes, including the header. The
* maximum value is MAX_MESSAGE_SIZE. This field is set by the application.
*/
_msg_size SIZE;
#if MQX_USE_32BIT_MESSAGE_QIDS
uint_16 PAD;
#endif
/*!
* \brief Queue ID of the queue to which MQX is to send the message. This
* field is set by the application.
*/
_queue_id TARGET_QID;
/*!
* \brief Queue ID of a message queue that is associated with the sending
* task.
*
* When messages are allocated, this field is initialized to MSGQ_NULL_QUEUE_ID.
* If the sending task does not have a message queue associated with it, MQX
* does not use this field.
*/
_queue_id SOURCE_QID;
/*!
* \brief Indicates the following for the message: endian format, priority
* and urgency.
*/
uchar CONTROL;
#if MQX_USE_32BIT_MESSAGE_QIDS
/*! \brief Not used. */
uchar RESERVED[3];
#else
/*! \brief Not used. */
uchar RESERVED;
#endif
} MESSAGE_HEADER_STRUCT, _PTR_ MESSAGE_HEADER_STRUCT_PTR;
/*--------------------------------------------------------------------------*/
/* EXTERNAL DECLARATIONS */
#ifdef __cplusplus
extern "C" {
#endif
#ifndef __TAD_COMPILE__
extern pointer _msg_alloc(_pool_id);
extern pointer _msg_alloc_system(_msg_size);
extern _mqx_uint _msg_available(_pool_id);
extern _mqx_uint _msg_create_component(void);
extern void _msg_free(pointer);
extern void _msg_swap_endian_data(uchar _PTR_,
MESSAGE_HEADER_STRUCT_PTR);
extern void _msg_swap_endian_header(MESSAGE_HEADER_STRUCT_PTR);
extern _pool_id _msgpool_create(uint_16, uint_16, uint_16, uint_16);
extern boolean _msgpool_create_system(uint_16, uint_16, uint_16,
uint_16);
extern _mqx_uint _msgpool_destroy(_pool_id);
extern _mqx_uint _msgpool_test(pointer _PTR_, pointer _PTR_);
extern boolean _msgq_close(_queue_id);
extern _mqx_uint _msgq_get_count(_queue_id);
extern _queue_id _msgq_get_id(_processor_number, _queue_number);
extern _task_id _msgq_get_owner(_queue_id);
extern _mqx_uint _msgq_get_notification_function(_queue_id,
MSGQ_NOTIFICATION_FPTR _PTR_, pointer _PTR_);
extern _queue_id _msgq_open(_queue_number, uint_16);
extern _queue_id _msgq_open_system(_queue_number, uint_16,
MSGQ_NOTIFICATION_FPTR, pointer);
extern pointer _msgq_poll(_queue_id);
extern pointer _msgq_peek(_queue_id);
extern pointer _msgq_receive(_queue_id, uint_32);
extern pointer _msgq_receive_for(_queue_id, MQX_TICK_STRUCT_PTR);
extern pointer _msgq_receive_ticks(_queue_id, _mqx_uint);
extern pointer _msgq_receive_until(_queue_id, MQX_TICK_STRUCT_PTR);
extern boolean _msgq_send(pointer);
extern _mqx_uint _msgq_send_broadcast(pointer, _queue_id _PTR_, _pool_id);
extern boolean _msgq_send_queue(pointer, _queue_id);
extern boolean _msgq_send_urgent(pointer);
extern boolean _msgq_send_priority(pointer, _mqx_uint);
extern MSGQ_NOTIFICATION_FPTR _msgq_set_notification_function(_queue_id,
MSGQ_NOTIFICATION_FPTR, pointer);
extern _mqx_uint _msgq_test(pointer _PTR_, pointer _PTR_);
#endif
#ifdef __cplusplus
}
#endif
#endif
/* EOF */