■세마포어


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
/*******************************************************************************
**    File:
**
**        06_SEM.c
**
**  Contents:
**        uC/OS-II programming
**
**    History:
**        Date        Name              Description
**        ------------------------------------------------------------------------
**
*******************************************************************************/
#include "includes.h"
    
/* ...........................................................................
 *
 * 태스크 스택 정의
 * ===================
 */
OS_STK TaskStartStk[TASK_STK_SIZE]; /* START task stack */
OS_STK Task1Stk[TASK_STK_SIZE]; /* Task #1 stack */
OS_STK Task2Stk[TASK_STK_SIZE]; /* Task #2 stack */
//OS_STK Task3Stk[TASK_STK_SIZE]; /* Task #3 stack */
//OS_STK Task4Stk[TASK_STK_SIZE]; /* Task #4 stack */
 
/* ...........................................................................
 *
 * 사용자 메모리 정의
 * ===================
 */
TASK_USER_DATA  TaskUserData[7];
 
/* ...........................................................................
 *
 * 이벤트 컨트롤 & 사용자 정의 블럭 정의
 * ===================
 */
OS_EVENT *sem_id;    /* Semaphore Pointer */
 
extern INT32U USE_OSTimeTickHook;
 
/* ...........................................................................
 *
 * 태스크 함수 원형
 * ===================
 */
void  TaskStart(void *pdata); /* Function prototypes of Startup task */
void  spost(void *pdata);
void  Task2(void *pdata);          
void  Task3(void *pdata);
void  Task4(void *pdata);
 
