### Release notes for embOS Version 4.34

1. New features
2. Improvements
3. Program corrections
4. Release history
5. Miscellaneous

# New features

## Version 4.34

1. Event objects now support AND logic, therefore new API functions OS_EVENT_SetMaskMode() and OS_EVENT_GetMaskMode() have been added.

## Version 4.32

1. New API functions OS_EVENT_SetMask(), OS_EVENT_GetMask(), OS_EVENT_WaitMask() and OS_EVENT_WaitMaskTimed() added.
2. New API functions OS_PutMailTimed() and OS_PutMailTimed1() added.
3. New API functions OS_WD_Add(), OS_WD_Check(), OS_WD_Config(), OS_WD_Remove() and OS_WD_Trigger() added.

## Version 4.30

1. New API functions OS_GetMailTimed1(), OS_ClearSingleEvent(), OS_RemoveTerminateHook() and OS_MPU_SwitchToUnprivStateEx() added.

## Version 4.26

1. New API function OS_RemoveOnTerminateHooks() added.
2. embOS version mismatch check added.
   embOS checks now at runtime in OS_Start() if the embOS library and the RTOS.h are from the same version.
   This is a very common mistake. In case of a version mismatch OS_Error() is called.

## Version 4.24

1. Spinlock API for multi-core support added.

## Version 4.22

1. New API functions OS_Q_PutEx(), OS_Q_PutBlockedEx(), and OS_Q_PutTimedEx() added.
   The new functions can be used to store a message, of which the distinct parts are distributed in memory, into a queue.

## Version 4.20

1. MPU support added.
2. OS_AddExtendTaskContext() added.
   OS_AddExtendTaskContext() can be used to have unlimited task context extensions.

## Version 4.16

1. MISRA-C:2012 compliance updated.
   MISRA-C:2012 compliance is now checked with Gimpel Lint V9.0.

## Version 4.14

1. New API function OS_SetDefaultTaskContextExtension() added.
   OS_SetDefaultTaskContextExtension() can be used to set a default task context extension for newly created tasks.
2. New API macros OS_INT_PRIO_PRESERVE() and OS_INT_PRIO_RESTORE() added.
   OS_INT_PRIO_PRESERVE() / OS_INT_PRIO_RESTORE() can be used to preserve and restore the embOS interrupt status.
3. New API functions OS_TriggerTimer() and OS_TriggerTimerEx() added.
   OS_TriggerTimer() ends up a software timer at once and calls the software timer callback function.

## Version 4.12

1. Support for SYSVIEW API trace added.
2. New mailbox API functions OS_Mail_GetPtr(), OS_Mail_GetPtrCond() and OS_Mail_Purge() added.

## Version 4.10

1. MISRA C:2012 compliance
   embOS is fully MISRA C:2012 compliant. Compliance matrix and deviations are documented in a separate PDF document.

## Version 4.06

1. Support for Percepio embOS-Trace added.
   embOS can now be used with the Percepio embOS-Trace application to trace the embOS API and embOS internals.

## Version 4.04

1. Task priorities extended to 32bit on 32bit CPUs.

## Version 4.02

1. New functions OS_GetTime_us(), OS_GetTime_us64() and OS_Config_SysTimer() added.
   OS_GetTime_us() returns the current system time in usec.

## Version 4.00a

1. New tickless function OS_StopTicklessMode() added.
2. New const variable OS_DebugInfo added.
   This structure includes the field offsets of struct OS_GLOBAL and OS_TASK required by remote debugger for thread-awareness.
3. New profiling functions OS_STAT_Enable(), OS_STAT_Disable() and OS_STAT_GetTaskExecTime() added.
   These function can be used to enable/disable the profiling and to get the total execution time of a task.

## Version 4.00

1. Tickless support added.
   embOS now supports tickless mode. This is useful for low power operations, e.g. battery powered devices.

## Version 3.90

1. Functions to enable/disable global interrupts added.
   embOS now offers the following functions to enable and disable all interrupts, including high priority interrupts:
   OS_INTERRUPT_MaskGlobal() OS_INTERRUPT_UnmaskGlobal()
   Using the following functions allows nested calls, because the interrupt state can be saved and restored:
   OS_INTERRUPT_PreserveGlobal() OS_INTERRUPT_PreserveAndMaskGlobal() OS_INTERRUPT_RestoreGlobal()

## Version 3.88h

1. OS_GetNumIdleTicks() added.
   Can be used to examine the number of ticks spent idle.
   This is the number ticks until the next time scheduled action will be started.
2. OS_AdjustTime() added.
   Can be used to add an amount of time to the embOS internal time variable.

## Version 3.88d

1. Compatibility macros to older versions added.
   In version 3.88c, some compatibility macros to address internal variables were removed from RTOS.h.
   With version 3.88d, the following macros are available again:
   OS_pTask, OS_pCurrentTask, OS_pActiveTask, OS_pTimer, OS_pCurrentTimer, OS_Counters, OS_Pending, OS_TimeDex

## Version 3.88c

1. New API function OS_InInterrupt()
   The new API function OS_InInterrupt() can be used to examine if the calling function is running in an embOS interrupt handler.
   The function is available in all library modes.
2. New API function OS_Q_PutTimed()
   The new function OS_Q_PutTimed() can be used to put data into a queue with a given timeout.
   The function suspends the calling task for the given timeout if no space for the message is avaialable in the queue.
3. New profiling functions to measure CPU load at runtime
   The new functions OS_AddLoadMeasurement(), OS_GetLoadMeasurement() and OS_INC_IDLE_CNT() can be used to examine the total CPU load at runtime.
   The measurement period can be set by function, the global variable OC_CPU_Load can be read by debuggers with life watch capability.

## Version 3.88a

1. Reset behaviour of OS_EVENT objects can be controlled.
   The new API function OS_EVENT_SetResetMode() allows setting of the reset behaviour of existing event objects.
   The embOS functions for event objects unfortunately were inconsistent in respect of the reset behaviour of events.
   Setting the reset mode with the new function OS_EVENT_SetResetMode() allows to set the reset behaviour to semiauto, manual, or automatic reset.
   Manual reset guaranties that the event object remains set when waiting tasks are resumed. The event has to be reset manually by the task.
   Automatic reset allways resets the event when waiting tasks are resumed. The task does not need to reset the event.
   The semiauto mode is the mode used in previous versions of embOS as described in the manual.
2. New extended function for event object creation.
   The new function OS_EVENT_CreateEx() allows to create an event object and set the reset behavior to semiauto, manual or automatic reset.
3. Type of reset behaviour of event objects can be retrieved.
   The new function OS_EVENT_GetResetMode() retrieves the current setting of the reset behaviour of an event object.
4. Message size for mailboxes enlarged.
   Previous version of embOS allowed message sizes of up to 127 bytes for mailboxes.
   Now embOS allows messages sizes of up to 32767 bytes for mailboxes.
   However, the total size of one mailbox buffer is still limited to 64KBytes on 16bit CPUs.
   The debug builds of embOS now call OS_Error() with error code OS_ERR_MB_BUFFER_SIZE if the total size limit of one mailbox buffer is exceeded when calling OS_CreateMB().

## Version 3.88

1. Fully tested with Parasoft C/C++test MISRA check
   MISRA violations suppressed in source code with Parasoft comments.

## Version 3.86l

1. MISRA rule compliance improved.
   All violations of MISRA rule 10.1 fixed.
   All violations of MISRA rule 12.7 fixed.
   All violations of MISRA rule 14.9 fixed.
   All violations of MISRA rule 16.4 fixed.
   All violations of MISRA rule 16.8 fixed.

## Version 3.86k

1. New embOS API functions OS_Q_GetMessageSize() and OS_Q_PeekPtr().
   The new function OS_Q_GetMessageSize() reads the size of the first message in a queue.
The new function OS_Q_PeekPtr() reads a message from a queue without removing it.
2. embOS is now compliant to MISRA 2004 rules.

## Version 3.86f

1. Task events default to 32bit on 32bit CPUs.
   The default for task events for 32bit CPUs was modified from unsigned char to unsigned long.
   On 32bit CPUs, now the type OS_TASK_EVENT is defined as OS_U32 per default, allowing 32 different task events.
   All previous versions limited the task events for all CPUs to 8bit per default.
2. OS_ON_TERMINATE_HOOK added
   embOS now supports a linked list of functions which are called when a task is terminated.
   The new embOS function OS_AddOnTerminateHook() can be used to insert a callback function in the list of functions which are called when a task is terminated.
   The callback function gets the task ID as paramter.
   The callback function can be used to free or remove task specific objects which were created by the application.

## Version 3.86b

1. New embOS API function OS_PeekMail().
   The new function OS_PeekMail() reads a mail from a mailbox without removing it.

## Version 3.86

1. Timeout handling for "waitable" objects modified
   Previous versions of timed wait functions for waitable objects might have returned with no timeout condition when the object became avaialble after the timeout time.
   This happened when the waiting task was blocked by higher priority tasks and did not start after the timeout period.
   When the object became availabel after expiration of the timeout time but before the waiting tasks started again, no timeout condition was signaled to the task.
   This behaviour is changed with version 3.86 of embOS. When the object was not avaialble within the timeout time, a timeout is signaled to the waiting task, regardless the object may become avaialble until the task runs again.
   Following functions were modified:
   - OS_EVENT_WaitTimed()
   - OS_GetMailTimed()
   - OS_MEMF_AllocTimed()
   - OS_Q_GetPtrTimed()
   - OS_UseTimed()
   - OS_WaitCSemaTimed()
   - OS_WaitMailTimed()

## Version 3.84b

1. New embOS API function OS_Q_PutBlocked().
   The new blocking function for Queues OS_Q_PutBlocked() suspends the task when the queue is full.

## Version 3.84

