Difference between revisions of "OCEOS/oceos inter-task communication/mutex"

From wiki
Jump to navigation Jump to search
Line 42: Line 42:
<blockquote style="border-left-style: none;">
<blockquote style="border-left-style: none;">
<span style="color:#1b7ac2">'''Header File'''</span><br>
<span style="color:#1b7ac2">'''Header File'''</span><br>
'''''initialisation.h'''''<br>
'''''mutex.h'''''<br>


<span style="color:#1b7ac2">'''Description'''</span><br>
<span style="color:#1b7ac2">'''Description'''</span><br>
 
Creates a mutex with priority ceiling.<br>
This function should only be called after OCEOS is initialized with [[OCEOS/oceos kernel/initialisation#oceos_init()|oceos_init()]] and before initialization ends with [[OCEOS/oceos kernel/initialisation#oceos_init_finish()|oceos_init_finish()]] and scheduling starts with [[OCEOS/oceos kernel/initialisation#oceos_start()|oceos_start()]]<br>
<span style="color:#1b7ac2">'''Prototype'''</span><br>
<span style="color:#1b7ac2">'''Prototype'''</span><br>
<syntaxhighlight lang="C">
<syntaxhighlight lang="C">
 
enum DIRECTIVE_STATUS  oceos_mutex_create(
    const unsigned int id,      // mutex ID, must be in range 0 to 62
    const U8_t  priority        // mutex priority ceiling
);
</syntaxhighlight>
</syntaxhighlight>
<span style="color:#1b7ac2">'''Parameters'''</span><br>
<span style="color:#1b7ac2">'''Parameters'''</span><br>
Line 55: Line 59:
! Parameter !! Description
! Parameter !! Description
|-
|-
| ||
| id      || Mutex ID, must be in range 0 to 62
|-
| priority || Mutex priority ceiling from 1 to 254 (high to low task priority)
|}
|}
<span style="color:#1b7ac2">'''Returns'''</span><br>
<span style="color:#1b7ac2">'''Returns'''</span><br>
Line 63: Line 69:
! enum DIRECTIVE_STATUS !! Description
! enum DIRECTIVE_STATUS !! Description
|-
|-
| INCORRECT_STATE || If system Meta pointer is NULL or
| INCORRECT_STATE || System Meta pointer is NULL or corrupt
                    Init pointer is NULL or
|-
                    Start up phase check fail or
| INVALID_ID      || Failed mutex id check
                    Fixed data checksum failed (check log)
|-
|-
| INVALID_NAME    || If Start Sentinel for fixed area is corrupt or
| INVALID_NAME    || Mutex ID is not available
                    Start Sentinel for dynamic area is corrupt
|-
|-
| INVALID_NUMBER  || If Configuration and actual parameters do not match
| INVALID_NUMBER  || Mutex priority is not valid
                    (In configuration file was defined 5 tasks, but created less)
|-
|-
| SUCCESSFUL     || If All OK
| TOO_MANY        || Mutex configuration max value reached
|-
| SUCCESSFUL     || All OK
|}
|}
<span style="color:#1b7ac2">'''Example Usage'''</span><br>
<span style="color:#1b7ac2">'''Example Usage'''</span><br>
<syntaxhighlight lang="C">
<syntaxhighlight lang="C">
      
//mutex names  - all start with m_ to avoid confusion with other names
  </syntaxhighlight>
enum MUTEX_NAME{
    m_apple,
     m_grape
};
...
enum DIRECTIVE_STATUS status;
status = oceos_mutex_create(m_apple, 3);
  if(SUCCESSFUL != status){
    // Handle ERROR
}  // if
</syntaxhighlight>
</blockquote>
</blockquote>
[[Category:backup]]
[[Category:backup]]

Revision as of 10:37, 22 March 2022

Mutex

Introduction

In OCEOS all mutexes are defined at compile time when the tasks that use them are known. A job obtains and returns a mutex by ‘wait’ and ‘signal’ calls to OCEOS.

Each mutex has a priority ceiling, the priority of the highest priority job that can ‘wait’ for that mutex. This is identified by the application developer and used in defining the mutex.

At compile time it is possible to determine the maximum time for which a mutex can be held by examining the source code of each task that uses the mutex.

Note

If a job simultaneously holds more than one mutex, this must be done in a LIFO nested way, e.g. Wait1, Wait2, Wait3, Signal3, Signal2, Signal1.

The maximum time across all mutexes for which a mutex can be held gives the maximum time for which a higher priority task can be blocked waiting for a mutex (assuming mutex overlaps are nested).

In OCEOS when a mutex ‘wait’ call succeeds, the current system priority ceiling value is replaced by a value derived from the mutex and the current system priority ceiling.

When a mutex ‘signal’ call succeeds, the previous system priority ceiling is restored and OCEOS automatically reschedules and pre-empts if appropriate.

In OCEOS a pending job only becomes active if its priority is higher than the system priority ceiling. As a result when a job becomes active no mutex that could block it is currently held.

In OCEOS if a job does a mutex ‘wait’ and then a ‘wait’ on the same mutex without an intervening ‘signal’ the second ‘wait’ is treated as a no-operation but is logged and the system state updated.

In OCEOS a ‘signal’ by a job on a mutex not currently held by the job is treated as a no-operation but is logged and the system state updated.

In OCEOS if a job terminates while holding a mutex the ‘signal’ operation is performed automatically for all mutexes held by the job and this is logged and the system state updated.

Mutexes can be read by interrupt handling code but do not provide mutual exclusion for such code. Mutual exclusion in interrupt handling code is achieved by enabling and disabling traps/interrupts.

API Functions

API Functions
Directive Description main task IRQ handler
oceos_mutex_create() Create Mutex *
oceos_mutex_wait() Wait on mutex with ID *
oceos_mutex_signal() Signal a mutex with ID *
oceos_mutex_get_value() Get current value of mutex with ID * *

oceos_mutex_create()

Header File
mutex.h

Description
Creates a mutex with priority ceiling.
This function should only be called after OCEOS is initialized with oceos_init() and before initialization ends with oceos_init_finish() and scheduling starts with oceos_start()
Prototype

enum DIRECTIVE_STATUS   oceos_mutex_create(
    const unsigned int id,       // mutex ID, must be in range 0 to 62
    const U8_t  priority         // mutex priority ceiling
);

Parameters

Parameter Description
id Mutex ID, must be in range 0 to 62
priority Mutex priority ceiling from 1 to 254 (high to low task priority)

Returns
This function returns enum DIRECTIVE_STATUS.

enum DIRECTIVE_STATUS Description
INCORRECT_STATE System Meta pointer is NULL or corrupt
INVALID_ID Failed mutex id check
INVALID_NAME Mutex ID is not available
INVALID_NUMBER Mutex priority is not valid
TOO_MANY Mutex configuration max value reached
SUCCESSFUL All OK

Example Usage

//mutex names   - all start with m_ to avoid confusion with other names
enum MUTEX_NAME{
    m_apple,
    m_grape 
};
...
 enum DIRECTIVE_STATUS status;
 status = oceos_mutex_create(m_apple, 3);
 if(SUCCESSFUL != status){
    // Handle ERROR
}   // if