Difference between revisions of "OCEOS/oceos inter-task communication/dataq"
Okhoruzhyy (talk | contribs) |
Okhoruzhyy (talk | contribs) |
||
Line 1: | Line 1: | ||
=<span style="color:#0000ff">'''Data Queue'''</span>= | =<span style="color:#0000ff">'''Data Queue'''</span>= | ||
==<span style="color:#0000ff">Introduction</span>== | ==<span style="color:#0000ff">Introduction</span>== | ||
These are FIFO queues of non-null void pointers ordered by arrival time. Each queue has an associated pending jobs queue, and two associated atomic operations, read and write. A size operation gives the number of pointers on the queue, and the data queue create operation sets the maximum size of the queue. | |||
The read operation returns the first pointer on the queue unless the queue is empty. Unlike many other OS, the job that performs the read operation does not block if the queue is empty. Instead OCEOS provides three options for the read operation to determine what should happen in that case: | |||
* In the [[OCEOS/oceos inter-task communication/dataq#oceos_dataq_read_continue()|oceos_dataq_read_continue()]] option if the queue is empty a null pointer is returned and the job proceeds taking this into account. | |||
* In the [[OCEOS/oceos inter-task communication/dataq#oceos_dataq_read_restart()|oceos_dataq_read_restart()]] or [[OCEOS/oceos inter-task communication/dataq#oceos_dataq_read_restart_timeout()|oceos_dataq_read_restart_timeout()]] options if the queue is empty the job terminates and will restart from its beginning when the queue is written or the timeout occurs. | |||
* A job that was started as a result of a timeout does not terminate if it comes to [[OCEOS/oceos inter-task communication/dataq#oceos_dataq_read_restart_timeout()|oceos_dataq_read_restart_timeout()]] and the data queue is still empty, a null pointer is returned to show there was a timeout and the job continues. | |||
A pointer is added to the queue by write. All jobs on the pending list are moved to the ready queue and also removed from the timed actions queue if present. | |||
The pending queue order of jobs with the same priority is preserved in the transfer. The scheduler is then activated and may pre-empt the current executing job. | |||
In case the queue is full, the new entry can be dropped or the oldest entry overwritten, depending on an option chosen when the data queue is created. An appropriate status is returned and a log entry is made if the new entry is dropped. | |||
<blockquote style="background-color: #c6e2f7; border-left-style: solid; border-left-width: 3px; border-left-color: blue; "> '''Note'''<br> | |||
If timeouts are used with data queues the hardware specific timer initialization and handling must be set up by the developer please see [[OCEOS/oceos timed actions|here]]. | |||
</blockquote> | |||
[[Category:backup]] | [[Category:backup]] |
Revision as of 15:34, 22 March 2022
Data Queue
Introduction
These are FIFO queues of non-null void pointers ordered by arrival time. Each queue has an associated pending jobs queue, and two associated atomic operations, read and write. A size operation gives the number of pointers on the queue, and the data queue create operation sets the maximum size of the queue.
The read operation returns the first pointer on the queue unless the queue is empty. Unlike many other OS, the job that performs the read operation does not block if the queue is empty. Instead OCEOS provides three options for the read operation to determine what should happen in that case:
- In the oceos_dataq_read_continue() option if the queue is empty a null pointer is returned and the job proceeds taking this into account.
- In the oceos_dataq_read_restart() or oceos_dataq_read_restart_timeout() options if the queue is empty the job terminates and will restart from its beginning when the queue is written or the timeout occurs.
- A job that was started as a result of a timeout does not terminate if it comes to oceos_dataq_read_restart_timeout() and the data queue is still empty, a null pointer is returned to show there was a timeout and the job continues.
A pointer is added to the queue by write. All jobs on the pending list are moved to the ready queue and also removed from the timed actions queue if present.
The pending queue order of jobs with the same priority is preserved in the transfer. The scheduler is then activated and may pre-empt the current executing job.
In case the queue is full, the new entry can be dropped or the oldest entry overwritten, depending on an option chosen when the data queue is created. An appropriate status is returned and a log entry is made if the new entry is dropped.
Note
If timeouts are used with data queues the hardware specific timer initialization and handling must be set up by the developer please see here.