dataqueue.h

#include <queue.h>

ソースコードを見る。

データ構造

struct  dataqueue_initialization_block
struct  dataqueue_control_block
struct  dataqueue_waiting_information

マクロ定義

#define DTQID(p_dtqcb)   ((ID)(((p_dtqcb) - dtqcb_table) + TMIN_DTQID))

型定義

typedef struct
dataqueue_initialization_block 
DTQINIB
typedef struct
dataqueue_control_block 
DTQCB
typedef struct
dataqueue_waiting_information 
WINFO_DTQ

関数

void initialize_dataqueue (void)
void enqueue_data (DTQCB *p_dtqcb, intptr_t data)
void force_enqueue_data (DTQCB *p_dtqcb, intptr_t data)
void dequeue_data (DTQCB *p_dtqcb, intptr_t *p_data)
bool_t send_data (DTQCB *p_dtqcb, intptr_t data, bool_t *p_reqdsp)
bool_t force_send_data (DTQCB *p_dtqcb, intptr_t data)
bool_t receive_data (DTQCB *p_dtqcb, intptr_t *p_data, bool_t *p_reqdsp)

変数

const ID tmax_dtqid
const DTQINIB dtqinib_table []
DTQCB dtqcb_table []


マクロ定義

#define DTQID ( p_dtqcb   )     ((ID)(((p_dtqcb) - dtqcb_table) + TMIN_DTQID))

dataqueue.h114 行で定義されています。

参照元 ref_tsk().


型定義


関数

void dequeue_data ( DTQCB p_dtqcb,
intptr_t *  p_data 
)

dataqueue.c225 行で定義されています。

参照先 dataqueue_control_block::count, dataqueue_initialization_block::dtqcnt, dataqueue_control_block::head, dataqueue_control_block::p_dtqinib, と dataqueue_initialization_block::p_dtqmb.

00226 {
00227     *p_data = *(p_dtqcb->p_dtqinib->p_dtqmb + p_dtqcb->head);
00228     p_dtqcb->count--;
00229     p_dtqcb->head++;
00230     if (p_dtqcb->head >= p_dtqcb->p_dtqinib->dtqcnt) {
00231         p_dtqcb->head = 0U;
00232     }
00233 }

void enqueue_data ( DTQCB p_dtqcb,
intptr_t  data 
)

dataqueue.c184 行で定義されています。

参照先 dataqueue_control_block::count, dataqueue_initialization_block::dtqcnt, dataqueue_control_block::p_dtqinib, dataqueue_initialization_block::p_dtqmb, と dataqueue_control_block::tail.

00185 {
00186     *(p_dtqcb->p_dtqinib->p_dtqmb + p_dtqcb->tail) = data;
00187     p_dtqcb->count++;
00188     p_dtqcb->tail++;
00189     if (p_dtqcb->tail >= p_dtqcb->p_dtqinib->dtqcnt) {
00190         p_dtqcb->tail = 0U;
00191     }
00192 }

void force_enqueue_data ( DTQCB p_dtqcb,
intptr_t  data 
)

dataqueue.c202 行で定義されています。

参照先 dataqueue_control_block::count, dataqueue_initialization_block::dtqcnt, dataqueue_control_block::head, dataqueue_control_block::p_dtqinib, dataqueue_initialization_block::p_dtqmb, と dataqueue_control_block::tail.

00203 {
00204     *(p_dtqcb->p_dtqinib->p_dtqmb + p_dtqcb->tail) = data;
00205     p_dtqcb->tail++;
00206     if (p_dtqcb->tail >= p_dtqcb->p_dtqinib->dtqcnt) {
00207         p_dtqcb->tail = 0U;
00208     }
00209     if (p_dtqcb->count < p_dtqcb->p_dtqinib->dtqcnt) {
00210         p_dtqcb->count++;
00211     }
00212     else {
00213         p_dtqcb->head = p_dtqcb->tail;
00214     }
00215 }

bool_t force_send_data ( DTQCB p_dtqcb,
intptr_t  data 
)

dataqueue.c271 行で定義されています。

参照先 force_enqueue_data, task_control_block::p_winfo, queue_delete_next(), queue_empty(), dataqueue_control_block::rwait_queue, と wait_complete.