1. New system stack check functions.
   New functions to analyze the system stack load during runtime are available now:
   - OS_GetSysStackBase() delivers the base address of the system stack.
   - OS_GetSysStackSize() delivers the size of the system stack.
   - OS_GetSysStackSpace() delivers the free (unused) space on the system stack.
   - OS_GetSysStackUsed() delivers the maximum amount of stack space used on the system stack.
2. New interrupt stack check functions.
   For CPUs which support a separate interrupt stack, new functions to analyze the interrupt stack load during runtime are available now:
   - OS_GetIntStackBase() delivers the base address of the interrupt stack.
   - OS_GetIntStackSize() delivers the size of the interrupt stack.
   - OS_GetIntStackSpace() delivers the free (unused) space on the interrupt stack.
   - OS_GetIntStackUsed() delivers the maximum amount of stack space used on the interrupt stack.

## Version 3.82x

1. OS_RegionCnt overflow check added.
   Overflow check is activated when OS_DEBUG_LEVEL >= 2.
2. Macro OS_EnterInterrupt() modified.
   OS_ASSERT_CPU_IN_ISR_MODE() moved to first line in macro OS_EnterInterrupt().

## Version 3.82w

1. GCC compiler warning eliminated.
   GCC compiler warning in OS_MEMF_Create.c eliminated.
2. Code modified for Lint.
   All embOS generic sources are tested with Lint.

## Version 3.82u

1. Fixed size memory blocks may be larger than 64KB on 32bit CPUs.
   The fixed size memory pool data types were modified to allow larger pools and block sizes on 32bit CPUs. The sizes may now be up to 2^31 bytes.
   For 16bit CPUs the block and pool sizes remain unchanged to previous versions and may be 64KB.
2. Software timer handling can be excluded.
   The new compile-time switch OS_SUPPORT_TIMER may be used to exclude embOS software timer handling from build when compiling the sources.
   If software timer are not needed by the application, excluding the software timer handling will decrease code and data size and speed up the scheduler.

## Version 3.82t

1. Trial time limitation increased to 12 hours.
   The trial time limitation is increased from 15 minutes to 12 hours.

## Version 3.82s

1. New API function OS_UseTimed()
   OS_UseTimed() may be used to request a resource semaphore with time out. The function blocks until the resource is available or the timeout expired.

## Version 3.82o

1. New API function OS_WaitMailTimed()
   OS_WaitMailTimed() may be used to suspend a task for a given timeout or until a message is available in a mailbox without retrieving the mail.

## Version 3.82n

1. New API functions for task suspension and synchronization.
   OS_SuspendAllTasks() may be used to suspend all task except the running task.
   OS_SetInitialSuspendCnt() can be used to create tasks that are initially suspended and will not run until they are resumed.
   OS_ResumAllSuspendedTasks() may be used to resume all suspended task at once without the need to address specific tasks.

## Version 3.82l

1. Thread local storage supported.
   For some ports, a thread local storage (TLS) may be used and can be initialized individually for every task by a call of OS_TLS_Init().
   The new TLS implementation requires additional CPU specifc fucntions and support by the compiler specific runtime library, it may be available for some ports only.

## Version 3.82k

1. New API function OS_Delayus().
   The new function OS_Delayus() can be used to perform a delay with micro second resolution. The calling task will wait for the given delay time without suspension.
   During the wait time, other tasks may be activated by interrupt, the embOS scheduling is not blocked.
   The function works well when the embOS timer has a resolution of at least 1us or better.
2. New API function OS_Q_Delete().
   This new function deletes a queue. Queues can be fully dynamically created and deleted now. The resources of the queue may be re-used after deletion.

## Version 3.82g

1. OS_Start() in assembly source replaced by OS_StartASM().
   OS_Start() now is a generic function which sets OS_Running to 1 and then calls OS_StartASM().

## Version 3.82h

1. Internal data types modified.
   A data type was defined for Ipl_EI and Ipl_DI. This allows variable size of integers which is supported by some tool chains.
2. OS_Info module modifed.
   The OS_Info module included the standard header stdio.h without any need. The include is removed now.

## Version 3.82g

1. OS_Start() in assembly source replaced by OS_StartASM().
   OS_Start() now is a generic function which sets OS_Running to 1 and then calls OS_StartASM().

## Version 3.82f

1. OS_IsRunning() implemented.
   The new API function OS_IsRunning() can be used to examine whether the embOS scheduler was started by a call of OS_Start().
   This may be helpful for some applications and functions to decide whether blocking function calls can be used.

## Version 3.82a

1. Error handling for queues implemented.
   embOS checks in debug version the correct queue handling.
2. OS_Q_IsInUse() implemented.
   New queue function which returns whether the queue is currently in use.

## Version 3.82

1. Scheduling and task switch time optimized.
   The internal scheduling functions OS_ChangeTask() and OS_Switch() were optimized to speed up context switching.
   By recompiling the sources, the optimization may be enabled or disabled by the definition of OS_GLOBAL_IS_RETURNED and OS_GLOBAL_IS_PARA.

## Version 3.80l

1. Macro OS_U32_TO_PTR_TYPE added.
   The new macro OS_U32_TO_PTR_TYPE casts an OS_U32 to pointer type to avoid warnings on some tool chains with different memory models.
2. New macro OS_EI_HP_ON_ENTRY()
   OS_EI_HP_ON_ENTRY() enables high-prio interrupts if necessary: Some CPUs (such as M16C) disable all interrupts on ISR entry.

## Version 3.80k

1. New fast tick handler.
   embOS V3.80k comes with an alternate faster tick handler OS_TICK_HandleNoHook().
   This tick handler does not support the tick hook function and therefore executes faster.
   It may be used instead of the regular tick handler OS_TICK_Handle() which is used in the default start projects.
   When using this new fast tick handler, it is the users responsibility, not to install any tick hook functions, as those will not be called by embOS.
2. Task events modified.
   The data type of task events may now be modified from unsigned char to unsigned short or unsigned int to allow more than 8 task events.
   The modification is done be defining the type of task events via the OS_TASK_EVENT definition in RTOS.h
   This type defaults to unsigned char to be compatible with previous versions of embOS. A modification requires recompilation of the embOS sources.

## Version 3.80h

1. Interrupt entry functions modified, internal modification.
   For some CPUs the CPU state can not be examined. A modification of the interrupt entry functions was required to inhibit an interrupt level assertion, introduced with version 3.80f, for those CPUs.
   The performance is not affected by this modification.

## Version 3.80f

1. Interrupt level assertions added
   The debug version of embOS now comes with additional error handler functionality.
   The error handler can detect illegal function calls under various conditions. OS_Error() will be called when one of the following conditions is detected:
   - OS_ERR_NOT_IN_ISR: *** OS_EnterInterrupt() has been called, but CPU is not in ISR state
   - OS_ERR_IN_ISR: *** OS_EnterInterrupt() has not been called, but CPU is in ISR state
   - OS_ERR_CPU_STATE_ISR_ILLEGAL: *** OS-function called from ISR with high priority
   - OS_ERR_CPU_STATE_ILLEGAL: *** CPU runs in illegal mode
   - OS_ERR_CPU_STATE_UNKNOWN: *** CPU runs in unknown mode or mode could not be read

## Version 3.62a

1. OS_STACK_ALIGN implemented
   OS_STACK_ALIGN may be defined to ensure a specific task stack alignment during task creation.
   To ensure a stack alignment of 8 bytes, OS_STACK_ALIGN has to be defined to 8 in the CPU specific embOS internal header file OS_Priv.h.
   Modification of this define requires recompilation of the embOS libraries.

## Version 3.62

1. OS_TICK_Config() and OS_TICK_HandleEx() implemented
   The extended embOS tick handler was modified to handle a runtime configurable tick increment and fractions.
   These parameter are setup by the new OS_TICK_Config() function and may be re configured during runtime.

## Version 3.60d

1. OS_POWER module implemented.
   The OS_POWER module may be used to control different power saving modes when entering idle state.
   Individual flags for different peripherals may be set whenever a peripheral needs power or clock, and may be reset, when power is not needed.
   The state of the power flags may be examined during OS_Idle by a call of OS_POWER_GetMask().
   This allows to switch off all of those peripherals which are not needed during idle times.

## Version 3.60a

1. embOS trial versions may run an unlimited number of tasks.
   The embOS trial versions run unlimited as long as only 3 tasks are created.
   Since version 3.60a, a time limit is added to the trial version. During the first 15 minutes, an unlimited number of tasks can be created.
   If more than three tasks were created during the time limit time, the system stops and calls OS_Error() when the time limit exceeded.

## Version 3.60

1. OS_AddTickHook() and OS_RemoveTickHook() implemented.
   These new functions allow the application to add and remove user function calls (hook functions) to the OS timer tick handler.

## Version 3.52c

1. OS_SetTaskName() introduced
   OS_SetTaskName() allows modification of task names on the fly.
   This may be useful if the functionality of a task changes during runtime and the new state should be shown using embOSView or an other task visualization tool.

## Version 3.52

1. OS_CallISR() and OS_CallNestableISR() introduced
   These new functions are required for some specific CPUs, but may be used in general to call an interrupt handler function without the need of using OS_EnterInterrupt() / OS_LeaveInterrupt() in the handler function.

## Version 3.50b

1. New library mode XR allows extremely compact applications
   The new XR libraries may be used to build extremely compact applications to save space in RAM and ROM and speed up context switching time.
   The XR embOS libraries are compiled with round robin scheduling disabled and task names disabled, which results in smaller data structures, smaller code size and faster context switching time.

## Version 3.40c

1. OS_Yield() may suspend a task unconditionally
   When tasks are running on round robin with timeslice, the function OS_Yield() can be used to end the timeslice of the running task immediately and activate an other task with the same priority which is ready for execution. The function has no effect on tasks that are not running on round robin.

## Version 3.40

1. Task switch time can be measured by application
   embOS now comes with sample applications which allow accurate measurement of task switch time in a running application.

## Version 3.32o

