■통계 테스크



*makefile 옵션 수정




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
#include "../../include/includes.h"
//#include "ui.h"
 
// filename
char* filename = "04_STAT";
 
#define          MSG_QUEUE_SIZE     20                /* Size of message queue used in example         */
 
/* ...........................................................................
 *
 * 태스크 스택 정의
 * ===================
 */
OS_STK           TaskStartStk[TASK_STK_SIZE];         /* Startup    task stack                         */
OS_STK           Task1Stk[TASK_STK_SIZE];             /* Task #1    task stack                         */
OS_STK           Task2Stk[TASK_STK_SIZE];             /* Task #2    task stack                         */
OS_STK           Task3Stk[TASK_STK_SIZE];             /* Task #3    task stack                         */
OS_STK           Task4Stk[TASK_STK_SIZE];             /* Task #4    task stack                         */
OS_STK           Task5Stk[TASK_STK_SIZE];             /* Task #5    task stack                         */
 
/* ...........................................................................
 *
 * 사용자 메모리 정의
 * ===================
 */
TASK_USER_DATA  TaskUserData[7];
 
/* ...........................................................................
 *
 * 이벤트 컨트롤 & 사용자 정의 블럭 정의
 * ===================
 */
OS_EVENT        *MsgQueue;                            /* Message queue pointer                         */
void            *MsgQueueTbl[20];                     /* Storage for messages                          */
// 1초마다 콘솔에 동작중을 표시(.)
extern INT32U USE_OSTimeTickHook;
 
/* ...........................................................................
 *
 * 태스크 함수 원형
 * ===================
 */
void             TaskStart(void *data);               /* Function prototypes of tasks                  */
void             TaskStartCreateTasks(void);
void             TaskClk(void *data);
void             Task1(void *data);
void             Task2(void *data);
void             Task3(void *data);
void             Task4(void *data);
void             Task5(void *data);
 
//
// 어플리케이션 메인 루틴
//
int main (void)
{
    OSInit(); /* microC/OS-II 초기화 */
 
    PC_ElapsedInit(); /* Initialized elapsed time measurement     */
 
    strcpy(TaskUserData[TASK_START_ID].TaskName, "Start");
    OSTaskCreateExt(TaskStart,
                    (void *)0,
                    &TaskStartStk[TASK_STK_SIZE - 1],
                    TASK_START_PRIO,
                    TASK_START_ID,
                    &TaskStartStk[0],
                    TASK_STK_SIZE,
                    &TaskUserData[TASK_START_ID],
                    0);
    OSStart();    //우선순위 0번                                  /* Start multitasking                       */
}
 
//
// 태스크 'START'
//
void  TaskStart (void *data)
{
    INT8U err;
 
    data = data;                                           /* Prevent compiler warning                 */
 
    // 시스템 초기화(UART, LCD, TimeTick)
    InitSystem();    
 
    // Task Statistics Title Display
    TaskStatisticsTitleDisplay(filename);
 
    OSStatInit();
 
    // 1초마다 콘솔에 동작중을 표시(.)
    USE_OSTimeTickHook = 1// refer to 'OS_CPU_C.C'
 
    MsgQueue = OSQCreate(&MsgQueueTbl[0], MSG_QUEUE_SIZE); /* Create a message queue                   */
 
    TaskStartCreateTasks();
 
    /* delete self task */
    err = OSTaskDel(OS_PRIO_SELF);
    if (err) printf("OSTaskDel(OS_PRIO_SELF) error found, code[0x%X]\n",err);
}
 
//
// 태스크 'TaskStartCreateTasks'
//
void  TaskStartCreateTasks (void)
{
    strcpy(TaskUserData[TASK_1_ID].TaskName, "MsgQ Tx");
    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);
 
    strcpy(TaskUserData[TASK_2_ID].TaskName, "MsgQ Rx#1");
    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);
 
    strcpy(TaskUserData[TASK_3_ID].TaskName, "MsgQ Rx#2");
    OSTaskCreateExt(Task3,
                    (void *)0,
                    &Task3Stk[TASK_STK_SIZE - 1],
                    TASK_3_PRIO,
                    TASK_3_ID,
                    &Task3Stk[0],
                    TASK_STK_SIZE,
                    &TaskUserData[TASK_3_ID],
                    0);
 
    strcpy(TaskUserData[TASK_4_ID].TaskName, "MboxPostPend");
    OSTaskCreateExt(Task4,
                    (void *)0,
                    &Task4Stk[TASK_STK_SIZE - 1],
                    TASK_4_PRIO,
                    TASK_4_ID,
                    &Task4Stk[0],
                    TASK_STK_SIZE,
                    &TaskUserData[TASK_4_ID],
                    0);
 
    strcpy(TaskUserData[TASK_5_ID].TaskName, "TimeDly");
    OSTaskCreateExt(Task5,
                    (void *)0,
                    &Task5Stk[TASK_STK_SIZE - 1],
                    TASK_5_PRIO,
                    TASK_5_ID,
                    &Task5Stk[0],
                    TASK_STK_SIZE,
                    &TaskUserData[TASK_5_ID],
                    0);
}
 