//
// 어플리케이션 메인 루틴
//
int main(void)
{
    OSInit(); /* microC/OS-II 초기화 */
 
    strcpy(TaskUserData[TASK_START_ID].TaskName, "TaskStart");
    
    // TASK CREATE
    OSTaskCreateExt(TaskStart,
                   (void *)0,
                   &TaskStartStk[TASK_STK_SIZE-1],
                   TASK_START_PRIO,
                   TASK_START_ID,
                   &TaskStartStk[0],
                   TASK_STK_SIZE,
                   &TaskUserData[TASK_START_ID],
                   OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
 
    OSStart(); /* start scheduler */
 
    return 0;    
}
 
//
// 태스크 'START'
//
void  TaskStart (void *pdata)
{
    INT8U err;
    int sem_init;
    OS_SEM_DATA sem_val;    // semaphore control
    int loops;
 
    pdata = pdata;                /* 컴파일러 경고를 막기 위함 */
    
    USE_OSTimeTickHook = 0
    
    // 시스템 초기화(UART, LCD, TimeTick)
    InitSystem();    
 
    OSStatInit();                /* Initialize uC/OS-II's 통계 함수 */
 
    // 세마포어 초기값
    sem_init = 1; //초기값이 1이라서 . 을 찍고 시작한다.
 
    /* TODO #1: 
        create a binary semaphore
        use sem_id and sem_init */
#if 1
    sem_id=OSSemCreate(sem_init);
#endif // TODO #1
 
    // 세마포어 쿼리
    err = OSSemQuery(sem_id, &sem_val);
    if (err) printf("OSSemQuery error found, code[0x%X]\n",err);
 
    strcpy(TaskUserData[TASK_1_ID].TaskName, "spost");
 
    // TASK CREATE
    OSTaskCreateExt(spost,
                    (void *)0,
                    &Task1Stk[TASK_STK_SIZE - 1],
                    TASK_1_PRIO,
                    TASK_1_ID,
                    &Task1Stk[0],
                    TASK_STK_SIZE,
                    &TaskUserData[TASK_1_ID],
                    0);
    // loop counter
    loops = 10;
    for(;;) {
        // 세마포어 대기
        OSSemPend(sem_id, 0&err); //대기상태로 빠짐
        printf("."); fflush(stdout);
        err = OSSemQuery(sem_id, &sem_val);
        if (err) printf("OSSemQuery error found, code[0x%X]\n",err);
 
        if(loops == 0)
            break// exit
 
        loops--;
    }
 
    /* TODO #3: 
        delete a semaphore */
#if 0
  OSSemDel(sem_id, OS_DEL_ALWAYS, &err);
#endif // TODO #3
 
    /* delete self task */
    err = OSTaskDel(OS_PRIO_SELF);
    if (err) printf("OSTaskDel(OS_PRIO_SELF) error found, code[0x%X]\n",err);
}
 
//
// 태스크 'spost'
//
void spost(void *pdata)
{
    INT8U err;
    
    pdata = pdata;                /* 컴파일러 경고를 막기 위함 */
 
    printf("spost TASK created,\n");
 
    for(;;) {
    /* TODO #2: 
        post to a semaphore */
#if 1
        err = OSSemPost(sem_id);
#endif // TODO #2
        if (err) printf("OSSemPost error found, code[0x%X]\n",err);
        OSTimeDly(100); //1초마다 깨운다.
     }
}
 
/*-----------------------------------------------------------------------------
 * Program : 06_SEM.C
-----------------------------------------------------------------------------*/
 

cs




ROTS에서 세마포어를 쓸때 예외처리는 매우 중요하다.


■뮤텍스


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
/*******************************************************************************
**    File:
**
**        07_MUTEX.c
**
**  Contents:
**        uC/OS-II programming
**
**    History:
**        Date        Name              Description
**        ------------------------------------------------------------------------
**
*******************************************************************************/
#include "includes.h"
 
/* ...........................................................................
 *
 * 태스크 스택 정의
 * ===================
 */
 
int tickets;        // MAX value( 1000 million )
int backupTickets;
int T1_Ticket=0, T2_Ticket= 0;
 
OS_STK TaskStartStk[TASK_STK_SIZE]; /* START task stack */
OS_STK Task1Stk[TASK_STK_SIZE]; /* Task #1 stack */
OS_STK Task2Stk[TASK_STK_SIZE]; /* Task #2 stack */
//OS_STK Task3Stk[TASK_STK_SIZE]; /* Task #3 stack */
//OS_STK Task4Stk[TASK_STK_SIZE]; /* Task #4 stack */
 
/* ...........................................................................
 *
 * 사용자 메모리 정의
 * ===================
 */
TASK_USER_DATA  TaskUserData[7];
 
/* ...........................................................................
 *
 * 이벤트 컨트롤 & 사용자 정의 블럭 정의
 * ===================
 */
#define TICKET_1BILLION        1000000000
#define TICKET_1MILLION        1000000
#define TICKET_10000        10000
#define TICKET_1000            1000
 
OS_EVENT *mid;
 
extern void seedrand(int seed);
extern int randomnumber(void);
int buyTicket(void);
// 1초마다 콘솔에 동작중을 표시(.)
extern INT32U USE_OSTimeTickHook;
 
/* ...........................................................................
 *
 * 태스크 함수 원형
 * ===================
 */
void  TaskStart(void *pdata); /* Function prototypes of Startup task */
void  Task1(void *pdata);
void  Task2(void *pdata);        
void  Task3(void *pdata);
void  Task4(void *pdata);
 
//
// 어플리케이션 메인 루틴
//
int main(void)
{
    OSInit(); /* microC/OS-II 초기화 */
 
    PC_ElapsedInit(); /* Initialized elapsed time measurement     */
 
    strcpy(TaskUserData[TASK_START_ID].TaskName, "TaskStart");
    
    // TASK CREATE
    OSTaskCreateExt(TaskStart,
                   (void *)0,
                   &TaskStartStk[TASK_STK_SIZE-1],
                   TASK_START_PRIO,
                   TASK_START_ID,
                   &TaskStartStk[0],
                   TASK_STK_SIZE,
                   &TaskUserData[TASK_START_ID],
                   OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
 
    OSStart(); /* start scheduler */
 
    return 0;    
}
 
//
// 태스크 'START'
//
void  TaskStart (void *pdata)
{
    INT8U err;
    OS_MUTEX_DATA mutex_data;    // mutex control
    
    pdata = pdata;                /* 컴파일러 경고를 막기 위함 */
 
    // 시스템 초기화(UART, LCD, TimeTick)
    InitSystem();    
 
    OSStatInit();                /* Initialize uC/OS-II's 통계 함수 */
 
    // 1초마다 콘솔에 동작중을 표시(.)
    USE_OSTimeTickHook = 1// refer to 'OS_CPU_C.C'
 
    /* TODO #1: 
        create a mutex
        use mid and priority= 3*/
#if 1
    mid = OSMutexCreate(3,&err);
    if (err) printf("OSMutexQuery error found, code[0x%X]\n",err);
#endif // TODO #1
 
    // 뮤텍스 쿼리
    err = OSMutexQuery(mid, &mutex_data);
    if (err) printf("OSMutexQuery error found, code[0x%X]\n",err);
 
    //
    // set random seed
    //
    seedrand( 45 );
    
    // Set Tickets
    tickets= backupTickets = 10 * TICKET_1MILLION; // MAX value( 1 million )
 
    // TASK CREATE
    strcpy(TaskUserData[TASK_1_ID].TaskName, "Task1");
    OSTaskCreateExt(Task1,
                    (void *)0,
                    &Task1Stk[TASK_STK_SIZE - 1],
                    TASK_1_PRIO,
                    TASK_1_ID,
                    &Task1Stk[0],
                    TASK_STK_SIZE,
                    &TaskUserData[TASK_1_ID],
                    0);
    if (err) printf("OSTaskCreate error found, code[0x%X]\n",err);
 
    // TASK CREATE
    strcpy(TaskUserData[TASK_2_ID].TaskName, "Task2");
    OSTaskCreateExt(Task2,
                    (void *)0,
                    &Task2Stk[TASK_STK_SIZE - 1],
                    TASK_2_PRIO,
                    TASK_2_ID,
                    &Task2Stk[0],
                    TASK_STK_SIZE,
                    &TaskUserData[TASK_2_ID],
                    0);
    if (err) printf("OSTaskCreate error found, code[0x%X]\n",err);
 
    /* delete self task */
    err = OSTaskDel(OS_PRIO_SELF);
    if (err) printf("OSTaskDel(OS_PRIO_SELF) error found, code[0x%X]\n",err);
}
 
//
// 태스크 1
//
void Task1(void *pdata)
{
    INT8U err;
    OS_MUTEX_DATA mutex_data;    // mutex control
    
    pdata = pdata;                /* 컴파일러 경고를 막기 위함 */
 
    printf("\n\nTask1 TASK created,\n");
 
    while(1) {
        if(buyTicket() <= 0)
        {
            T1_Ticket++;
            printf("\n[TASK1]COUNTER up to %d\n", T1_Ticket);
            /* delete other task */
            err = OSTaskDel(TASK_2_PRIO);
            break;
        }
        T1_Ticket++;
        OSTimeDly(2);
    }
 
    printf("[TASK1]Total Tickets = %d\n", T1_Ticket + T2_Ticket);
 
    if(backupTickets != (T1_Ticket + T2_Ticket))
        printf("Not good. ticket size is different\n");
    else
        printf("Good!. matched\n");
 
    /* TODO #3: 태스크2 에도 같은게 또 있습니다. 작성하세요
        delete a mutex */
#if 0
 
#endif // TODO #3
 
    // 뮤텍스 쿼리
    err = OSMutexQuery(mid, &mutex_data);
    if (err) printf("OSMutexQuery error found, code[0x%X]\n",err);
 
 
    // 1초마다 콘솔 출력 '중지'
    USE_OSTimeTickHook = 0// refer to 'OS_CPU_C.C'
 
    /* delete self task */
    err = OSTaskDel(OS_PRIO_SELF);
    if (err) printf("OSTaskDel(OS_PRIO_SELF) error found, code[0x%X]\n",err);
}
 
//
// 태스크 2
//
void Task2(void *pdata)
{
    INT8U err;
    OS_MUTEX_DATA mutex_data;    // mutex control
    INT32U timeo;
    int i;
 
    pdata = pdata;                /* 컴파일러 경고를 막기 위함 */
 
    printf("Task2 TASK created,\n");
 
    while(1) {
        for(i=0;i<100000;i++)
        {
            if(buyTicket()==0)
            {
                T2_Ticket++;
                printf("\n[TASK2]COUNTER up to %d\n", T2_Ticket);
                /* delete other task */
                err = OSTaskDel(TASK_1_PRIO);
                goto exit;
            }
            T2_Ticket++;
        }
        timeo = randomnumber();
        OSTimeDly(timeo % 3);
    }
 
exit:
    printf("[TASK2]Total Tickets = %d\n", T1_Ticket + T2_Ticket);
 
    if(backupTickets != (T1_Ticket + T2_Ticket))
        printf("Not good. ticket size is different\n");
    else
        printf("Good!. matched\n");
 
    /* TODO #3: 태스크1 에도 같은게 또 있습니다. 작성하세요
        delete a mutex */
#if 0
 
#endif // TODO #3
 
    // 뮤텍스 쿼리
    err = OSMutexQuery(mid, &mutex_data);
    if (err) printf("OSMutexQuery error found, code[0x%X]\n",err);
 
    // 1초마다 콘솔 출력 '중지'
    USE_OSTimeTickHook = 0// refer to 'OS_CPU_C.C'
 
    /* delete self task */
    err = OSTaskDel(OS_PRIO_SELF);
    if (err) printf("OSTaskDel(OS_PRIO_SELF) error found, code[0x%X]\n",err);
}
 
//
// buyTicket
//
int buyTicket(void)
{
    OS_CPU_SR cpu_sr;
    INT8U err;
 
    /* TODO #2: 
        MUTEX 을 이용하여 
        공유변수(tickets)를 보호한다 */
#if 1
    // CRITICAL SECTION(ENTER)
    OSMutexPend(mid,0,&err);
#endif // TODO #2
 
    tickets --;    // ticket count
 
#if 1
    // CRITICAL SECTION(EXIT)
    OSMutexPost(mid);
#endif // TODO #2
 
    return(tickets);
}
 
/*-----------------------------------------------------------------------------
 * Program : 07_MUTEX.C
-----------------------------------------------------------------------------*/
 
cs




■이벤트 플래그

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
/*******************************************************************************
**    File:
**
**        08_FLAG.c
**
**  Contents:
**        uC/OS-II programming
**
**    History:
**        Date        Name              Description
**        ------------------------------------------------------------------------
**
*******************************************************************************/
#include "includes.h"
    
/* ...........................................................................
 *
 * 태스크 스택 정의
 * ===================
 */
OS_STK TaskStartStk[TASK_STK_SIZE]; /* START task stack */
OS_STK Task1Stk[TASK_STK_SIZE]; /* Task #1 stack */
//OS_STK Task2Stk[TASK_STK_SIZE]; /* Task #2 stack */
//OS_STK Task3Stk[TASK_STK_SIZE]; /* Task #3 stack */
//OS_STK Task4Stk[TASK_STK_SIZE]; /* Task #4 stack */
 
/* ...........................................................................
 *
 * 사용자 메모리 정의
 * ===================
 */
TASK_USER_DATA  TaskUserData[7];
 
/* ...........................................................................
 *
 * 이벤트 컨트롤 & 사용자 정의 블럭 정의
 * ===================
 */
#define ENGINE_OIL_PRES_OK 0x01 
#define ENGINE_OIL_TEMP_OK 0x02 
#define ENGINE_START 0x04 
 
OS_FLAG_GRP *group_id; 
 
/* ...........................................................................
 *
 * 태스크 함수 원형
 * ===================
 */
void  TaskStart(void *pdata); /* Function prototypes of Startup task */
void  Task1(void *pdata);
void  Task2(void *pdata);          
void  Task3(void *pdata);
void  Task4(void *pdata);
 
//
// 어플리케이션 메인 루틴
//
int main(void)
{
    OSInit(); /* microC/OS-II 초기화 */
 
    strcpy(TaskUserData[TASK_START_ID].TaskName, "TaskStart");
    
    // TASK CREATE
    OSTaskCreateExt(TaskStart,
                   (void *)0,
                   &TaskStartStk[TASK_STK_SIZE-1],
                   TASK_START_PRIO,
                   TASK_START_ID,
                   &TaskStartStk[0],
                   TASK_STK_SIZE,
                   &TaskUserData[TASK_START_ID],
                   OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
 
    OSStart(); /* start scheduler */
 
    return 0;    
}
 
//
// 태스크 'START'
//
void  TaskStart (void *pdata)
{
    INT8U err;
    OS_FLAGS flag_value;
    OS_FLAG_GRP *pgrp; // event flag group
    
    pdata = pdata;                /* 컴파일러 경고를 막기 위함 */
 
    // 시스템 초기화(UART, LCD, TimeTick)
    InitSystem();    
 
    OSStatInit();                /* Initialize uC/OS-II's 통계 함수 */
 
    /* TODO #1: 
        create a event flag
        use group_id and initial value= 0*/
#if 1
    group_id=OSFlagCreate(-1,&err);
    if (err) printf("OSFlagQuery error found, code[0x%X]\n",err);
#endif // TODO #1
 
    // 뮤텍스 쿼리
    flag_value = OSFlagQuery(group_id, &err);
    if (err) printf("OSFlagQuery error found, code[0x%X]\n",err);
 
    strcpy(TaskUserData[TASK_1_ID].TaskName, "task1");
 
    // TASK CREATE
    OSTaskCreateExt(Task1,
                    (void *)0,
                    &Task1Stk[TASK_STK_SIZE - 1],
                    TASK_1_PRIO,
                    TASK_1_ID,
                    &Task1Stk[0],
                    TASK_STK_SIZE,
                    &TaskUserData[TASK_1_ID],
                    0);
    if (err) printf("OSTaskCreateExt error found, code[0x%X]\n",err);
 
    for(;;) {
    /* TODO #2:
        get flag 'ENGINE_OIL_PRES_OK' OR 'ENGINE_OIL_TEMP_OK' from TASK2 */
#if 1
        OSFlagPend(group_id,ENGINE_OIL_PRES_OK + ENGINE_OIL_TEMP_OK, OS_FLAG_WAIT_SET_ANY + OS_FLAG_CONSUME,0,&err);
 
#endif // TODO #2
 
        printf("."); fflush(stdout);
    }
 
    // 이벤트 플래그 삭제
    pgrp = OSFlagDel(group_id, OS_DEL_ALWAYS, &err); 
    if (pgrp == (OS_FLAG_GRP *)0) { 
    /* The event flag group was deleted */ 
    } 
 
    /* delete self task */
    err = OSTaskDel(OS_PRIO_SELF);
    if (err) printf("OSTaskDel(OS_PRIO_SELF) error found, code[0x%X]\n",err);
}
 
//
// 태스크 1
//
void Task1(void *pdata)
{
    INT8U err;
      
    pdata = pdata;                /* 컴파일러 경고를 막기 위함 */
 
    printf("\n\nTask1 created,\n");
 
    for(;;) {
    /* TODO #2: 
        post flag 'ENGINE_OIL_PRES_OK' to TASK1 */
#if 1
        OSFlagPost(group_id,ENGINE_OIL_PRES_OK,OS_FLAG_SET,&err);
#endif // TODO #2
 
        OSTimeDly(100);
    }
}
 
/*-----------------------------------------------------------------------------
 * Program : 08_FLAG.C
-----------------------------------------------------------------------------*/
 
cs





■메시지큐

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
/*******************************************************************************
**    File:
**
**        10_QUE.c
**
**  Contents:
**        uC/OS-II programming
**
**    History:
**        Date        Name              Description
**        ------------------------------------------------------------------------
**
*******************************************************************************/
#include "includes.h"
    
/* ...........................................................................
 *
 * 태스크 스택 정의
 * ===================
 */
OS_STK TaskStartStk[TASK_STK_SIZE]; /* START task stack */
OS_STK Task1Stk[TASK_STK_SIZE]; /* Task #1 stack */
OS_STK Task2Stk[TASK_STK_SIZE]; /* Task #2 stack */
//OS_STK Task3Stk[TASK_STK_SIZE]; /* Task #3 stack */
//OS_STK Task4Stk[TASK_STK_SIZE]; /* Task #4 stack */
 
/* ...........................................................................
 *
 * 사용자 메모리 정의
 * ===================
 */
TASK_USER_DATA  TaskUserData[7];
 
/* ...........................................................................
 *
 * 이벤트 컨트롤 & 사용자 정의 블럭 정의
 * ===================
 */
OS_EVENT *qid;    /* Message Queue Pointer */
void *qBuffer[10];
 
extern INT32U USE_OSTimeTickHook;
 
/* ...........................................................................
 *
 * 태스크 함수 원형
 * ===================
 */
void  TaskStart(void *pdata); /* Function prototypes of Startup task */
void  qpend(void *pdata);
void  qpost(void *pdata);          
void  Task3(void *pdata);
void  Task4(void *pdata);
 
//
// 어플리케이션 메인 루틴
//
int main(void)
{
    OSInit(); /* microC/OS-II 초기화 */
 
    strcpy(TaskUserData[TASK_START_ID].TaskName, "TaskStart");
    
    // TASK CREATE
    OSTaskCreateExt(TaskStart,
                   (void *)0,
                   &TaskStartStk[TASK_STK_SIZE-1],
                   TASK_START_PRIO,
                   TASK_START_ID,
                   &TaskStartStk[0],
                   TASK_STK_SIZE,
                   &TaskUserData[TASK_START_ID],
                   OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
 
    OSStart(); /* start scheduler */
 
    return 0;    
}
 
//
// 태스크 'START'
//
void  TaskStart (void *pdata)
{
    void qpend(void *pdata), qpost(void *pdata);
//    long timeout= 200L;            /* Wait Forever */
    INT8U err;
    char *msg;
    OS_Q_DATA qdata;
    
    pdata = pdata;                /* 컴파일러 경고를 막기 위함 */
 
    USE_OSTimeTickHook = 0;
    
    // 시스템 초기화(UART, LCD, TimeTick)
    InitSystem();    
 
    OSStatInit();                /* Initialize uC/OS-II's 통계 함수 */
 
    /* TODO #1: 
        create a Queue
        use qid and qBuffer[] */
#if 1
    qid = OSQCreate(qBuffer,10);
#endif // TODO #1
 
    // 큐(QUEUE) 쿼리 
    err = OSQQuery(qid, &qdata);
    if (err) printf("OSQQuery error found, code[0x%X]\n",err);
 
    strcpy(TaskUserData[TASK_1_ID].TaskName, "qpend");
 
    // TASK CREATE
    OSTaskCreateExt(qpend,
                    (void *)0,
                    &Task1Stk[TASK_STK_SIZE - 1],
                    TASK_1_PRIO,
                    TASK_1_ID,
                    &Task1Stk[0],
                    TASK_STK_SIZE,
                    &TaskUserData[TASK_1_ID],
                    0);
 
    strcpy(TaskUserData[TASK_2_ID].TaskName, "qpost");
 
    // TASK CREATE
    OSTaskCreateExt(qpost,
                    (void *)0,
                    &Task2Stk[TASK_STK_SIZE - 1],
                    TASK_2_PRIO,
                    TASK_2_ID,
                    &Task2Stk[0],
                    TASK_STK_SIZE,
                    &TaskUserData[TASK_2_ID],
                    0);
 
    OSTimeDly(500);
 
    /* TODO #2: 
        broadcast a message to all TASKs
        message : "Do you hear me?[john said]" */
#if 1
    OSQPostOpt(qid,"Do you hear me?[john said]",OS_POST_OPT_BROADCAST);
#endif // TODO #2
 
    printf("\n.\n.\n.\n.\non AIR...\n.\n.\n.\n.\n");
 
    /* delete self task */
    err = OSTaskDel(OS_PRIO_SELF);
    if (err) printf("OSTaskDel(OS_PRIO_SELF) error found, code[0x%X]\n",err);
}
 
//
// 태스크 'qpend'
//
void qpend(void *pdata)
{
    INT8U err;
    char *p;
    long timeout= 200L;            /* for ever */
    
    pdata = pdata;                /* 컴파일러 경고를 막기 위함 */
 
    printf("[qpend]waiting...\n");
 
    // 메시지 큐 '브로드캐스트' 대기
    p = OSQPend(qid, 0&err); /* Wake up By Queue Broadcast */
    if (err) printf("OSQPend error found, code[%d]\n",err);
    printf("[qpend]sync %s\n",p);
 
    for(;;) {
        // 메시지 큐 대기
        p = OSQPend(qid, timeout, &err);
        if (err)
            printf("OSQPend error found, code[0x%X]\n",err);
        else
            printf("get message \"%d\" from TASK qpost\n",*p);
    }
}
 
//
// 태스크 'qpost'
//
void qpost(void *pdata)
{
    INT8U err;
    char *p;
    char msg[80];
    int i;
 
    pdata = pdata;                /* 컴파일러 경고를 막기 위함 */
 
    printf("[qpost]waiting...\n");
 
    // 메시지 큐 '브로드캐스트' 대기
    p = OSQPend(qid, 0&err); /* Wake up By Queue Broadcast */
    if (err) printf("OSQPend error found, code[%d]\n",err);
    printf("[qpost]sync %s\n",p);
 
    for(i=1; i< 10000; i++) {
        msg[0= i; msg[1]= NULL;
 
    /* TODO #3: 
        post a message to TASK qpend
        use msg[] */
#if 1
        OSQPost(qid,msg);
#endif // TODO #3
 
        OSTimeDly(100);
    }
}
 
/*-----------------------------------------------------------------------------
 * Program : 10_QUE.C
-----------------------------------------------------------------------------*/
 
cs





'RTOS' 카테고리의 다른 글

[RTOS_Day5]RTOS 포팅 진행 기록_2  (0) 2018.12.27
[RTOS_Day4]RTOS 포팅 진행 기록  (0) 2018.12.26
[RTOS_Day3]통계 테스크  (0) 2018.12.19
[RTOS_Day2]임계영역 보호  (0) 2018.12.18
[RTOS_Day2]시간관리 함수  (2) 2018.12.18

+ Recent posts