1. Automatic call of OS_INIT_SYS_LOCKS() removed.
   During initialization of embOS, OS_INIT_SYS_LOCK() is not called automatically.
   As most of the applications do not need thread safe system libraries, an automatic activation of syslocks causes unwanted overhead.
   If supported and required, the user may call OS_INIT_SYS_LOCKS() from his own application after normal initialization of embOS.

## Version 3.32m

1. OS_TimerEx, Extended timer implemented
   Extended timers are software timers which call a user defined callback function when the timer expires.
   In comparison to normal embOS timers, a parameter is passed to the timer callback function.
   The parameter value is initialized during timer creation.

## Version 3.32j

1. OS_CSemaRequest implemented
   May be used to decrement a counting semaphore conditionally, if a signal is available.
   The function never blocks the calling task and delivers a result which indicates whether the semaphore was available.

## Version 3.32f

1. OS_INIT_SYS_LOCKS() implemented
   May be used to include initialization code for thread safe system libraries.

## Version 3.32d

1. OS_Q_GetPtrTimed() implemented
   New queue retrieval function which waits for a message with specified timeout.

## Version 3.32c

1. OS_EVENT_WaitTimed() implemented
   New event object function to wait for an event with a timeout limit.

## Version 3.32b

1. Task context modified for debug builds
   The number of task activations is now part of the task context in debug builds.
   The number of activations are therefore displayed in the task list window of embOS plugin, when an embOS debug library is used.
   Previous versions of embOS showed this information in profiling builds only.

## Version 3.32a

1. A parameter may be passed to a task function
   Using the new embOS functions OS_CREATETASK_EX() or OS_CreateTaskEx() allows to pass a void pointer as parameter to a task.

## Version 3.32

1. Event objects introduced
   Event objects are standalone objects which are not assigned to a specific task.
   Event objects may be used to synchronize one or multiple task to a specific event.
   Events can be triggered from a task, a timer, or an interrupt handler.

## Version 3.30a

1. embOS internal time handling modified to allow long delays
   For 8- and 16-bit CPUs the maximum range for delays and timer periods is limited to 32767 embOS timer ticks, because time comparison ist done by integer calculation.
   By recompiling sources with data type OS_TIME defined as signed long, longer delays and timer periods up to 2147483647 ticks can be realized.
   The embOS libraries of object versions for 8- and 16-bit CPUs are still delivered with the limitation to 32767 timer ticks.

## Version 3.28p

1. New error handling for version without round robin scheduling
   In debug versions of embOS, OS_Error() is called with error code OS_ERR_TASK_PRIORITY, if a task is created with a priority which is already assigned to an other task.
   OS_Error() is also called with the same error code, if a task priority is assigned by call of OS_SetPriority() and the new priority is already assigned to an other task.
   Round robin switching can be disabled by recompiling sources with OS_RR_SUPPORTED defined as 0.

## Version 3.28l

1. OS_SignalCSemaMax()
   New counting semaphore handling function which specifies a maximum count value.
   This allows counting semaphores used as binary semaphores.

## Version 3.28i

1. OS_DeleteRSema()
   New resource semaphore handling function allows to delete resource semaphores during runtime.

## Version 3.28h

1. Additional error checks in debug builds of embOS
   OS_CreateRSema() now generates an error, when the addressed resource semaphore was already created before.
   OS_CreateCSema() now generates an error, when the addressed counting semaphore was already created before.
   OS_CreateMB() now generates an error, when the mailbox was already created before.
   OS_CreateTimer() now generates an error, when the software timer was already created before.
   OS_MEMF_Create() now generates an error, when the addressed fixed size memory pool was already created before.

## Version 3.28g

1. OS_GetSuspendCnt()
   New info function to examine suspension state and count of a task.

## Version 3.26

1. OS_Terminate() modified
   Tasks may be terminated anytime, regardless of task state.
   All resources claimed by the terminated task are automatically released.

## Version 3.22a

1. OS_PutMailFront() / OS_PutMailFront1()
   New mailbox functions to enable LIFO behavior of mailboxes.
2. OS_PutMailFrontCond() / OS_PutMailFrontCond1()
   New conditional mailbox functions to enable LIFO behavior of mailboxes.

## Version 3.20

1. OS_Suspend() / OS_Resume() implemented
   New functions to suspend and resume tasks unconditionally.
2. Fixed size memory blocks implemented
   New functions to allocate fixed size memory blocks from embOS.
3. Dynamic memory allocation supported by embOS
   Thread safe dynamic memory allocation functions implemented.

## Version 3.10k

1. OS_GetMailTimed()
   New mailbox retrieving function with timeout.

## Version 3.10d

1. OS_GetpCurrentTimer()
   New info routine. May be used in timer callback routines to examine which timer expired.
2. OS_GetpCurrentTask()
   New info routine. May be used to examine current running task.

## Version 3.10

1. Data format for communication with embOSView modified
   For terminal I/O in embOSView, the data format was changed. Therefore embOSView V3.10 or later is required.
2. OS_WaitSingleEvent()
   Unmasked events remain unchanged when function returns.
3. OS_WaitSingleEventTimed()
   Unmasked events remain unchanged when function returns. Timeout for waiting can be specified.

## Version 3.08a

1. Message Queue functionality enhanced
   OS_Q_GetPtrCond() function enables conditional request of data from Queue without task suspension.
   OS_Q_GetMessageCnt() functions delivers number of messages in the queue.

## Version 3.08

1. Message Queues
   Message queues enable intertask communication with messages of various size.

## Version 3.06f

1. OS_Use now returns a value
   When using a resource semaphore with a call of OS_Use(), the actual usage counter of the requested semaphore is returned as integer value. This may be helpful for some applications and is a lot more efficient than calling OS_Use() and then check the usage counter by calling OS_GetSemaValue().

## Version 3.06

All features of generic 3.06 kernel supported.

# Improvements

## Version 4.30

1. OS_ResumeAllSuspendedTasks() renamed to OS_ResumeAllTasks().
   OS_RemoveOnTerminateHooks() renamed to OS_RemoveAllTerminateHooks().
   OS_AddOnTerminateHook() renamed to OS_AddTerminateHook().
   The legacy function names can still be used for compatibility.
2. Major embOS source code refactoring.

## Version 4.26

1. embOS scheduler regarding priority inheritance improved.
   The scheduler was improved regarding priority inheritance for better performance.

## Version 4.24

1. Several SYSVIEW trace macros added to indicate task termination and execution end of API function.

## Version 4.14

1. SYSVIEW and Percepio trace macros to OS_Mail_GetPtr(), OS_Mail_GetPtrCond() and OS_Mail_Purge() added.

## Version 4.12b

1. SYSVIEW trace macros added.

## Version 4.12a

1. SYSVIEW trace macros added/modified.
2. OS_InInterrupt() modified.
   OS_InInterrupt() does no longer return the value of OS_InInt which was set by OS_EnterInterrupt()/OS_EnterNestableInterrupt().
   Now It rather returns the actual CPU interrupt state. This function is no longer available with every embOS port.

## Version 4.12

1. Percepio embOS-Trace macro in OS_CreateTimerEx() removed.

## Version 4.10b

1. OS_SendString() parameter declaration modified to avoid compiler warning.

## Version 4.10

1. Percepio embOS-Trace defines added.

## Version 4.06a

1. Percepio embOS-Trace macros added/modified.

## Version 3.88e

1. Assertion into OS_Delayus() added.
   The assertion checks if interrupts are enabled before calling this function.

## Version 3.88b

1. Internal data structure changed to efficiently access embOS version.

## Version 3.86e

1. OS_malloc(), OS_free(), OS_realloc() modified.
   To allow thread safe heap management, OS_malloc() creates or uses a semaphore when called.
   The new versions of OS_malloc(), OS_free() and OS_realloc() use the semaphore when called from tasks only. The semaphore is not needed, before embOS is started.

## Version 3.86b

1. Several macro definitions in RTOS.h modified to be compliant to MISRA rules.

## Version 3.84a

1. OSInfo now checks if OS_CPU is defined.
   When compiling sources, the value of OS_CPU is now checked and has to be defined, it should not be empty.
   The value of OS_CPU reflects the CPU variant which was selected to build the embOS library and is shown in the sytem information window when using embOSView.
   Previous versions of embOS did not check if this value was defined.

## Version 3.82u

1. Software timer handling optimized.
   The software timer handler was removed form the scheduler and put into a separate module.
   If software timer are not used by the application, the software timer handler will not be linked in, thus reducing the required kernel code size.
2. Generic timer tick handler modified.
   The preprocessor conditional defines which guarantee safe code for processors which can not perform atomic 32bit calculations or pointer operations was modifed.
   This is an internal modification which has no effect on any current embOS port.

## Version 3.82s

1. Nestable interrupt handling improved.
   Some embOS functions might have inhibited re-enabling of interrupts when a nestable interrupt was called during task suspension caused by the function.
   The following API functions were affected and have been modified to correct this behavior:
   OS_WaitEvent()
   OS_WaitEventTimed()
   OS_WaitSingleEvent()
   OS_WaitSingelEventTimed()
   OS_MEMF_AllocTimed()
   OS_Yield()

## Version 3.82r

1. Thread local storage handling improved.
   For embOS ports which support thread local storage, the task switch time was slightly increased, even for tasks which did not use thread local storage.
   The implementation of thread local storage now is improved and does not affect the context switch time of tasks which do not use thread local storage.
2. OS_TLS_Init() contains a new assertion.
   OS_TLS_Init() must not be called multiple times from the same task.
   In debug builds of embOS, the new implementation of OS_TLS_Int() now calls the OS_Error() function with error code OS_ERR_TLS_INIT when OS_TLS_Init() is called multiple times from the same task.