//
// 태스크 'Task1'
//
void  Task1 (void *data)
{
    char one   = '1';
    char two   = '2';
    char three = '3';
 
    data = data;
    for (;;) {
        OSQPost(MsgQueue, (void *)&one);
        OSTimeDlyHMSM(001,   0);        /* Delay for 1 second                                      */
        OSQPost(MsgQueue, (void *)&two);
        OSTimeDlyHMSM(000500);        /* Delay for 500 mS                                        */
        OSQPost(MsgQueue, (void *)&three);
        OSTimeDlyHMSM(001,   0);        /* Delay for 1 second                                      */
    }
}
 
//
// 태스크 'Task2'
// Description: This task waits for messages sent by task #1.
//
void  Task2 (void *data)
{
    char *msg;
    INT8U  err;
 
    data = data;
    for (;;) {
        msg = (char *)OSQPend(MsgQueue, 0&err);    /* Wait forever for message                      */
        PC_DispChar(149*msg, (INT8U)YELLOW);
        OSTimeDlyHMSM(000500);                  /* Delay for 500 mS                              */
    }
}
 
//
// 태스크 'Task3'
// Description: This task waits for up to 250 mS for a message sent by task #1.
//
void  Task3 (void *data)
{
    INT8U *msg;
    INT8U  err;
 
    data = data;
    for (;;) {
        msg = (INT8U *)OSQPend(MsgQueue, OS_TICKS_PER_SEC / 4&err);  /* Wait up to 250 mS for a msg  */
        if (err == OS_TIMEOUT) {
            PC_DispChar(149'T',  BLUE);
        } else {
            PC_DispChar(149*msg, BLUE);
        }
    }
}
 
//
// 태스크 'Task4'
// Description: This task posts a message to a mailbox and then immediately reads the message.
//
void  Task4 (void *data)
{
    OS_EVENT *mbox;
    INT8U     err;
 
    data = data;
    mbox = OSMboxCreate((void *)0);
    for (;;) {
        OSMboxPost(mbox, (void *)1);             /* Send message to mailbox                            */
        OSMboxPend(mbox, 0&err);               /* Get message from mailbox                           */
        OSTimeDlyHMSM(00010);              /* Delay 10 mS                                        */
    }
}
 
//
// 태스크 'Task5'
// Description: This task simply delays itself.  We basically want to determine how long OSTimeDly() takes
//              to execute
//
void  Task5 (void *data)
{
    data = data;
    for (;;) {
        OSTimeDly(1);
    }
}
 
/*-----------------------------------------------------------------------------
 * Program : 04_STAT.C
-----------------------------------------------------------------------------*/
 
cs




*IDLE 테스크 관련 함수


특징 : 1. 우선순위가 가장 낮다.    =>63

2. 삭제 절대로 되지 않는다.

3. 우선순위 변경 불가능.

4. 하는 일이 없다.    =>void  OS_TaskIdle (void *p_arg)

5. 절대로 휴면 하지 않는다.

즉, 이러한 특징을 이용하여 어떠한 task가 실행되고 있는지 Idle task를 확인하여 측정할 수 있습니다.

밑 소스를 보면 Led를 통해서 어떠한 task가 수행되면 계속해서 빠르게 실행되어 Led의 불이 계속 들어오는 것을 알 수 있고 끝나면 깜빡거리는 것을 알 수 있습니다.


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
void  OS_TaskIdle (void *p_arg)
{
#if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
    OS_CPU_SR  cpu_sr = 0;
#endif
 
 
 
    (void)p_arg;                                 /* Prevent compiler warning for not using 'parg'      */
    for (;;) {
        OS_ENTER_CRITICAL();
        OSIdleCtr++;
        OS_EXIT_CRITICAL();
        OSTaskIdleHook();                        /* Call user definable HOOK                           */
    }
}
 
 
#if OS_CPU_HOOKS_EN > 0 && OS_VERSION >= 251
void  OSTaskIdleHook (void)
{
        Led_Display(0);  
//        CPU goes to sleep(LOW POWER)// wjwjsfurahemeh rksmd
}
#endif
 
 
 
 
 
#if (OS_CPU_HOOKS_EN > 0&& (OS_TASK_SW_HOOK_EN > 0)
void  OSTaskSwHook (void)
{
    INT16U          time;
    TASK_USER_DATA *puser;
 
    Led_Display(15);
 
    time  = PC_ElapsedStop();                    /* This task is done                                  */
    PC_ElapsedStart();                           /* Start for next task                                */
 
    /* TODO #1: 
        EXAMPLE "04_STAT.C" 실습 예제
        태스크 사용자 자료 구조(TASK_USER_DATA) 업데이트
        use 'OSTCBCur' : 5 line */
#if 1
    puser = OSTCBCur->OSTCBExtPtr;               /* Point to used data                                 */
    if (puser != (void *)0) {
        puser->TaskID = OSTCBCur->OSTCBId;         /* Task ID */
        puser->TaskCtr++;                        /* Increment task counter                             */
        puser->TaskExecTime     = time;          /* Update the task's execution time                   */
        puser->TaskTotExecTime += time;          /* Update the task's total execution time             */
    }
#endif // TODO #1
}
#endif
cs


'RTOS' 카테고리의 다른 글

[RTOS_Day5]RTOS 포팅 진행 기록_2  (0) 2018.12.27
[RTOS_Day4]RTOS 포팅 진행 기록  (0) 2018.12.26
[RTOS_Day2]임계영역 보호  (0) 2018.12.18
[RTOS_Day2]시간관리 함수  (2) 2018.12.18
[RTOS_Day1]테스크 생성 및 운용  (0) 2018.12.17

+ Recent posts