GadgetSeed  0.9.6
event.c
[詳解]
1 /** @file
2  @brief イベント待ちタスクキューの操作
3 
4  @date 2011.03.20
5  @author Takashi SHUDO
6 */
7 
8 #include "event_opration.h"
9 #include "queue_opration.h"
10 
11 //#define DEBUGKBITS 0x03
12 #include "dkprintf.h"
13 
14 
15 struct st_event event_queue_list; // イベントキューのキュー
16 
17 void init_eventqueue(void)
18 {
19  DKFPRINTF(0x01, "done\n");
20 
21  init_queue(&event_queue_list.list);
22 }
23 
24 
25 /**
26  @brief イベントキューを登録する
27 
28  @note システムのキューに登録される
29 
30  @param[in] evtque イベントキューポインタ
31  @param[in] name イベントキュー名文字列ポインタ
32  @param[in] args イベントキュー引数バッファポインタ
33  @param[in] arg_size 1イベント引数のサイズ
34  @param[in] arg_count キューするイベント数
35 */
36 void eventqueue_register_ISR(struct st_event *evtque, const char *name, void *args, unsigned int arg_size, int arg_count)
37 {
38  DKFPRINTF(0x01, "\"%s\", args = %p, size = %d, count = %d\n",
39  name, args, arg_size, arg_count);
40 
41  init_fifo(&evtque->event, args, arg_size * arg_count);
42 
43  evtque->name = name;
44  evtque->size = arg_size;
45 
46  init_queue(&evtque->proc_head);
47 
48  add_queue(&event_queue_list.list, (struct st_queue *)evtque);
49 }
50 
51 /**
52  @brief イベントキューを登録解除する
53 
54  @note システムのキューより削除される
55 
56  @param[in] evtque イベントキューポインタ
57 */
58 void eventqueue_unregister_ISR(struct st_event *evtque)
59 {
60  DKFPRINTF(0x01, "evtque = %p\n", evtque);
61 
62  /*
63  * 本当は待ちキューがあれば復帰する
64  * 今は、待ちキューは、迷子のキューになってしまう
65  */
66 
67  del_queue((struct st_queue *)evtque);
68 }
69 
70 /**
71  * @brief タスクをイベント待ちキューに登録する
72  */
73 void _eventqueue_wait(struct st_event *evtque, struct st_tcb *tcb)
74 {
75  DKFPRINTF(0x01, "Wait_Event PID=%d \"%s\"\n", tcb->id, tcb->name);
76 
77  add_queue(&evtque->proc_head, (struct st_queue *)tcb);
78 
79  return;
80 }
81 
82 /**
83  * @brief イベント待ちタスクを返す
84  */
85 struct st_tcb *_eventqueue_wakeup(struct st_event *evtque)
86 {
87  struct st_tcb *wup_tcb = 0;
88 
89  DKFPRINTF(0x01, "name = \"%s\"\n", evtque->name);
90 
91  // イベント待ちキューがある?
92  if(check_queue(&evtque->proc_head) == 0) {
93  // 待ちキュー無し
94  return (struct st_tcb *)0;
95  }
96 
97  /*
98  起床するタスク
99  タイムアウト時間の早い順に起床してしまう。
100  待ち登録順の方が良いか?
101  */
102  wup_tcb = (struct st_tcb *)del_next_queue(&evtque->proc_head);
103 
104  DKPRINTF(0x02, "Event wakeup PID=%d \"%s\"\n", wup_tcb->id, wup_tcb->name);
105  DKPRINTF(0x02, " wup = %ld\n", wup_tcb->wup_time);
106 
107  return wup_tcb;
108 }
void eventqueue_unregister_ISR(struct st_event *evtque)
イベントキューを登録解除する
Definition: event.c:58
struct st_tcb * _eventqueue_wakeup(struct st_event *evtque)
イベント待ちタスクを返す
Definition: event.c:85
struct st_fifo event
イベントデータバッファ
Definition: event.h:18
キュー構造
Definition: queue.h:13
void _eventqueue_wait(struct st_event *evtque, struct st_tcb *tcb)
タスクをイベント待ちキューに登録する
Definition: event.c:73
char name[TASK_NAME_LEN+1]
タスク名
Definition: tcb.h:39
struct st_queue proc_head
イベント待ちタスクキュー
Definition: event.h:17
void eventqueue_register_ISR(struct st_event *evtque, const char *name, void *args, unsigned int arg_size, int arg_count)
イベントキューを登録する
Definition: event.c:36
イベント
Definition: event.h:15
unsigned int wup_time
スリープタイムアウト時間
Definition: tcb.h:49
struct st_queue list
イベントキューのキュー
Definition: event.h:16
キュー操作
const char * name
イベント名文字列
Definition: event.h:20
void init_fifo(struct st_fifo *fp, unsigned char *buf, unsigned int size)
fifoを初期化する
Definition: fifo.c:20
イベントキュー操作
カーネル、ドライバ(非タスク)デバッグ用マクロ
int id
タスクID
Definition: tcb.h:38
unsigned int size
1イベントのサイズ
Definition: event.h:19
タスクコンテキスト
Definition: tcb.h:32