3. OS_Terminate() contains a new assertion.
   OS_Terminate() must not be called from an embOS software timer callback function.
   In debug builds of embOS, the new implementation of OS_Terminate() now calls the OS_Error() function with error code OS_ERR_ILLEGAL_IN_TIMER when OS_Terminate() is called from an embOS timer.
4. OS_ExtendTaskContext() contains a new assertion.
   For every task, the context can be extended only once.
   In debug builds of embOS, the new implementation of OS_ExtendTaskContext() now calls the OS_Error() function with the new error code OS_ERR_EXTEND_CONTEXT when OS_ExtendTaskContext() is called multiple times from the same task.

## Version 3.82q

1. OS_EnterNestableInterrupt() optimized to reduce interrupt latency.
   OS_EnterNestableInterrupt() caused some interrupt latency for zero latency interrupts when an embOS debug library was used.
   Only CPUs which disable interrupts on interrupt entry were affected, for example Renesas M16C / M32C.
   OS_EnterNestableInterrupt() for those CPUs was optimized to reduce the interrupt latency of high priority interrupts.

## Version 3.82p

1. OS_Suspend() now contains an assertion
   OS_Suspend() must not be called from an interrupt handler as it could cause a task switch immediately.
   In debug versions of embOS, OS_Suspend() now runs into OS_Error() if called from an interrupt handler or timer.
2. OS_PutMail functions parameter declaration changed.
   The functions OS_Putmail(), OS_PutMailCond, OS_PutMailFront() and OS_PutMailFrontCond() now have a const pointer qualifier for the data that shall be put into the mailbox.
   The const qualifier clarifies and ensures that the data is not modifed by the function.

## Version 3.82k

1. Queue management optimized.
   Previous versions of embOS needed 2 integer words of mamangement information stored into the queue buffer for every data item in the queue.
   With verion 3.82k, the data management was optimized and only one additional integer word, the data size, is stored into the buffer together with the data.

## Version 3.82i

1. OS_StartTimer() modified to avoid warnings under GCC when compiling sources.
   When compiling sources with optimization under GCC, the code in OS_StartTimer() generated a "strict alias violation" warning.
   Some casts were removed and one pointer type was modified to eliminate this warning.

## Version 3.82e

1. Stack overflow check for system stack and interrupt stack added.
   In stack check builds, embOS now checks the system stack and the interrupt stack (if present) during every call of the scheduler.
   If a stack overflow is detected, the error handler OS_Error() is called with one of the new error codes OS_ERR_SYS_STACK or OS_ERR_INT_STACK.

## Version 3.82d

1. Variable type changed to avoid GCC warnings
2. Changes in OS_Global initialization to avoid GCC warnings.

## Version 3.82c

1. Initialization of OS_Global in OSGlobal.c changed to avoid GCC warnings.
2. The definition OS_MODEL was moved from OS_RAW.h to OSINFO.c because CPU name and library name will now be placed in OS_Priv.h.

## Version 3.82b

1. Communication functions for embOSView may be used from tasks.
   The embOS internal communication functions for embOSView, OS_OnRx() and OS_OnTx() may now be called from a task.
   Previous versions of embOS did not allow calling these functions from outside an interrupt handler and called OS_Error() in debug builds.
   Right now, theses functions and the communication protocol are not documented. The user should not call these functions.
   The modification was done for future extensions.

## Version 3.80i

1. Resource semaphore handling speed optimized.
   OS_Use() and OS_Unuse() were optimized to allow faster locking and unlocking on rersource semaphores.
   The embOS scheduler was optimized to allow faster activation of tasks waiting on resources semaphores.
2. Support for CPUs with growing stack addresses supported.
   To handle CPUs with growing stack addresses, OS_CreateTask() and OS_CreateTaskEx() were modified. The compile time switch OS_STACK_AT_BOTTOM is now honored by these functions and stack is handled correctly for those CPUs.
   Existing embOS version are not affected, this modification was made for newer versions for CPUs with growing stack addresses.

## Version 3.80g

1. embOS internal semaphores can be shown with the embOS plugin for IAR C-Spy.
   The embOS plugin for IAR did not show the system locking semaphores used for malloc and other non re-entrant system functions when no other resource semaphores were used in the application.
   These semaphores can be now be seen in the Resource semaphore window of the embOS C-Spy plugin.

## Version 3.80

1. OS_Suspend() / OS_Resume() optimized.
   The OS_Suspend() and OS_Resume() functions were optimized to perform faster task switches on 32bit CPUs.
2. Internal data structures and scheduler optimized.
   Internal data structures were modified to allow more efficient access. Together with a modification of the scheduler, this results in faster task switches and interrupt handling.
3. OS_InitKern() does not enable interrupts.
   The previous OS_InitKern() function enabled interrupts by a call of OS_RestoreI(), thus enabling interrupts, as long as OS_IncDI() was not called before.
   The new OS_InitKern() function does not automatically enable interrupts. The interrupt enable state remains unchanged.

## Version 3.62c

1. New error code OS_ERR_IDLE_RETURNS
   The debug version of embOS now checks whether OS_Idle() returns in which case OS_Error() is called with the new error code.
   OS_Idle() has to be implemented as an endless loop and must never return. If OS_Idle() is modified and returns by accident, the behavior is unpredictable and this error might be difficult to find.
   The new version of embOS now catches a return from OS_Idle() and calls OS_Error().

## Version 3.62b

1. New error code OS_ERR_ISR_NO_HANDLER
   The new error code is generated and OS_Error() is called, if an un-initialized interrupt handler is called.
   This error handling is available on some ports of embOS, especially those, where embOS initializes an interrupt vector table in RAM.
   During initialization, a default dummy handler is installed for all interrupt sources. This handler should normally be replaced by installing application specific interrupt handlers.
   Because the default dummy interrupt handler should never be called by an application, it calls OS_Error() with the new error code OS_ERR_ISR_NO_HANDLER to signal the setup error.

## Version 3.62

1. Internal representation of scheduler states modified.
   The states which control pending task switches and show the reason of the task switch are handled in compact structure now.
   The previous version used bit fields and definitions which were difficult to understand and which were difficult to handle.
   The new definition and structure is easier to handle which results in faster code execution.

## Version 3.60e

1. OS_ERR_WRONG_STACK error code added.
   Some ports of embOS for CPUs with different stack pointers require that the CPU enters main() with a specific stack selected.
   These ports of embOS now contain code to examine the stack used in main and call OS_error() with the new error code OS_ERR_WRON_STACK, if the startup code entered main with the wrong stack-pointer selected.

## Version 3.60c

1. OS_ASSERT_INIT_CALLED()
   A new assertion is added which checks whether OS_InitKern() was called before tasks are created.
   In debug builds, the OS_Error() function will be called, if tasks are created before calling OS_InitKern().
2. OS_GetTaskName() modified.
   In previous versions, OS_GetTaskName() had to be called with a valid task ID. Now, the NULL pointer may be passed as argument to address the current task.
   The function will always return a valid string.
   The previous implementation might have returned a NULL pointer, which could cause problems, if the result was not evaluated be the calling function.

## Version 3.60b

1. OS_ASSERT_ISR_LEVEL()
   A new assertion was defined which will call OS_Error() if the CPU runs in interrupt mode but OS_EnterInterrupt() or OS_EnterNestableInterrupt() was not called.
   With version 3.60b the assertion is not implemented, it is just defined and usage is prepared. The implementation will be made in future versions of embOS.

## Version 3.60

1. OS_GetVersion() implemented as function
   OS_GetVersion() may be used by the application to retrieve the embOS library version. The result may be used to verify whether the library version matches the embOS header file RTOS.h.

## Version 3.52e

1. All embOS variables located in one module.
   All embOS variables are located in one module now. In previous versions of embOS, some module specific embOS variables were located in the module they were used for.

## Version 3.52

1. OS_TickHandler() and OS_TickHandler_Ex() removed.
   These two functions are obsolete, because they can be replaced by OS_HandleTick() and OS_HandleTick_EX(), if OS_EnterInterrupt() / OS_LeaveInterrupt is used in the interrupt handler.

## Version 3.50c

1. OS_GetTime32() optimized for 32bit CPUs
   For 32bit CPUs, OS_GetTime32() is now automatically replaced by an efficient macro which delivers value of the embOS internal time variable.
   In previous versions of embOS, a function was called, when it was not over-written in the CPU specific part of the OS header file.

## Version 3.50b

1. Internal optimizations
   Some internal optimizations were performed to optimize task switching time and interrupt latencies.

## Version 3.50b

1. Internal optimizations
   Some internal optimizations were performed to optimize task switching time and interrupt latencies.

## Version 3.50

1. Scheduler optimized
   The embOS scheduler was optimized to reduce task switching time and interrupt latencies.

## Version 3.40d

1. OS_Yield() now writes an entry into the trace buffer
   When using the debug library with trace capabilities, OS_Yield() writes an entry into the trace buffer which shows the function call and the calling task.
   embOSView version 3.40d is required to show this entry.

## Version 3.40b

1. Queue management improved.
   For some CPUs, the buffer start address for Queues has to be aligned. Now embOS automatically corrects the alignment, if required.

## Version 3.40a

1. Counting semaphores improved.
   The counters of counting semaphores are now integer values.
   Error handling is also improved. When a counting semaphore overflows, the embOS error handler OS_Error() is called in debug builds.

## Version 3.40

1. Task switch time improved.
   Scheduling optimized to improve task switch time.
2. Task switch time improved for task events.
   Task event handling modified to improve task switch time for tasks waiting on events.
3. Interrupt latency improved.
   During task switch, the time period when interrupts are disabled is reduced.
4. embOS timer tick handler improved.
   The standard timer tick handler run faster now. The embOS internal time variable is incremented by 1 on every timer tick.
   When different increments are required, the new timer tick handler OS_HandleTick_Ex(), OS_TickHandler_Ex() or OS_HandleTickDI_Ex() have to be used by application.
   Different increments may be configured by a call of OS_CONFIG().

## Version 3.32i

