| /** |
| * @file IxOsal.h |
| * |
| * @brief Top include file for OSAL |
| * |
| * |
| * @par |
| * IXP400 SW Release version 2.0 |
| * |
| * -- Copyright Notice -- |
| * |
| * @par |
| * Copyright 2001-2005, Intel Corporation. |
| * All rights reserved. |
| * |
| * @par |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * 1. Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * 2. Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in the |
| * documentation and/or other materials provided with the distribution. |
| * 3. Neither the name of the Intel Corporation nor the names of its contributors |
| * may be used to endorse or promote products derived from this software |
| * without specific prior written permission. |
| * |
| * @par |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' |
| * AND ANY EXPRESS 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 THE COPYRIGHT OWNER OR 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. |
| * |
| * @par |
| * -- End of Copyright Notice -- |
| */ |
| |
| #ifndef IxOsal_H |
| #define IxOsal_H |
| |
| /* Basic types */ |
| #include "IxOsalTypes.h" |
| |
| /* Include assert */ |
| #include "IxOsalAssert.h" |
| |
| /* |
| * Config header gives users option to choose IO MEM |
| * and buffer management modules |
| */ |
| |
| #include "IxOsalConfig.h" |
| |
| /* |
| * Symbol file needed by some OS. |
| */ |
| #include "IxOsalUtilitySymbols.h" |
| |
| /* OS-specific header */ |
| #include "IxOsalOs.h" |
| |
| |
| /** |
| * @defgroup IxOsal Operating System Abstraction Layer (IxOsal) API |
| * |
| * @brief This service provides a thin layer of OS dependency services. |
| * |
| * This file contains the API to the functions which are some what OS dependant and would |
| * require porting to a particular OS. |
| * A primary focus of the component development is to make them as OS independent as possible. |
| * All other components should abstract their OS dependency to this module. |
| * Services overview |
| * -# Data types, constants, defines |
| * -# Interrupts |
| * - bind interrupts to handlers |
| * - unbind interrupts from handlers |
| * - disables all interrupts |
| * - enables all interrupts |
| * - selectively disables interrupts |
| * - enables an interrupt level |
| * - disables an interrupt level |
| * -# Memory |
| * - allocates memory |
| * - frees memory |
| * - copies memory zones |
| * - fills a memory zone |
| * - allocates cache-safe memory |
| * - frees cache-safe memory |
| * - physical to virtual address translation |
| * - virtual to physical address translation |
| * - cache to memory flush |
| * - cache line invalidate |
| * -# Threads |
| * - creates a new thread |
| * - starts a newly created thread |
| * - kills an existing thread |
| * - exits a running thread |
| * - sets the priority of an existing thread |
| * - suspends thread execution |
| * - resumes thread execution |
| * -# IPC |
| * - creates a message queue |
| * - deletes a message queue |
| * - sends a message to a message queue |
| * - receives a message from a message queue |
| * -# Thread Synchronisation |
| * - initializes a mutex |
| * - locks a mutex |
| * - unlocks a mutex |
| * - non-blocking attempt to lock a mutex |
| * - destroys a mutex object |
| * - initializes a fast mutex |
| * - non-blocking attempt to lock a fast mutex |
| * - unlocks a fast mutex |
| * - destroys a fast mutex object |
| * - initializes a semaphore |
| * - posts to (increments) a semaphore |
| * - waits on (decrements) a semaphore |
| * - non-blocking wait on semaphore |
| * - gets semaphore value |
| * - destroys a semaphore object |
| * - yields execution of current thread |
| * -# Time functions |
| * - yielding sleep for a number of milliseconds |
| * - busy sleep for a number of microseconds |
| * - value of the timestamp counter |
| * - resolution of the timestamp counter |
| * - system clock rate, in ticks |
| * - current system time |
| * - converts ixOsalTimeVal into ticks |
| * - converts ticks into ixOsalTimeVal |
| * - converts ixOsalTimeVal to milliseconds |
| * - converts milliseconds to IxOsalTimeval |
| * - "equal" comparison for IxOsalTimeval |
| * - "less than" comparison for IxOsalTimeval |
| * - "greater than" comparison for IxOsalTimeval |
| * - "add" operator for IxOsalTimeval |
| * - "subtract" operator for IxOsalTimeval |
| * -# Logging |
| * - sets the current logging verbosity level |
| * - interrupt-safe logging function |
| * -# Timer services |
| * - schedules a repeating timer |
| * - schedules a single-shot timer |
| * - cancels a running timer |
| * - displays all the running timers |
| * -# Optional Modules |
| * - Buffer management module |
| * - I/O memory and endianess support module |
| * |
| * @{ |
| */ |
| |
| |
| /* |
| * Prototypes |
| */ |
| |
| /* ========================== Interrupts ================================ |
| * |
| */ |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief Binds an interrupt handler to an interrupt level |
| * |
| * @param irqLevel (in) - interrupt level |
| * @param irqHandler (in) - interrupt handler |
| * @param parameter (in) - custom parameter to be passed to the |
| * interrupt handler |
| * |
| * Binds an interrupt handler to an interrupt level. The operation will |
| * fail if the wrong level is selected, if the handler is NULL, or if the |
| * interrupt is already bound. This functions binds the specified C |
| * routine to an interrupt level. When called, the "parameter" value will |
| * be passed to the routine. |
| * |
| * Reentrant: no |
| * IRQ safe: no |
| * |
| * @return IX_SUCCESS if the operation succeeded or IX_FAIL otherwise |
| */ |
| PUBLIC IX_STATUS ixOsalIrqBind (UINT32 irqLevel, |
| IxOsalVoidFnVoidPtr irqHandler, |
| void *parameter); |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief Unbinds an interrupt handler from an interrupt level |
| * |
| * @param irqLevel (in) - interrupt level |
| * |
| * Unbinds the selected interrupt level from any previously registered |
| * handler |
| * |
| * @li Reentrant: no |
| * @li IRQ safe: no |
| * |
| * @return IX_SUCCESS if the operation succeeded or IX_FAIL otherwise |
| */ |
| PUBLIC IX_STATUS ixOsalIrqUnbind (UINT32 irqLevel); |
| |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief Disables all interrupts |
| * |
| * @param - none |
| * |
| * Disables all the interrupts and prevents tasks scheduling |
| * |
| * @li Reentrant: no |
| * @li IRQ safe: yes |
| * |
| * @return interrupt enable status prior to locking |
| */ |
| PUBLIC UINT32 ixOsalIrqLock (void); |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief Enables all interrupts |
| * |
| * @param irqEnable (in) - interrupt enable status, prior to interrupt |
| * locking |
| * |
| * Enables the interrupts and task scheduling, cancelling the effect |
| * of ixOsalIrqLock() |
| * |
| * @li Reentrant: no |
| * @li IRQ safe: yes |
| * |
| * @return IX_SUCCESS if the operation succeeded or IX_FAIL otherwise |
| */ |
| PUBLIC void ixOsalIrqUnlock (UINT32 irqEnable); |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief Selectively disables interrupts |
| * |
| * @param irqLevel - new interrupt level |
| * |
| * Disables the interrupts below the specified interrupt level |
| * |
| * @li Reentrant: no |
| * @li IRQ safe: yes |
| * |
| * @note Depending on the implementation this function can disable all |
| * the interrupts |
| * |
| * @return previous interrupt level |
| */ |
| PUBLIC UINT32 ixOsalIrqLevelSet (UINT32 irqLevel); |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief Enables an interrupt level |
| * |
| * @param irqLevel - interrupt level to enable |
| * |
| * Enables the specified interrupt level |
| * |
| * @li Reentrant: no |
| * @li IRQ safe: yes |
| * |
| * @return - none |
| */ |
| PUBLIC void ixOsalIrqEnable (UINT32 irqLevel); |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief Disables an interrupt level |
| * |
| * @param irqLevel - interrupt level to disable |
| * |
| * Disables the specified interrupt level |
| * |
| * @li Reentrant: no |
| * @li IRQ safe: yes |
| * |
| * @return - none |
| */ |
| PUBLIC void ixOsalIrqDisable (UINT32 irqLevel); |
| |
| |
| /* ============================= Memory ================================= |
| * |
| */ |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief Allocates memory |
| * |
| * @param size - memory size to allocate, in bytes |
| * |
| * Allocates a memory zone of a given size |
| * |
| * @li Reentrant: no |
| * @li IRQ safe: no |
| * |
| * @return Pointer to the allocated zone or NULL if the allocation failed |
| */ |
| PUBLIC void *ixOsalMemAlloc (UINT32 size); |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief Frees memory |
| * |
| * @param ptr - pointer to the memory zone |
| * |
| * Frees a previously allocated memory zone |
| * |
| * @li Reentrant: no |
| * @li IRQ safe: no |
| * |
| * @return - none |
| */ |
| PUBLIC void ixOsalMemFree (void *ptr); |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief Copies memory zones |
| * |
| * @param dest - destination memory zone |
| * @param src - source memory zone |
| * @param count - number of bytes to copy |
| * |
| * Copies count bytes from the source memory zone pointed by src into the |
| * memory zone pointed by dest. |
| * |
| * @li Reentrant: no |
| * @li IRQ safe: yes |
| * |
| * @return Pointer to the destination memory zone |
| */ |
| PUBLIC void *ixOsalMemCopy (void *dest, void *src, UINT32 count); |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief Fills a memory zone |
| * |
| * @param ptr - pointer to the memory zone |
| * @param filler - byte to fill the memory zone with |
| * @param count - number of bytes to fill |
| * |
| * Fills a memory zone with a given constant byte |
| * |
| * @li Reentrant: no |
| * @li IRQ safe: yes |
| * |
| * @return Pointer to the memory zone |
| */ |
| PUBLIC void *ixOsalMemSet (void *ptr, UINT8 filler, UINT32 count); |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief Allocates cache-safe memory |
| * |
| * @param size - size, in bytes, of the allocated zone |
| * |
| * Allocates a cache-safe memory zone of at least "size" bytes and returns |
| * the pointer to the memory zone. This memory zone, depending on the |
| * platform, is either uncached or aligned on a cache line boundary to make |
| * the CACHE_FLUSH and CACHE_INVALIDATE macros safe to use. The memory |
| * allocated with this function MUST be freed with ixOsalCacheDmaFree(), |
| * otherwise memory corruption can occur. |
| * |
| * @li Reentrant: no |
| * @li IRQ safe: no |
| * |
| * @return Pointer to the memory zone or NULL if allocation failed |
| * |
| * @note It is important to note that cache coherence is maintained in |
| * software by using the IX_OSAL_CACHE_FLUSH and IX_OSAL_CACHE_INVALIDATE |
| * macros to maintain consistency between cache and external memory. |
| */ |
| PUBLIC void *ixOsalCacheDmaMalloc (UINT32 size); |
| |
| /* Macros for ixOsalCacheDmaMalloc*/ |
| #define IX_OSAL_CACHE_DMA_MALLOC(size) ixOsalCacheDmaMalloc(size) |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief Frees cache-safe memory |
| * |
| * @param ptr - pointer to the memory zone |
| * |
| * Frees a memory zone previously allocated with ixOsalCacheDmaMalloc() |
| * |
| * @li Reentrant: no |
| * @li IRQ safe: no |
| * |
| * @return - none |
| */ |
| PUBLIC void ixOsalCacheDmaFree (void *ptr); |
| |
| #define IX_OSAL_CACHE_DMA_FREE(ptr) ixOsalCacheDmaFree(ptr) |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief physical to virtual address translation |
| * |
| * @param physAddr - physical address |
| * |
| * Converts a physical address into its equivalent MMU-mapped virtual address |
| * |
| * @li Reentrant: no |
| * @li IRQ safe: yes |
| * |
| * @return Corresponding virtual address, as UINT32 |
| */ |
| #define IX_OSAL_MMU_PHYS_TO_VIRT(physAddr) \ |
| IX_OSAL_OS_MMU_PHYS_TO_VIRT(physAddr) |
| |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief virtual to physical address translation |
| * |
| * @param virtAddr - virtual address |
| * |
| * Converts a virtual address into its equivalent MMU-mapped physical address |
| * |
| * @li Reentrant: no |
| * @li IRQ safe: yes |
| * |
| * @return Corresponding physical address, as UINT32 |
| */ |
| #define IX_OSAL_MMU_VIRT_TO_PHYS(virtAddr) \ |
| IX_OSAL_OS_MMU_VIRT_TO_PHYS(virtAddr) |
| |
| |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief cache to memory flush |
| * |
| * @param addr - memory address to flush from cache |
| * @param size - number of bytes to flush (rounded up to a cache line) |
| * |
| * Flushes the cached value of the memory zone pointed by "addr" into memory, |
| * rounding up to a cache line. Use before the zone is to be read by a |
| * processing unit which is not cache coherent with the main CPU. |
| * |
| * @li Reentrant: no |
| * @li IRQ safe: yes |
| * |
| * @return - none |
| */ |
| #define IX_OSAL_CACHE_FLUSH(addr, size) IX_OSAL_OS_CACHE_FLUSH(addr, size) |
| |
| |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief cache line invalidate |
| * |
| * @param addr - memory address to invalidate in cache |
| * @param size - number of bytes to invalidate (rounded up to a cache line) |
| * |
| * Invalidates the cached value of the memory zone pointed by "addr", |
| * rounding up to a cache line. Use before reading the zone from the main |
| * CPU, if the zone has been updated by a processing unit which is not cache |
| * coherent with the main CPU. |
| * |
| * @li Reentrant: no |
| * @li IRQ safe: yes |
| * |
| * @return - none |
| */ |
| #define IX_OSAL_CACHE_INVALIDATE(addr, size) IX_OSAL_OS_CACHE_INVALIDATE(addr, size) |
| |
| |
| /* ============================= Threads ================================= |
| * |
| */ |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief Creates a new thread |
| * |
| * @param thread - handle of the thread to be created |
| * @param threadAttr - pointer to a thread attribute object |
| * @param startRoutine - thread entry point |
| * @param arg - argument given to the thread |
| * |
| * Creates a thread given a thread handle and a thread attribute object. The |
| * same thread attribute object can be used to create separate threads. "NULL" |
| * can be specified as the attribute, in which case the default values will |
| * be used. The thread needs to be explicitly started using ixOsalThreadStart(). |
| * |
| * @li Reentrant: no |
| * @li IRQ safe: no |
| * |
| * @return - IX_SUCCESS/IX_FAIL |
| */ |
| PUBLIC IX_STATUS ixOsalThreadCreate (IxOsalThread * thread, |
| IxOsalThreadAttr * threadAttr, |
| IxOsalVoidFnVoidPtr startRoutine, |
| void *arg); |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief Starts a newly created thread |
| * |
| * @param thread - handle of the thread to be started |
| * |
| * Starts a thread given its thread handle. This function is to be called |
| * only once, following the thread initialization. |
| * |
| * @li Reentrant: no |
| * @li IRQ safe: no |
| * |
| * @return - IX_SUCCESS/IX_FAIL |
| */ |
| PUBLIC IX_STATUS ixOsalThreadStart (IxOsalThread * thread); |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief Kills an existing thread |
| * |
| * @param thread - handle of the thread to be killed |
| * |
| * Kills a thread given its thread handle. |
| * |
| * @li Reentrant: no |
| * @li IRQ safe: no |
| * |
| * @note It is not possible to kill threads in Linux kernel mode. This |
| * function will only send a SIGTERM signal, and it is the responsibility |
| * of the thread to check for the presence of this signal with |
| * signal_pending(). |
| * |
| * @return - IX_SUCCESS/IX_FAIL |
| */ |
| PUBLIC IX_STATUS ixOsalThreadKill (IxOsalThread * thread); |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief Exits a running thread |
| * |
| * Terminates the calling thread |
| * |
| * @li Reentrant: no |
| * @li IRQ safe: no |
| * |
| * @return - This function never returns |
| */ |
| PUBLIC void ixOsalThreadExit (void); |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief Sets the priority of an existing thread |
| * |
| * @param thread - handle of the thread |
| * @param priority - new priority, between 0 and 255 (0 being the highest) |
| * |
| * Sets the thread priority |
| * |
| * @li Reentrant: no |
| * @li IRQ safe: no |
| * |
| * @return - IX_SUCCESS/IX_FAIL |
| */ |
| PUBLIC IX_STATUS ixOsalThreadPrioritySet (IxOsalThread * thread, |
| UINT32 priority); |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief Suspends thread execution |
| * |
| * @param thread - handle of the thread |
| * |
| * Suspends the thread execution |
| * |
| * @li Reentrant: no |
| * @li IRQ safe: no |
| * |
| * @return - IX_SUCCESS/IX_FAIL |
| */ |
| PUBLIC IX_STATUS ixOsalThreadSuspend (IxOsalThread * thread); |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief Resumes thread execution |
| * |
| * @param thread - handle of the thread |
| * |
| * Resumes the thread execution |
| * |
| * @li Reentrant: no |
| * @li IRQ safe: no |
| * |
| * @return - IX_SUCCESS/IX_FAIL |
| */ |
| PUBLIC IX_STATUS ixOsalThreadResume (IxOsalThread * thread); |
| |
| |
| /* ======================= Message Queues (IPC) ========================== |
| * |
| */ |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief Creates a message queue |
| * |
| * @param queue - queue handle |
| * @param msgCount - maximum number of messages to hold in the queue |
| * @param msgLen - maximum length of each message, in bytes |
| * |
| * Creates a message queue of msgCount messages, each containing msgLen bytes |
| * |
| * @li Reentrant: no |
| * @li IRQ safe: no |
| * |
| * @return - IX_SUCCESS/IX_FAIL |
| */ |
| PUBLIC IX_STATUS ixOsalMessageQueueCreate (IxOsalMessageQueue * queue, |
| UINT32 msgCount, UINT32 msgLen); |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief Deletes a message queue |
| * |
| * @param queue - queue handle |
| * |
| * Deletes a message queue |
| * |
| * @li Reentrant: no |
| * @li IRQ safe: no |
| * |
| * @return - IX_SUCCESS/IX_FAIL |
| */ |
| PUBLIC IX_STATUS ixOsalMessageQueueDelete (IxOsalMessageQueue * queue); |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief Sends a message to a message queue |
| * |
| * @param queue - queue handle |
| * @param message - message to send |
| * |
| * Sends a message to the message queue. The message will be copied (at the |
| * configured size of the message) into the queue. |
| * |
| * @li Reentrant: yes |
| * @li IRQ safe: yes |
| * |
| * @return - IX_SUCCESS/IX_FAIL |
| */ |
| PUBLIC IX_STATUS ixOsalMessageQueueSend (IxOsalMessageQueue * queue, |
| UINT8 * message); |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief Receives a message from a message queue |
| * |
| * @param queue - queue handle |
| * @param message - pointer to where the message should be copied to |
| * |
| * Retrieves the first message from the message queue |
| * |
| * @li Reentrant: yes |
| * @li IRQ safe: yes |
| * |
| * @return - IX_SUCCESS/IX_FAIL |
| */ |
| PUBLIC IX_STATUS ixOsalMessageQueueReceive (IxOsalMessageQueue * queue, |
| UINT8 * message); |
| |
| |
| /* ======================= Thread Synchronisation ======================== |
| * |
| */ |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief initializes a mutex |
| * |
| * @param mutex - mutex handle |
| * |
| * Initializes a mutex object |
| * |
| * @li Reentrant: no |
| * @li IRQ safe: no |
| * |
| * @return - IX_SUCCESS/IX_FAIL |
| */ |
| PUBLIC IX_STATUS ixOsalMutexInit (IxOsalMutex * mutex); |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief locks a mutex |
| * |
| * @param mutex - mutex handle |
| * @param timeout - timeout in ms; IX_OSAL_WAIT_FOREVER (-1) to wait forever |
| * or IX_OSAL_WAIT_NONE to return immediately |
| * |
| * Locks a mutex object |
| * |
| * @li Reentrant: yes |
| * @li IRQ safe: no |
| * |
| * @return - IX_SUCCESS/IX_FAIL |
| */ |
| PUBLIC IX_STATUS ixOsalMutexLock (IxOsalMutex * mutex, INT32 timeout); |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief Unlocks a mutex |
| * |
| * @param mutex - mutex handle |
| * |
| * Unlocks a mutex object |
| * |
| * @li Reentrant: yes |
| * @li IRQ safe: yes |
| * |
| * @return - IX_SUCCESS/IX_FAIL |
| */ |
| PUBLIC IX_STATUS ixOsalMutexUnlock (IxOsalMutex * mutex); |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief Non-blocking attempt to lock a mutex |
| * |
| * @param mutex - mutex handle |
| * |
| * Attempts to lock a mutex object, returning immediately with IX_SUCCESS if |
| * the lock was successful or IX_FAIL if the lock failed |
| * |
| * @li Reentrant: yes |
| * @li IRQ safe: no |
| * |
| * @return - IX_SUCCESS/IX_FAIL |
| */ |
| PUBLIC IX_STATUS ixOsalMutexTryLock (IxOsalMutex * mutex); |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief Destroys a mutex object |
| * |
| * @param mutex - mutex handle |
| * @param |
| * |
| * Destroys a mutex object; the caller should ensure that no thread is |
| * blocked on this mutex |
| * |
| * @li Reentrant: no |
| * @li IRQ safe: no |
| * |
| * @return - IX_SUCCESS/IX_FAIL |
| */ |
| PUBLIC IX_STATUS ixOsalMutexDestroy (IxOsalMutex * mutex); |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief Initializes a fast mutex |
| * |
| * @param mutex - fast mutex handle |
| * |
| * Initializes a fast mutex object |
| * |
| * @li Reentrant: yes |
| * @li IRQ safe: yes |
| * |
| * @return - IX_SUCCESS/IX_FAIL |
| */ |
| PUBLIC IX_STATUS ixOsalFastMutexInit (IxOsalFastMutex * mutex); |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief Non-blocking attempt to lock a fast mutex |
| * |
| * @param mutex - fast mutex handle |
| * |
| * Attempts to lock a fast mutex object, returning immediately with |
| * IX_SUCCESS if the lock was successful or IX_FAIL if the lock failed |
| * |
| * @li Reentrant: yes |
| * @li IRQ safe: yes |
| * |
| * @return - IX_SUCCESS/IX_FAIL |
| */ |
| PUBLIC IX_STATUS ixOsalFastMutexTryLock (IxOsalFastMutex * mutex); |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief Unlocks a fast mutex |
| * |
| * @param mutex - fast mutex handle |
| * |
| * Unlocks a fast mutex object |
| * |
| * @li Reentrant: yes |
| * @li IRQ safe: yes |
| * |
| * @return - IX_SUCCESS/IX_FAIL |
| */ |
| PUBLIC IX_STATUS ixOsalFastMutexUnlock (IxOsalFastMutex * mutex); |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief Destroys a fast mutex object |
| * |
| * @param mutex - fast mutex handle |
| * |
| * Destroys a fast mutex object |
| * |
| * @li Reentrant: yes |
| * @li IRQ safe: yes |
| * |
| * @return - IX_SUCCESS/IX_FAIL |
| */ |
| PUBLIC IX_STATUS ixOsalFastMutexDestroy (IxOsalFastMutex * mutex); |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief Initializes a semaphore |
| * |
| * @param semaphore - semaphore handle |
| * @param value - initial semaphore value |
| * |
| * Initializes a semaphore object |
| * |
| * @li Reentrant: no |
| * @li IRQ safe: no |
| * |
| * @return - IX_SUCCESS/IX_FAIL |
| */ |
| PUBLIC IX_STATUS ixOsalSemaphoreInit (IxOsalSemaphore * semaphore, |
| UINT32 value); |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief Posts to (increments) a semaphore |
| * |
| * @param semaphore - semaphore handle |
| * |
| * Increments a semaphore object |
| * |
| * @li Reentrant: no |
| * @li IRQ safe: yes |
| * |
| * @return - IX_SUCCESS/IX_FAIL |
| */ |
| PUBLIC IX_STATUS ixOsalSemaphorePost (IxOsalSemaphore * semaphore); |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief Waits on (decrements) a semaphore |
| * |
| * @param semaphore - semaphore handle |
| * @param timeout - timeout, in ms; IX_OSAL_WAIT_FOREVER (-1) if the thread |
| * is to block indefinitely or IX_OSAL_WAIT_NONE (0) if the thread is to |
| * return immediately even if the call fails |
| * |
| * Decrements a semaphore, blocking if the semaphore is |
| * unavailable (value is 0). |
| * |
| * @li Reentrant: no |
| * @li IRQ safe: no |
| * |
| * @return - IX_SUCCESS/IX_FAIL |
| */ |
| PUBLIC IX_STATUS ixOsalSemaphoreWait (IxOsalSemaphore * semaphore, |
| INT32 timeout); |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief Non-blocking wait on semaphore |
| * |
| * @param semaphore - semaphore handle |
| * |
| * Decrements a semaphore, not blocking the calling thread if the semaphore |
| * is unavailable |
| * |
| * @li Reentrant: no |
| * @li IRQ safe: no |
| * |
| * @return - IX_SUCCESS/IX_FAIL |
| */ |
| PUBLIC IX_STATUS ixOsalSemaphoreTryWait (IxOsalSemaphore * semaphore); |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief Gets semaphore value |
| * |
| * @param semaphore - semaphore handle |
| * @param value - location to store the semaphore value |
| * |
| * Retrieves the current value of a semaphore object |
| * |
| * @li Reentrant: no |
| * @li IRQ safe: no |
| * |
| * @return - IX_SUCCESS/IX_FAIL |
| */ |
| PUBLIC IX_STATUS ixOsalSemaphoreGetValue (IxOsalSemaphore * semaphore, |
| UINT32 * value); |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief Destroys a semaphore object |
| * |
| * @param semaphore - semaphore handle |
| * |
| * Destroys a semaphore object; the caller should ensure that no thread is |
| * blocked on this semaphore |
| * |
| * @li Reentrant: no |
| * @li IRQ safe: no |
| * |
| * @return - IX_SUCCESS/IX_FAIL |
| */ |
| PUBLIC IX_STATUS ixOsalSemaphoreDestroy (IxOsalSemaphore * semaphore); |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief Yields execution of current thread |
| * |
| * Yields the execution of the current thread |
| * |
| * @li Reentrant: no |
| * @li IRQ safe: no |
| * |
| * @return - none |
| */ |
| PUBLIC void ixOsalYield (void); |
| |
| |
| /* ========================== Time functions =========================== |
| * |
| */ |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief Yielding sleep for a number of milliseconds |
| * |
| * @param milliseconds - number of milliseconds to sleep |
| * |
| * The calling thread will sleep for the specified number of milliseconds. |
| * This sleep is yielding, hence other tasks will be scheduled by the |
| * operating system during the sleep period. Calling this function with an |
| * argument of 0 will place the thread at the end of the current scheduling |
| * loop. |
| * |
| * @li Reentrant: no |
| * @li IRQ safe: no |
| * |
| * @return - none |
| */ |
| PUBLIC void ixOsalSleep (UINT32 milliseconds); |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief Busy sleep for a number of microseconds |
| * |
| * @param microseconds - number of microseconds to sleep |
| * |
| * Sleeps for the specified number of microseconds, without explicitly |
| * yielding thread execution to the OS scheduler |
| * |
| * @li Reentrant: yes |
| * @li IRQ safe: yes |
| * |
| * @return - none |
| */ |
| PUBLIC void ixOsalBusySleep (UINT32 microseconds); |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief XXX |
| * |
| * Retrieves the current timestamp |
| * |
| * @li Reentrant: yes |
| * @li IRQ safe: yes |
| * |
| * @return - The current timestamp |
| * |
| * @note The implementation of this function is platform-specific. Not |
| * all the platforms provide a high-resolution timestamp counter. |
| */ |
| PUBLIC UINT32 ixOsalTimestampGet (void); |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief Resolution of the timestamp counter |
| * |
| * Retrieves the resolution (frequency) of the timestamp counter. |
| * |
| * @li Reentrant: yes |
| * @li IRQ safe: yes |
| * |
| * @return - The resolution of the timestamp counter |
| * |
| * @note The implementation of this function is platform-specific. Not all |
| * the platforms provide a high-resolution timestamp counter. |
| */ |
| PUBLIC UINT32 ixOsalTimestampResolutionGet (void); |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief System clock rate, in ticks |
| * |
| * Retrieves the resolution (number of ticks per second) of the system clock |
| * |
| * @li Reentrant: no |
| * @li IRQ safe: no |
| * |
| * @return - The system clock rate |
| * |
| * @note The implementation of this function is platform and OS-specific. |
| * The system clock rate is not always available - e.g. Linux does not |
| * provide this information in user mode |
| */ |
| PUBLIC UINT32 ixOsalSysClockRateGet (void); |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief Current system time |
| * |
| * @param tv - pointer to an IxOsalTimeval structure to store the current |
| * time in |
| * |
| * Retrieves the current system time (real-time) |
| * |
| * @li Reentrant: no |
| * @li IRQ safe: no |
| * |
| * @return - none |
| * |
| * @note The implementation of this function is platform-specific. Not all |
| * platforms have a real-time clock. |
| */ |
| PUBLIC void ixOsalTimeGet (IxOsalTimeval * tv); |
| |
| |
| |
| /* Internal function to convert timer val to ticks. |
| * NOTE - This should not be called by the user. |
| * Use the macro IX_OSAL_TIMEVAL_TO_TICKS |
| * OS-independent, implemented in framework. |
| */ |
| PUBLIC UINT32 ixOsalTimevalToTicks (IxOsalTimeval tv); |
| |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief Converts ixOsalTimeVal into ticks |
| * |
| * @param tv - an IxOsalTimeval structure |
| * |
| * Converts an IxOsalTimeval structure into OS ticks |
| * |
| * @li Reentrant: yes |
| * @li IRQ safe: yes |
| * |
| * @return - Corresponding number of ticks |
| * |
| * Note: This function is OS-independent. Implemented by core. |
| */ |
| #define IX_OSAL_TIMEVAL_TO_TICKS(tv) ixOsalTimevalToTicks(tv) |
| |
| |
| |
| /* Internal function to convert ticks to timer val |
| * NOTE - This should not be called by the user. |
| * Use the macro IX_OSAL_TICKS_TO_TIMEVAL |
| */ |
| |
| PUBLIC void ixOsalTicksToTimeval (UINT32 ticks, IxOsalTimeval * pTv); |
| |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief Converts ticks into ixOsalTimeVal |
| * |
| * @param ticks - number of ticks |
| * @param pTv - pointer to the destination structure |
| * |
| * Converts the specified number of ticks into an IxOsalTimeval structure |
| * |
| * @li Reentrant: yes |
| * @li IRQ safe: yes |
| * |
| * @return - Corresponding IxOsalTimeval structure |
| * Note: This function is OS-independent. Implemented by core. |
| */ |
| #define IX_OSAL_TICKS_TO_TIMEVAL(ticks, pTv) \ |
| ixOsalTicksToTimeval(ticks, pTv) |
| |
| |
| |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief Converts ixOsalTimeVal to milliseconds |
| * |
| * @param tv - IxOsalTimeval structure to convert |
| * |
| * Converts an IxOsalTimeval structure into milliseconds |
| * |
| * @li Reentrant: yes |
| * @li IRQ safe: yes |
| * |
| * @return - Corresponding number of milliseconds |
| * Note: This function is OS-independent. Implemented by core. |
| */ |
| #define IX_OSAL_TIMEVAL_TO_MS(tv) ((tv.secs * 1000) + (tv.nsecs / 1000000)) |
| |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief Converts milliseconds to IxOsalTimeval |
| * |
| * @param milliseconds - number of milliseconds to convert |
| * @param pTv - pointer to the destination structure |
| * |
| * Converts a millisecond value into an IxOsalTimeval structure |
| * |
| * @li Reentrant: yes |
| * @li IRQ safe: yes |
| * |
| * @return - Corresponding IxOsalTimeval structure |
| * Note: This function is OS-independent. Implemented by core. |
| */ |
| #define IX_OSAL_MS_TO_TIMEVAL(milliseconds, pTv) \ |
| ((IxOsalTimeval *) pTv)->secs = milliseconds / 1000; \ |
| ((IxOsalTimeval *) pTv)->nsecs = (milliseconds % 1000) * 1000000 |
| |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief "equal" comparison for IxOsalTimeval |
| * |
| * @param tvA, tvB - IxOsalTimeval structures to compare |
| * |
| * Compares two IxOsalTimeval structures for equality |
| * |
| * @li Reentrant: yes |
| * @li IRQ safe: yes |
| * |
| * @return - true if the structures are equal |
| * - false otherwise |
| * Note: This function is OS-independant |
| */ |
| #define IX_OSAL_TIME_EQ(tvA, tvB) \ |
| ((tvA).secs == (tvB).secs && (tvA).nsecs == (tvB).nsecs) |
| |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief "less than" comparison for IxOsalTimeval |
| * |
| * @param tvA, tvB - IxOsalTimeval structures to compare |
| * |
| * Compares two IxOsalTimeval structures to determine if the first one is |
| * less than the second one |
| * |
| * @li Reentrant: yes |
| * @li IRQ safe: yes |
| * |
| * @return - true if tvA < tvB |
| * - false otherwise |
| * Note: This function is OS-independent. Implemented by core. |
| */ |
| #define IX_OSAL_TIME_LT(tvA,tvB) \ |
| ((tvA).secs < (tvB).secs || \ |
| ((tvA).secs == (tvB).secs && (tvA).nsecs < (tvB).nsecs)) |
| |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief "greater than" comparison for IxOsalTimeval |
| * |
| * @param tvA, tvB - IxOsalTimeval structures to compare |
| * |
| * Compares two IxOsalTimeval structures to determine if the first one is |
| * greater than the second one |
| * |
| * @li Reentrant: yes |
| * @li IRQ safe: yes |
| * |
| * @return - true if tvA > tvB |
| * - false otherwise |
| * Note: This function is OS-independent. |
| */ |
| #define IX_OSAL_TIME_GT(tvA, tvB) \ |
| ((tvA).secs > (tvB).secs || \ |
| ((tvA).secs == (tvB).secs && (tvA).nsecs > (tvB).nsecs)) |
| |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief "add" operator for IxOsalTimeval |
| * |
| * @param tvA, tvB - IxOsalTimeval structures to add |
| * |
| * Adds the second IxOsalTimevalStruct to the first one (equivalent to |
| * tvA += tvB) |
| * |
| * @li Reentrant: yes |
| * @li IRQ safe: yes |
| * |
| * @return - none |
| * Note: This function is OS-independent. |
| */ |
| #define IX_OSAL_TIME_ADD(tvA, tvB) \ |
| (tvA).secs += (tvB).secs; \ |
| (tvA).nsecs += (tvB).nsecs; \ |
| if ((tvA).nsecs >= IX_OSAL_BILLION) \ |
| { \ |
| (tvA).secs++; \ |
| (tvA).nsecs -= IX_OSAL_BILLION; } |
| |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief "subtract" operator for IxOsalTimeval |
| * |
| * @param tvA, tvB - IxOsalTimeval structures to subtract |
| * |
| * Subtracts the second IxOsalTimevalStruct from the first one (equivalent |
| * to tvA -= tvB) |
| * |
| * @li Reentrant: yes |
| * @li IRQ safe: yes |
| * |
| * @return - none |
| * Note: This function is OS-independent. Implemented by core. |
| */ |
| #define IX_OSAL_TIME_SUB(tvA, tvB) \ |
| if ((tvA).nsecs >= (tvB).nsecs) \ |
| { \ |
| (tvA).secs -= (tvB).secs; \ |
| (tvA).nsecs -= (tvB).nsecs; \ |
| } \ |
| else \ |
| { \ |
| (tvA).secs -= ((tvB).secs + 1); \ |
| (tvA).nsecs += IX_OSAL_BILLION - (tvB).nsecs; \ |
| } |
| |
| |
| /* ============================= Logging ============================== |
| * |
| */ |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief Interrupt-safe logging function |
| * |
| * @param level - identifier prefix for the message |
| * @param device - output device |
| * @param format - message format, in a printf format |
| * @param ... - up to 6 arguments to be printed |
| * |
| * IRQ-safe logging function, similar to printf. Accepts up to 6 arguments |
| * to print (excluding the level, device and the format). This function will |
| * actually display the message only if the level is lower than the current |
| * verbosity level or if the IX_OSAL_LOG_USER level is used. An output device |
| * must be specified (see IxOsalTypes.h). |
| * |
| * @li Reentrant: yes |
| * @li IRQ safe: yes |
| * |
| * @return - Beside the exceptions documented in the note below, the returned |
| * value is the number of printed characters, or -1 if the parameters are |
| * incorrect (NULL format, unknown output device) |
| * |
| * @note The exceptions to the return value are: |
| * VxWorks: The return value is 32 if the specified level is 1 and 64 |
| * if the specified level is greater than 1 and less or equal than 9. |
| * WinCE: If compiled for EBOOT then the return value is always 0. |
| * |
| * @note The given print format should take into account the specified |
| * output device. IX_OSAL_STDOUT supports all the usual print formats, |
| * however a custom hex display specified by IX_OSAL_HEX would support |
| * only a fixed number of hexadecimal digits. |
| */ |
| PUBLIC INT32 ixOsalLog (IxOsalLogLevel level, |
| IxOsalLogDevice device, |
| char *format, |
| int arg1, |
| int arg2, int arg3, int arg4, int arg5, int arg6); |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief sets the current logging verbosity level |
| * |
| * @param level - new log verbosity level |
| * |
| * Sets the log verbosity level. The default value is IX_OSAL_LOG_ERROR. |
| * |
| * @li Reentrant: yes |
| * @li IRQ safe: yes |
| * |
| * @return - Old log verbosity level |
| */ |
| PUBLIC UINT32 ixOsalLogLevelSet (UINT32 level); |
| |
| |
| /* ============================= Logging ============================== |
| * |
| */ |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief Schedules a repeating timer |
| * |
| * @param timer - handle of the timer object |
| * @param period - timer trigger period, in milliseconds |
| * @param priority - timer priority (0 being the highest) |
| * @param callback - user callback to invoke when the timer triggers |
| * @param param - custom parameter passed to the callback |
| * |
| * Schedules a timer to be called every period milliseconds. The timer |
| * will invoke the specified callback function possibly in interrupt |
| * context, passing the given parameter. If several timers trigger at the |
| * same time contention issues are dealt according to the specified timer |
| * priorities. |
| * |
| * @li Reentrant: no |
| * @li IRQ safe: no |
| * |
| * @return - IX_SUCCESS/IX_FAIL |
| */ |
| PUBLIC IX_STATUS ixOsalRepeatingTimerSchedule (IxOsalTimer * timer, |
| UINT32 period, |
| UINT32 priority, |
| IxOsalVoidFnVoidPtr callback, |
| void *param); |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief Schedules a single-shot timer |
| * |
| * @param timer - handle of the timer object |
| * @param period - timer trigger period, in milliseconds |
| * @param priority - timer priority (0 being the highest) |
| * @param callback - user callback to invoke when the timer triggers |
| * @param param - custom parameter passed to the callback |
| * |
| * Schedules a timer to be called after period milliseconds. The timer |
| * will cease to function past its first trigger. The timer will invoke |
| * the specified callback function, possibly in interrupt context, passing |
| * the given parameter. If several timers trigger at the same time contention |
| * issues are dealt according to the specified timer priorities. |
| * |
| * @li Reentrant: no |
| * @li IRQ safe: no |
| * |
| * @return - IX_SUCCESS/IX_FAIL |
| */ |
| PUBLIC IX_STATUS |
| ixOsalSingleShotTimerSchedule (IxOsalTimer * timer, |
| UINT32 period, |
| UINT32 priority, |
| IxOsalVoidFnVoidPtr callback, void *param); |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief Cancels a running timer |
| * |
| * @param timer - handle of the timer object |
| * |
| * Cancels a single-shot or repeating timer. |
| * |
| * @li Reentrant: no |
| * @li IRQ safe: yes |
| * |
| * @return - IX_SUCCESS/IX_FAIL |
| */ |
| PUBLIC IX_STATUS ixOsalTimerCancel (IxOsalTimer * timer); |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief displays all the running timers |
| * |
| * Displays a list with all the running timers and their parameters (handle, |
| * period, type, priority, callback and user parameter) |
| * |
| * @li Reentrant: no |
| * @li IRQ safe: no |
| * |
| * @return - none |
| */ |
| PUBLIC void ixOsalTimersShow (void); |
| |
| |
| /* ============================= Version ============================== |
| * |
| */ |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief provides the name of the Operating System running |
| * |
| * @param osName - Pointer to a NULL-terminated string of characters |
| * that holds the name of the OS running. |
| * This is both an input and an ouput parameter |
| * @param maxSize - Input parameter that defines the maximum number of |
| * bytes that can be stored in osName |
| * |
| * Returns a string of characters that describe the Operating System name |
| * |
| * @li Reentrant: yes |
| * @li IRQ safe: yes |
| * |
| * return - IX_SUCCESS for successful retrieval |
| * - IX_FAIL if (osType == NULL | maxSize =< 0) |
| */ |
| PUBLIC IX_STATUS ixOsalOsNameGet (INT8* osName, INT32 maxSize); |
| |
| /** |
| * @ingroup IxOsal |
| * |
| * @brief provides the version of the Operating System running |
| * |
| * @param osVersion - Pointer to a NULL terminated string of characters |
| * that holds the version of the OS running. |
| * This is both an input and an ouput parameter |
| * @param maxSize - Input parameter that defines the maximum number of |
| * bytes that can be stored in osVersion |
| * |
| * Returns a string of characters that describe the Operating System's version |
| * |
| * @li Reentrant: yes |
| * @li IRQ safe: yes |
| * |
| * return - IX_SUCCESS for successful retrieval |
| * - IX_FAIL if (osVersion == NULL | maxSize =< 0) |
| */ |
| PUBLIC IX_STATUS ixOsalOsVersionGet(INT8* osVersion, INT32 maxSize); |
| |
| |
| |
| /** |
| * @} IxOsal |
| */ |
| |
| #endif /* IxOsal_H */ |