00272 {
00273     TCB     *p_tcb;
00274 
00275     if (!queue_empty(&(p_dtqcb->rwait_queue))) {
00276         p_tcb = (TCB *) queue_delete_next(&(p_dtqcb->rwait_queue));
00277         ((WINFO_DTQ *)(p_tcb->p_winfo))->data = data;
00278         return(wait_complete(p_tcb));
00279     }
00280     else {
00281         force_enqueue_data(p_dtqcb, data);
00282         return(false);
00283     }
00284 }

void initialize_dataqueue ( void   ) 

dataqueue.c161 行で定義されています。

参照先 dataqueue_control_block::count, dtqcb_table, dtqinib_table, dataqueue_control_block::head, dataqueue_control_block::p_dtqinib, queue_initialize(), dataqueue_control_block::rwait_queue, dataqueue_control_block::swait_queue, dataqueue_control_block::tail, と tnum_dtq.

00162 {
00163     uint_t  i;
00164     DTQCB   *p_dtqcb;
00165 
00166     for (p_dtqcb = dtqcb_table, i = 0; i < tnum_dtq; p_dtqcb++, i++) {
00167         queue_initialize(&(p_dtqcb->swait_queue));
00168         p_dtqcb->p_dtqinib = &(dtqinib_table[i]);
00169         queue_initialize(&(p_dtqcb->rwait_queue));
00170         p_dtqcb->count = 0U;
00171         p_dtqcb->head = 0U;
00172         p_dtqcb->tail = 0U;
00173     }
00174 }

bool_t receive_data ( DTQCB p_dtqcb,
intptr_t *  p_data,
bool_t p_reqdsp 
)

dataqueue.c294 行で定義されています。

参照先 dataqueue_control_block::count, dequeue_data, enqueue_data, task_control_block::p_winfo, queue_delete_next(), queue_empty(), dataqueue_control_block::swait_queue, と wait_complete.

00295 {
00296     TCB     *p_tcb;
00297     intptr_t data;
00298 
00299     if (p_dtqcb->count > 0U) {
00300         dequeue_data(p_dtqcb, p_data);
00301         if (!queue_empty(&(p_dtqcb->swait_queue))) {
00302             p_tcb = (TCB *) queue_delete_next(&(p_dtqcb->swait_queue));
00303             data = ((WINFO_DTQ *)(p_tcb->p_winfo))->data;
00304             enqueue_data(p_dtqcb, data);
00305             *p_reqdsp = wait_complete(p_tcb);
00306         }
00307         else {
00308             *p_reqdsp = false;
00309         }
00310         return(true);
00311     }
00312     else if (!queue_empty(&(p_dtqcb->swait_queue))) {
00313         p_tcb = (TCB *) queue_delete_next(&(p_dtqcb->swait_queue));
00314         *p_data = ((WINFO_DTQ *)(p_tcb->p_winfo))->data;
00315         *p_reqdsp = wait_complete(p_tcb);
00316         return(true);
00317     }
00318     else {
00319         return(false);
00320     }
00321 }

bool_t send_data ( DTQCB p_dtqcb,
intptr_t  data,
bool_t p_reqdsp 
)

dataqueue.c243 行で定義されています。

参照先 dataqueue_control_block::count, dataqueue_initialization_block::dtqcnt, enqueue_data, dataqueue_control_block::p_dtqinib, task_control_block::p_winfo, queue_delete_next(), queue_empty(), dataqueue_control_block::rwait_queue, と wait_complete.

00244 {
00245     TCB     *p_tcb;
00246 
00247     if (!queue_empty(&(p_dtqcb->rwait_queue))) {
00248         p_tcb = (TCB *) queue_delete_next(&(p_dtqcb->rwait_queue));
00249         ((WINFO_DTQ *)(p_tcb->p_winfo))->data = data;
00250         *p_reqdsp = wait_complete(p_tcb);
00251         return(true);
00252     }
00253     else if (p_dtqcb->count < p_dtqcb->p_dtqinib->dtqcnt) {
00254         enqueue_data(p_dtqcb, data);
00255         *p_reqdsp = false;
00256         return(true);
00257     }
00258     else {
00259         return(false);
00260     }
00261 }


変数

const ID tmax_dtqid


Copyright © 2008 by Kijineko Inc.

ホームページ制作