1. Task switch to OS_Idle() modified.
   The call of OS_Idle() from OS_ChangeTask can be overwritten (inhibited) by defining the macro OS_IDLE() which is normally defined as OS_Idle().
   This allows task switching via an exception for specific CPU/compiler versions.

## Version 3.32g

1. Pointer comparison improved for fixed size memory pools (OS_MEMF module).
   Some compiler produced wrong pointer comparison code in far memory model.
   For specific CPU/compiler versions, the new OS_POINTER_TO_VALUE() function was introduced to deliver correct results in pointer comparison.

## Version 3.28n

1. embOS round-robin scheduling may be disabled.
   Round-robin scheduling may be disabled by recompiling sources with OS_RR_SUPPORTED defined as 0.
   This will save some bytes of RAM and ROM and may make sense for small CPUs.

## Version 3.28g

1. embOS scheduling simplified
   Task activation and deactivation on "waitable objects" as mailboxes, semaphores, events, fixed size memory blocks now all use the same scheduling method.
   This modification saves ROM and RAM and makes scheduler easier to understand and to maintain.
   Applications which accessed internal data structures of waitable objects directly have to be modified.

## Version 3.24

1. Stack check performance increased
   Stack check now runs much faster on 32- and 16-bit target CPUs.

## Version 3.10q

OS_CreateTask now initializes profiling variables. (Required if TCB is used multiple times)

## Version 3.06

First version. None.

# Program corrections

## Version 4.20

1. OS_WaitMailTimed() corrected
   OS_WaitMailTimed() returned with disabled interrupts when a message was already in the mailbox. The problem existed in all previous embOS versions and is fixed with version 4.20.

## Version 4.14a

1. OS_Q_Create() corrected.
   OS_Q_Create() did not work correctly when integer size is 16bit and pointer size is greater than 16bit.
   The queue buffer address is not correctly calculated and stored in the queue control structure.
   The problem existed in all previous embOS versions and is fixed with version 4.14a.

## Version 4.14

1. OS_StopTicklessMode() corrected.
   OS_StopTicklessMode() did not check if any delay was expired and if it is necessary to call the scheduler for further actions.
   This could cause that a task or software timer was activated with an one system tick delay.
   The problem existed in all previous embOS versions and is fixed with version 4.14.

## Version 4.12a

1. OS_StartTimer() corrected.
   When a task was interrupted in OS_StartTimer() by another task which also calls OS_StartTimer() for the same OS_TIMER, it could happen that the internal list of timers was corrupted.
   The problem existed in all earlier embOS versions and is fixed with version 4.12a.

## Version 4.12

1. OS_Alloc() corrected.
   OS_Alloc() could fail when calling for the first time from more than one task.
   The 2nd task could try to initialize the resource semaphore which was already initialized by the first call of OS_Alloc().
   The problem existed in all earlier embOS versions and is fixed with version 4.12.

## Version 4.10b

1. OS_TerminateTask() corrected.
   This should already be corrected with V3.90a but was actually not.
   Please find more details below in description of V3.90a.
2. OS_AdjustTime() corrected.
   embOS usec precise system time could return wrong values when using with embOS tickless mode.
   The problem existed since embOS versions 4.02 and is fixed with version 4.10b.

## Version 4.10a

1. OS_GetTime_us() / OS_GetTime_us64() corrected.
   It could happen that OS_GetTime_us() / OS_GetTime_us64() return wrong results when the interrupt pending flag was set during function execution.
   The problem existed since embOS versions 4.02 and is fixed with version 4.10a.

## Version 4.10

1. OS_GetNumIdleTicks() corrected.
   It could happen that OS_GetNumIdleTicks() returns wrong results, e.g. when a software timer was stopped in OS_Idle() before calling OS_GetNumIdleTicks().
   The problem existed since embOS versions 4.00 and is fixed with version 4.10.

## Version 4.06b

1. Percepio embOS-Trace macro in OS_TerminateTask() corrected.
   OS_TerminateTask(NULL) reads from address 0x14 which might fail on some CPUs without memory at 0x00.
   The problem existed since embOS versions 4.06 and is fixed with version 4.06b.

## Version 4.06a

1. Declaration of OS_Counters modified.
   The Region counter is now declared as volatile. Otherwise some compilers with high optimization remove OS_EnterRegion().
   The problem existed in all previous embOS versions and is fixed with version 4.06a.

## Version 4.06

1. OS_StopTicklessMode() corrected.
   If an interruppt occurred while OS_StopTicklessMode() was executed a NULL function callback pointer could be called.
   The problem existed since embOS versions 4.00a and is fixed with version 4.06.

## Version 4.04a

1. OS_Config_SysTimer(), OS_GetTime_us() and OS_GetTime_us64() were not included in the embOS built.
   The problem existed since embOS versions 4.04 and is fixed with version 4.04a.

## Version 4.04

1. OS_SendString() corrected.
   When an interrupt activates another task which also calls OS_SendString() it could happen that a task was not resumed again after it was suspended by OS_SendString().
   The problem existed in all previous embOS versions and is fixed with version 4.04.
2. OS_GetTime_us() corrected.
   An internal calculation overflow could cause that not the full 32bit return value range could be used.
   The problem existed since embOS versions 4.02 and is fixed with version 4.04.

## Version 4.02a

1. Compile error fixed when disabling embOS tickless feature.
   A compile error occurred when disabling the embOS tickless feature with the compile-time switch OS_SUPPORT_TICKLESS.
   The problem existed since version 4.00 of embOS and is fixed with version 4.02a.

## Version 4.00a

1. OS_SendString() corrected.
   When an interrupt activates a higher priority task which also calls OS_SendString() embOS could stop in an endless loop in OS_SendString().
   The problem existed in all previous embOS versions and is fixed with version 4.00a.

## Version 3.90a

1. OS_TerminateTask() corrected.
   Terminating a task which was suspended by OS_SendString(), ended in a call of OS_Error() later on when the transmission interrupt of the embOSView communication tried to re-activate the non-existing task.
   OS_TerminateTask() was modified to avoid this problem. When terminating such task, the control variables for embOSView communication are set to not activate that task.
   The problem existed in all previous embOS versions and is fixed with version 3.90a.

## Version 3.88g

1. OS_Q_Clear() corrected.
   OS_Q_Clear() did not activate tasks which were waiting on the queue.

## Version 3.88f

1. Internal const variable definition corrected.

## Version 3.88e

1. Internal function prototype corrected.
   Function prototype in trace modul corrected.
   With the incorrect function prototype some embOS ports did not build without compiler error.

## Version 3.88d

1. Compatibility macros to older versions added.
   In version 3.88c, some compatibility macros to address internal veriables were removed from RTOS.h.
   With version 3.88d, the following macros are available again:
   OS_pTask, OS_pCurrentTask, OS_pActiveTask, OS_pTimer, OS_pCurrentTimer, OS_Counters, OS_Pending, OS_TimeDex

## Version 3.88a

1. embOS software timer handling corrected.
   During software timer handling, a NULL-pointer might have been de-referenced.
   On targets with MMU, this caused an exception when memory at address 0x0 was not enabled.
   The problem existed since version 3.86g of embOS and is fixed with version 3.86n.

## Version 3.86n

1. embOS heap management functions corrected.
   Locking the heap by a resource semaphore must not be controlled by OS_IsRunning(). The previous implementation did not use (and initialize) the semaphore as long as embOS was not started.
   This caused a problem when data was allocated during main(), without semaphore, but released from a task, which then addressed the semaphore which did not exist.
   When OS_malloc() was not called from main(), the problem did not occur.
   The problem existed since version 3.86e of embOS and is fixed with version 3.86n.

## Version 3.86m

1. embOS scheduler corrected.
   The scheduler failed when a task which was suspended and on timeout reached its timeout and at the same moment during execution of the scheduler, a higher priority task was activated by an interrupt.
   The higher priority task was put in ready state, but was not started.
   The problem existed in all previous embOS versions and is fixed with version 3.86m.
2. OS_TerminateTask() corrected.
   Setting OS_pActiveTask, the pointer to the task to activate next, has to be an atomic operation.
   To ensure atomic operation, interrupts have to be disabled before setting OS_pActiveTask when OS_PTR_OP_IS_ATOMIC is defined to 0. This was not handled correctly in previous versions of embOS and might have caused problems with CPUs which can not write pointer values as atomic operation. Most likely, all 32bit CPUs can write a pointer value as an atomic operation. The problem might have occurred on those 16- or 8-bit CPUs which can not. The problem is fixed with version 3.86m.
3. Internal function OS_InsertTask() corrected. Insertion of a task into the linked list of tasks has to use atomic operations, when the next pointer of the previous task is updated to point to the new task that shall be inserted.
   The corrected version disables interrupts before the next pointer of the previous task is updated, when OS_PTR_OP_IS_ATOMIC is defined to 0.
   This was not handled correctly in previous versions of embOS and might have caused problems with CPUs which can not write pointer values as atomic operation, when tasks were created dynamically when embOS was already started, or OS_SetPriority() was called after starting embOS. Most likely, all 32bit CPUs can write a pointer value as an atomic operation. The problem might have occurred on those 16- or 8-bit CPUs which can not. The internal function OS_InsertTask() is called during task creation or OS_SetPriority().
4. Definition of OS_VERSION corrected. The definition of OS_VERSION was modified with version 3.86l of embOS to comply to MISRA rules.
   As long as OS_VERSION was used internally in embOS, no problem occurred.
   Unfortunately, when user software tried to evaluate OS_VERSION for comparison, the expression could not be evaluated, compilation stopped with errors. The problem exsisted in version 3.86l of embOS only and is fixed with version 3.86m.

## Version 3.86l

1. Assertions in OS_AddTickHook() corrected.
   The function OS_AddTickHook() must not be called from interrupt handlers. It may be called from main() or tasks only.
   Previuos versions of embOS did not detect when this function was called from an ISR.
   With embOS version V3.86l, OS_Error() is called in debug builds when the function is called from an ISR handler.

## Version 3.86i

1. OS_EnterNestableInterrupt() modified.
   When embOS was compiled with optimization using IAR RX compiler the execution of the incrementation of region counter was delayed in OS_EnterNestableInterrupt().
   The new macro OS_IntEnterRegion is now used in OS_EnterNestableInterrupt().
   This macro can be overwritten in the cpu/compiler specific header file with OS_EnterRegionFunc() to avoid that interrupts are enabled before the region counter is incremented.

## Version 3.86h

1. OS_EVENT handling with timeout corrected.
   Previous versions of embOS lost an event when tasks were waiting on the event by a all of OS_EVENT_WaitTimed() and the event was signaled after the timeout expired.
   When the waiting tasks were not activated by the scheduler when the timeout expired, which might have happened, when an other task ran in a critical region, a following call of OS_EVENT_Set() did not signal the event, so the event got lost.
   The waiting tasks reported a timeout when they continued execution.
   The problem existed in all revious versions of embOS and is fixed with version 3.86h.

## Version 3.86f

1. OS_ERR_TIMESLICE removed
   Previous versions of embOS called the error handler OS_Error() with error code OS_ERR_TIMESLICE, when a task with a timeslice value of 0 was created.
   Now, a timeslice value of zero is legal. It allows pure cooperative scheduling between tasks with th esame priority as described in the generic manual, chapter 4.
   The OS_ERR_TIMESLICE assertion was introduced with embOS version 3.82n and is removed with version 3.86f.

## Version 3.86e

1. Stack info functions for release build corrected
   The API function macros were not defined properly in the release build.
   When used in an application with relase build, the following functions generated compiler errors and could not be used:
   OS_GetSysStackBase()
   OS_GetSysStackSize()
   OS_GetSysStackSpace()
   OS_GetSysStackUsed()
   OS_GetIntStackBase()
   OS_GetIntStackSize()
   OS_GetIntStackSpace()
   OS_GetIntStackUsed()
   The problem existed since embOS version 3.84 and is fixed with version 3.86e

## Version 3.86d

1. Timeout handling for waitable objects corrected
   When the timeout had already expired when the wait function with timeout was called, the function came back with interrupts disabled. This might have happened when other tasks with higher priority or interrupts blocked the calling task right after calling a wait functing. The application might have been kept blocked for ever when the calling task did not call any other function which re-enabled interrupts by OS_RestoreI(). The problem existed in embOS versions since version 3.86 and is fixed with version 3.86d.

## Version 3.86c

1. Missing prototype for OS_EnterRegionFunc() added

## Version 3.86a

1. Queue handling corrected.
   When OS_Q_PutBlocked() was used in an application, OS_Purge() called from a lower priority task might have ended in an endless loop.

## Version 3.86

1. Support for task events with timeout corrected
   Previous versions of the functions OS_WaitEventTimed() and OS_WaitSingleEventTimed() limited the number of task events to 8, even when the definition of the type OS_TASK_EVENT was defined to a larger data type.
   Because of an error in an internal function, task events were truncated to 8 bit, regardless the definition of OS_TASK_EVENT.
   The problem existed in all previous versions of embOS and is fixed with version 3.86

## Version 3.84c

1. OS_Q_Put() corrected.
   OS_Q_Put() existed twice in embOS generic sources V3.84b.

## Version 3.82w

1. Resource semaphore handling corrected.
   On 8 or 16 bit CPUs with high interrupt load, the scheduler might have failed when an interrupt occurred during a resource semaphore with waiting tasks was released by a call of OS_Unuse().
   This happened on CPUs which could not perform atomic pointer or 32bit operations.
   The system might have crashed, or might not have activated tasks with higher priority.
   The problem existed in all embOS versions since version 3.80i and is corrected with version 3.82w.
   Usage of OS_UseTimed() might have caused the same problems on all CPUs when the timeout expired during the resource semaphore was freed and waiting tasks were activated from another task by calling OS_Unuse().

## Version 3.82s

1. OS_WaitCSemaTimed() corrected
   The function might have blocked a task longer than expected.
   This happened when the task was restarted during the timeout by a semaphore signal and the semaphore was not available for the task, because it was claimed by a higher prioritized task during task activation.
   In this case, the task was suspended again with the initial full timeout value.
   The problem existed in all previous versions fo embOS and is corrected with version 3.82s.

## Version 3.82m

1. Queue management corrected.
   Queue management failed when the Q-buffer was filled up to the end. This might have happened, when messages are produced faster then they were consumed.
   The OS_Q_Purge() and OS_Q_Put() functions did not handle this case correctly and caused the queue to be corrupted.
   OS_Error() might have been called with error number 143, or OS_Q_GetPtr() might have returned with a wrong message size or a message size of 0.
   The problem existed since version 3.82k of embOS and is fixed with version 3.82m.

## Version 3.82k

1. Queue management corrected.
   Queue mamagement failed when multiple producer put data into the same queue and one of the producer was an ISR handler.
   When the ISR handler was called during a running transfer into the queue, the data in the queue could be corrupted.
   The problem existed in all previous versions of embOS and is fixed with version 3.82k.

## Version 3.80k

1. Trace functions corrected.
   The previous version of embOS intoduced a bug in the trace module. Task names were not shown and the task sensitive filter did not work.
   The problem existed in version 3.80i in trace libaries only and is corrected in version 3.80k.

## Version 3.62c

1. OS_GetPriority() corrected.
   In OS_GetPriority() was called with NULL as paramter, the debug version of embOS called OS_Error() with error code OS_TASK_INV.
   The NULL pointer is allowed now and the function delivers the priority of the running task as described in the documentation.
   This error existed in all previous versions of embOS and is fixed with version 3.62c.

## Version 3.60e

1. OS_EVENT_Create() corrected.
   OS_EVENT_Create() might have called the error-handler OS_Error() with errorcode OS_ERR_2USE_EVENTOBJ if an event-object was created dynamically or as a local object in a function.
   This happened, if the un-initialized data area of the event object contained one specific byte (id code) of the event object.
   The problem existed in all previous embOS versions and is fixed with version 3.60e.
2. embOSView corrected.
   When the update interval of embOSView was set to 200ms or a longer value, the reaction of user input or mouse events was blocked for the same time.
   The problem existed since version 3.32 of embOSView and is fixed with version 3.52b.

## Version 3.52b

1. OS_SendString() corrected.
   When sending an empty string, the calling task was suspended forever.
   The problem existed in all previous embOS versions and is fixed with version 3.52b.
2. embOSView corrected.
   When the update interval of embOSView was set to 200ms or a longer value, the reaction of user input or mouse events was blocked for the same time.
   The problem existed since version 3.32 of embOSView and is fixed with version 3.52b.

## Version 3.52a

1. OS_Terminate() for XR-build corrected.
   OS_Terminate() in XR-builds might have failed and the system stuck in an endless loop.
   All other library modes were not affected.

## Version 3.50a

1. System stack check corrected
   The system stack check failed in the case the system stack grows from lower addresses to higher addresses.
   In this case, the system stack was not correctly filled with the stack check pattern.
   The problem existed for embOS for PIC only and is fixed with version 3.50a.

## Version 3.40d

1. OS_Suspend() corrected
   When using the debug library with trace capabilities, a call of OS_Suspend() wrote a wrong trace code into the trace buffer.
   Instead of writing the code for task suspension, the code for task termination was written.
   The function itself worked correctly, only the data written into the trace buffer was wrong.
   The problem existed in all previous embOS versions and is fixed with version 3.40d.

## Version 3.32o

1. OS_Unuse() corrected
   OS_Unuse() must not be called from a task that does not claim the resource semaphore.
   According to the documentation, the debug build of embOS should generate a call to OS_Error() if this fault happens.
   All previous versions of embOS did not call OS_Error(). Now, OS_Error() will be called in that situation with error code 156: OS_ERR_RESOURCE_OWNER().

## Version 3.32l

1. OS_EVENT_Delete() corrected
   OS_EVENT_Delete() did not work correctly. OS_LeaveRegion() was called inside the function without calling OS_EnterRegion() before.
   In debug builds of embOS, the error-handler OS_Error() was called with error 151 (OS_ERR_LEAVEREGION_BEFORE_ENTERREGION).
   In release builds the system was blocked because the underflow of region count inhibits all further task switches, or system crashes, because incrementing the region count the next time allows task switches instead of blocking them. The problem existed in all previous versions and is fixed with version 3.32l.
2. Round-robin task switching corrected.
   Round robin task switching did not work correctly in previous version. A task which was blocked for some reason could be activated. The system crashed during task switch.
   The problem existed since version 3.32j and is fixed with version 3.32l.

## Version 3.32k

1. Handler function _OS_OnTx() for serial communication to embOSView corrected.
   The transmission handler for communication with embOSView might have sent incorrect data to embOSView, because internal control state was updated after sending the data.
   The problem occurred on a new embOS port for a specific CPU only and is fixed with version 3.32k.

## Version 3.32h

1. OS_Error() was required in release build when resource semaphores were used.
   When using release build libraries and resource semaphores, the embOS error handler OS_Error() was required and the file OS_Error.c had to be compiled and linked in a project.
   The problem existed since version 3.28i of embOS and is fixed with version 3.32h.

## Version 3.32e

1. OS_GetMessageCnt() corrected.
   The type of the retun value of OS_GetMessageCnt() was an unsigned integer in release builds, but an integer in debubg builds.
   This was corrected to return an unsigned integer in all builds.
   The problem existed in all previous versions of embOS end is fixed with version 3.32e.

## Version 3.32a

1. embOSView corrected.
   embOSView sometimes showed wrong task state "Terminated" for tasks which were not terminated.
   This bug existed in all previous versions of emBOSView and is fixed with version 3.32a.

## Version 3.30d

1. OS_MEMF_Create() corrected.
   Alignment check of buffers for fixed size memory blocks did not work correctly in debug libraries of embOS.
   OS_Error() was called during OS_MEMF_Create(), even though the memory pool buffers start address was correctly aligned.
   This problem existed since embOS version 3.28m in all debug build libraries and is fixed with version 3.30d.

## Version 3.30b

1. OS_Suspend() corrected.
   OS_Suspend() did not work correctly, when an activated task with higher priority than the running task was suspended.
   When the task with highest priority was suspended during system initialization before embOS was started, embOS crashed during the call of OS_Start(), or called the embOS error handler OS_Error() with error code OS_ERR_INV_TASK (128).
   The same crash occurred, when the application was running in a critical region and a task with higher priority was activated, but not started because of the critical region, and was then suspended by a call of OS_Suspend().
   This problem existed in all previous embOS versions and is fixed with version 3.30b.

## Version 3.28q

1. Problem with suspended tasks which were on delay fixed.
   If a task which was on delay was suspended, the delay timer for that task was not handled.
   This might have resulted in additional longer delay when the task was resumed later.
   This problem existed in all previous embOS versions and is fixed with version 3.28q.

## Version 3.28p

1. OS_Suspend() corrected.
   OS_Suspend() did not work correctly, when the current task was suspended from within an interrupt handler, or from a critical region.
   The application crashed, or called the embOS error handler OS_Error() with error code OS_ERR_INV_TASK (128).
   As OS_Suspend() automatically enters a critical region in debug-trace builds, OS_Suspend() also failed, when it was called to suspend the current task in debug-trace builds of embOS.
   This problem existed in all previous embOS versions and is fixed with version 3.28p.
2. Alignment problems fixed for fixed size memory blocks
   Some CPUs, mainly the 32bit RISC types, require aligned buffer start addresses for fixed size memory pools.
   The debug version of embOS now checks alignment of buffer start address and data blocks in the buffer. If data blocks and buffer start address is not aligned, an error is generated and embOS error handler is called during creation of a fixed size memory pool.
   This problem existed in all previous embOS versions and is fixed with version 3.28m.

## Version 3.28l

1. OS_MEMF_Free() added
   The function OS_MEMF_Free() was not included in embOS libraries, but was documented in embOS users manual and was also declared in RTOS.h.
   This problem existed in all previous embOS versions and is fixed with version 3.28l.

## Version 3.28k

1. OS_MEMF_IsInPool() corrected
   OS_MEMF_IsInPool() failed, if a pointer was checked which pointed to the first address after the memory pool. This pointer was reported as belonging to the pool.
   This problem existed in all previous embOS versions and is fixed with version 3.28g.

## Version 3.28g

1. OS_WakeTask() for trace build corrected
   OS_WakeTask() in trace build disabled task switches.
   This problem existed since version 3.24 and is fixed with version 3.28g.
2. OS_GetMailTimed() / mailbox handling corrected
   During call of OS_GetMailTimed, interrupts were re-enabled too early. If a mail was just put into a mailbox and the timeout occurred at the same time, a mailbox internal control variables which managed waiting tasks was set to a wrong value.
   This resulted in wrong mailbox handling and caused task waiting for mail kept suspended, even though, mail was available. This problem existed in all previous versions of embOS and is fixed with version 3.28g.

## Version 3.26a

1. OS_MEMF_Release() corrected
   OS_MEMF_Release() might have failed according to absolute address of memory block.
   The problem occurred because address calculation was done with 16bit integer value.
   Calculation was modified to use 32bit values to fix the problem.

## Version 3.20c

1. OS_GetMailTimed() corrected
   OS_GetMailTimed() did not retrieve a mail after 256 calls, the waiting task remained suspended. Corrected with version 3.20c of embOS.
   This problem exists in all previous embOS versions and is fixed with version 3.20c.

## Version 3.10r

1. OS_TASK structure definition modified
   Previous definition of OS_Task structure may cause linker warnings [w6] and [w35] even though everything was correct.
   The problem was caused by unions defined inside a structure.
   OS_TASK definition was modified to avoid those linker warnings.

## Version 3.10q

1. OS_GetMail
   OS_GetMail functions corrected (interrupts disabled before call of _GetMail).
2. OS_Terminate problem with RR
   OS_Terminate problem with RR tasks corrected. TimerTick could set RR/PP pending between UNMARKTASK and OS_Switch. OS_Switch will then call OS_DoRR, which could append OS_pCurrentTask (the one you want to terminate if e.g. OS_Terminate(NULL)).

## Version 3.10n

1. Sample interrupt handler
   For embOS it is not legal to call OS_EnterInterrupt again after final call of OS_LeaveInterrupt has been made. In the sample OS_irq_handler shipped with embOS, there was a possible call of OS_EnterInterrupt after OS_LeaveInterrupt. The sample OS_irq_handler implementation has been corrected.

## Version 3.06h

1. OS_Unuse error code corrected
   When calling OS_Unuse() more often than OS_Use(), the debug version generated an OS_ERR_TASKLIST_CORRUPT error instead of OS_ERR_UNUSE_BEFORE_USE.
   This problem exists in all previous embOS versions and is fixed with version 3.06h.

## Version 3.06f

1. Round Robin Task Problem corrected
   In very specific situation it was possible that a round robin task got 100%
   of CPU time for round robin tasks instead of sharing that time with other
   round robin tasks.

# Release history

Version | Release date | Short explanation
V4.34 | 08. Mar 2017 | New API functions OS_EVENT_SetMaskMode() and OS_EVENT_GetMaskMode().
V4.32 | 10. Jan 2017 | New API functions OS_EVENT_SetMask(), OS_EVENT_GetMask(), OS_EVENT_WaitMask() and OS_EVENT_WaitMaskTimed() added. New API functions OS_PutMailTimed() and OS_PutMailTimed1() added. New API functions OS_WD_Add(), OS_WD_Check(), OS_WD_Config(), OS_WD_Remove() and OS_WD_Trigger() added.
V4.30 | 08. Dec 2016 | New API functions OS_GetMailTimed1(), OS_ClearSingleEvent(), OS_RemoveTerminateHook() and OS_MPU_SwitchToUnprivStateEx() added. OS_ResumeAllSuspendedTasks() renamed to OS_ResumeAllTasks(). OS_RemoveOnTerminateHooks renamed to OS_RemoveAllTerminateHooks() OS_AddOnTerminateHook() renamed to OS_AddTerminateHook(). Source code refactoring.
V4.26 | 07. Sep 2016 | New API function OS_RemoveOnTerminateHooks() added. embOS version mismatch check added. embOS scheduler improved.
V4.24 | 28. Jun 2016 | Spinlock API for multi-core support added. Several SYSVIEW trace macros added to indicate task termination and execution end of API functions.
V4.22 | 25. May 2016 | OS_Q_PutEx(), OS_Q_PutBlockedEx(), and OS_Q_PutTimedEx() added.
V4.20 | 22. Apr 2016 | MPU support added. OS_AddExtendTaskContext() added. OS_WaitMailTimed() corrected.
V4.16 | 22. Jan 2016 | MISRA-C:2012 compliance updated.
V4.14a | 15. Jan 2016 | OS_Q_Create() corrected.
V4.14 | 03. Nov 2015 | New API fucntion OS_SetDefaultTaskContextExtension() added. New macros OS_INT_PRIO_PRESERVE() and OS_INT_PRIO_RESTORE() added. New API functions OS_TriggerTimer() and OS_TriggerTimerEx() added. SYSVIEW and Percepio trace macros added. OS_StopTicklessMode() corrected.
V4.12b | 22. Sep 2015 | SYSVIEW trace macros added.
V4.12a | 17. Sep 2015 | OS_StartTimer() corrected. SYSVIEW trace macros added/modified. OS_InInterrupt() modified.
V4.12 | 19. Aug 2015 | OS_Alloc() corrected. Percepio embOS-Trace macro in OS_CreateTimerEx() removed. New mailbox API functions OS_Mail_GetPtr(), OS_Mail_GetPtrCond() and OS_Mail_Purge() added. Support for SYSVIEW API trace added.
V4.10b | 29. May 2015 | OS_TerminateTask() corrected. OS_AdjustTime() corrected OS_SendString() parameter declaration modified to avoid compiler warning.
V4.10a | 13. May 2015 | OS_GetTime_us() / OS_GetTime_us64() corrected.
V4.10 | 30. Apr 2015 | embOS is MISRA C:2012 compliant. Percepio embOS-Trace defines added. OS_GetNumIdleTicks() corrected.
V4.06b | 24. Mar 2015 | Percepio embOS-Trace macro in OS_TerminateTask() corrected.
V4.06a | 16. Mar 2015 | Percepio embOS-Trace macros added/modified. OS_Counters declaration modified.
V4.06 | 12. Mar 2015 | Support for Percepio embOS-Trace added. OS_StopTicklessMode() corrected.
V4.04a | 01. Dec 2014 | OS_Config_SysTimer(), OS_GetTime_us() and OS_GetTime_us64() were not included in the embOS built.
V4.04 | 12. Nov 2014 | Task priorities extended to 32bit. OS_SendString() corrected. OS_GetTime_us() corrected.
V4.02a | 15. Sep 2014 | Compile error fixed when disabling embOS tickless feature with the compile-time switch OS_SUPPORT_TICKLESS.
V4.02 | 15. Aug 2014 | New functions OS_GetTime_us(), OS_GetTime_us64() and OS_Config_SysTimer() added.
V4.00a | 21. Jul 2014 | New tickless function OS_StopTicklessMode() added. New const variable OS_DebugInfo added. New profiling functions OS_STAT_Enable(), OS_STAT_Disable() and OS_STAT_GetTaskExecTime() added. OS_SendString() corrected.
V4.00 | 06. Jun 2014 | Tickless support added.
V3.90a | 09. Apr 2014 | OS_TerminateTask() corrected.
V3.90 | 17. Feb 2014 | Functions to disable/enable global interrupts added.
V3.88h | 20. Dec 2013 | OS_GetNumIdleTicks() added. OS_AdjustTime() added.
V3.88g | 30. Oct 2013 | OS_Q_Clear() corrected.
V3.88f | 22. Sep 2013 | Internal const variable definition corrected.
V3.88e | 06. Sep 2013 | Internal function prototype corrected. Assertion into OS_Delayus() added.
V3.88d | 04. Sep 2013 | Compatibility macros to older versions added.
V3.88c | 08. Aug 2013 | New API functions OS_InInterrupt(), OS_Q_PutTimed() added. Additional new profiling functionality
V3.88b | 28. May 2013 | Internal data structure changed.
V3.88a | 02. May 2013 | Event object handling enhanced. Mailbox message size enlarged. Timer handling corrected. Release notes corrected for V3.86m
V3.88 | 19. Feb 2013 | Fully tested with Parasoft C/C++test MISRA check.
V3.86n | 07. Dec 2012 | Problem with embOS heap management fixed.
V3.86m | 05. Dec 2012 | Scheduler corrected. Definition of OS_VERSION corrected.
V3.86l | 21. Nov 2012 | MISRA rule compliance improved. OS_AddTickHook() corrected.
V3.86k | 02. Oct 2012 | New embOS API functions OS_Q_GetMessageSize() and OS_Q_PeekPtr(). embOS is now compliant to MISRA 2004 rules.
V3.86i | 26. Sep 2012 | OS_EnterNestableInterrupt() modified.
V3.86h | 06. Sep 2012 | OS_EVENT handling with timeout corrected.
V3.86g | 04. Aug 2012 | OS_RetriggerTimer() corrected.
V3.86f | 25. Jul 2012 | Task events default to 32bit on 32bit CPUs. New OS_AddOnTerminateHook() function. OS_ERR_TIMESLICE removed.
V3.86e | 29. May 2012 | OS_malloc(), OS_free(), OS_realloc() modified. Stack info functions corrected.
V3.86d | 9. May 2012 | Timeout handling for waitable objectes corrected.
V3.86c | 8. May 2012 | Missing OS_EnterRegionFunc() prototype added.
V3.86b | 2. May 2012 | New API function OS_PeekMail() RTOS.h macro definitions modified.
V3.86a | 30. Apr 2012 | Queue handling corrected.
V3.86 | 22. Mar 2012 | New timeout handling for waitable objects. OS task events corrected.
V3.84c | 05. Jan 2012 | OS_Q_Put() removed from OSQ.c.
V3.84b | 21. Dec 2011 | New embOS API function OS_Q_PutBlocked().
V3.84a | 22. Nov 2011 | New compile-time check ensures, OS_CPU is defined when compiling sources.
V3.84 | 27. Sep 2011 | New stack check functions for system and interrupt stack.
V3.82x | 12. Sep 2011 | OS_RegionCnt overflow check added. Macro OS_EnterInterrupt() modified.
V3.82w | 10. Aug 2011 | GCC compiler warning eliminated. Code modified for Lint. Resource semaphore handling corrected.
V3.82v | 15. Jul 2011 | OS_Terminate() renamed to OS_TerminateTask().
V3.82u | 25. May 2011 | Generic tick handler modified. Software timer handling improved.
V3.82t | 03. May 2011 | Trial time limitation increased to 12 hours.
V3.82s | 18. Mar 2011 | OS_UseTimed() implemented. Improvements Corrections.
V3.82r | 28. Jan 2011 | TLS support improved.
V3.82q | 18. Jan 2011 | OS_EnterNestableInterrupt() optimized.
V3.82p | 12. Jan 2011 | OS_PutMail functions parameter qualifier modified.
V3.82o | 04. Jan 2011 | New API function OS_WaitMailTimed()
| V3.82n | 06. Dec 2010 | New API functions for task suspension and synchronization.
V3.82m | 16. Nov 2010 | Queue handling corrected.
V3.82l | 26. Oct 2010 | TLS support added
V3.82k | 21. Sep 2010 | Queue handling corrected. New API functions for queues and delay.
V3.82i | 26. Jul 2010 | Warnings under GCC eliminated.
V3.82h | 28. May 2010 | Internal data types modified.
V3.82g | 12. May 2010 | OS_Start() modified.
V3.82f | 16. Apr 2010 | New function OS_IsRunning() implemented.
V3.82e | 17. Dec 2009 | Stack check for system and interrupt stack added.
V3.82d | 16. Dec 2009 | Variable type changed to avoid GCC warnings Changes in OS_Global initialization to avoid GCC warnings.
V3.82c | 18. Nov 2009 | Changes in OS_Global initialization to avoid GCC warnings. Definition OS_MODEL moved from OS_RAW.h to OSINFO.c.
V3.82b | 28. Oct 2009 | Communication to embOSView modified.
V3.82a | 25. Sep 2009 | Error handling for queues implemented. OS_Q_IsInUse() implemented.
V3.82 | 17. Sep 2009 | Scheduling optimized.
V3.80l | 07. Sep 2009 | New Macros OS_U32_TO_PTR_TYPE() and OS_EI_HP_ON_ENTRY() added.
V3.80k | 02. Sep 2009 | Trace functions corrected.
V3.80i | 11. Aug 2009 | Optimized resource semaphore handling.
V3.80h | 27. Jul 2009 | Modified interrupt entry.
V3.80g | 05. Jun 2009 | Improved embOS plugin.
V3.80f | 03. Jun 2009 | Improved error handler.
V3.80 | 14. Nov 2008 | Improved scheduler.
V3.62c | 24. Oct 2008 | OS_GetPriority() corrected. Additional error handling.
V3.62a | 06. Oct 2008 | OS_STACK_ALIGN implemented.
V3.62 | 01. Sep 2008 | Tick handler modified.
V3.60e | 25. Aug 2008 | OS_EVENT_Create() corrected.
V3.60d | 28. Mai 2008 | OS_POWER module implemented.
V3.60c | 24. Apr 2008 | OS_GetTaskName() improved. OS_ASSERT_INIT_CALLED() added.
V3.60b | 25. Jan 2008 | OS_ASSERT_ISR_LEVEL() defined.
V3.60a | 25. Jan 2008 | Time limit for trial version added.
V3.60 | 18. Nov 2007 | System tick hook functions introduced.
V3.52e | 12. Nov 2007 | Location of embOS variables modified.
V3.52c | 17. Oct 2007 | OS_SetTaskName() introduced. OS_SendString() corrected. embOSView corrected.
V3.52a | 03. Sep 2007 | OS_Terminate() in XR-builds corrected.
V3.52 | 17. Aug 2007 | OS_CallISR(), OS_CallNestableISR() introduced. OS_TickHandler(), OS_TickHandler_Ex() removed.
V3.50c | 10. Aug 2007 | OS_GetTime32() optimized.
V3.50b | 16. Jul 2007 | Task switching time and interrupt latencies improved.
V3.50a | 12. Jul 2007 | System stack check for PIC corrected.
V3.50 | 10. Jul 2007 | embOS scheduler optimized.
V3.40d | 05. Jul 2007 | OS_Suspend() corrected.
V3.40c | 22. Jun 2007 | OS_Yield() implemented.
V3.40b | 19. Jun 2007 | Queue handling improved.
V3.40a | 05. Jun 2007 | Counting semaphores improved.
V3.40 | 08. May 2007 | Improvements.
V3.32o | 19. Apr 2007 | OS_Unuse() error handling improved.
V3.32n | 16. Apr 2007 | OS_SUSPEND_TASK_ON_TERMINATE implemented. Fixes a Windows bug which caused emBOS Simulation to crash.
V3.32m | 02. Apr 2007 | OS_TimerEx implemented.
V3.32l | 28. Mar 2007 | Round robin switching corrected.
V3.32k | 21. Mar 2007 | Communication to embOSView modified.
V3.32j | 31. Jan 2007 | OS_CSemaRequest() implemented.
V3.32i | 26. Jan 2007 | Switch to OS_Idle() modified.
V3.32h | 15. Jan 2007 | Error handling for resource semaphores corrected.
V3.32g | 30. Dec 2006 | OS_PTR_TO_VALUE() added.
V3.32f | 07. Dec 2006 | OS_INIT_SYS_LOCKS() added.
V3.32e | 07. Nov 2006 | OS_GetMessageCnt() corrected.
V3.32d | 05. Nov 2006 | OS_Q_GetPtrTimed() added.
V3.32c | 22. Sep 2006 | OS_EVENT_WaitTimed() added.
V3.32b | 18. Sep 2006 | Enhanced debug information.
V3.32a | 04. Aug 2006 | Extended task implemented
V3.32 | 18. Jul 2006 | Event objects implemented
V3.30d | 20. Jun 2006 | OS_MEMF_Create() corrected
V3.30b | 18. May 2006 | New sources version 3.30b, OS_Suspend() corrected
V3.28p | 16. Feb 2006 | New error handling for version without round robin scheduling
V3.28i | 14. Oct 2005 | New embOS sources 3.28i with new function OS_DeleteRSema()
V3.28h | 29. Aug 2005 | New embOS sources 3.28h, Enhanced error checks
V3.28g | 23. Aug 2005 | New embOS sources 3.28g
V3.24 | 25. Nov 2004 | New embOS sources 3.24
V3.20d | 22. Jan 2004 | New embOS sources V3.20, OS_GetMailTimed corrected
V3.10k | 13. Jan 2003 | Upgrade to new generic source V3.10k
V3.06f | 24. Oct 2001 | Upgrade to new generic source V3.06f
V3.06 | 23. Jul 2001 | First version with release history

Copyright 2001-2017 SEGGER Microcontroller GmbH & Co. KG. All rights reserved.
For more information, please visit our website www.segger.com or contact us at info@segger.com