-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathtask exercise.c
152 lines (130 loc) · 3.22 KB
/
task exercise.c
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
/*任务分为运行结束任务和无线循环任务
/*void Run_to_end_Task(void)
{
Step 1: Initialize application
Step 2: Create endless loop tasks
Step 3: Create kernel objects
Step 4: Delete or suspend this task
}
我们一般使用return来使函数返回就可以删除调用的任务,一遍其他任务能够得到cpu */
/*void ContinuousLoopTask(void)
{
Initialization code
Loop Forever
{
main loop
make one or more blocking calls
}
}
在循环代码中,至少需要一处代码可以使任务暂时放弃CPU,只有这样才有可能使低优先级的任务能够得到CPU,
然后开始执行,信号量的使用就是完成这个功能 */
/* 多任务应用例程
该任务穿件两个任务模拟一个数据同步收集系统,
Send Task 每两秒释放一次信号量dataSemId,用来模拟收到数据,
Receive Task 接受信号量datdaSemId,然后做相应的处理。 */
/* 头文件 */
#include "vxworks.h"
#include "stdio.h"
#include "stdlib.h"
#include "taskLib.h"
#include "sysLib.h"
/* 宏定义 */
#define STACK_SIZE 2000 /* 任务堆栈大小为2000bytes */
/* 全局变量 */
SEM_ID dataSemId; /* 同步信号量 */
int tidSend; /* Send Task任务id */
int tidReceive; /* Receive Task任务id */
/* 函数声明 */
void progStart(void);
void taskSend(void);
void raskReceive(void);
void SendInit(void);
void ReceiveInit(void);
void progStop(void);
/**********************************************************************************************
* progStart - start 程序
* 负责创建Send Task和Recieve Task,并开始运行
* RETURNS: N/A
*/
void progStart(void)
{
/* 创建信号量 */
dataSemId = semBCreate(SEM_QFIFO, SEM_EMPTY);
/* 创建任务*/
tidSend = taskSpawn ("tSend", 200, 0 ,STACK_SIZE,
(FUNCPTER)taskSend,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
tidReceive = taskSpawn ("tReceive", 220, 0 ,STACK_SIZE,
(FUNCPTER)taskReceive,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
return;
}
/**********************************************************************************
* taskSend - 发送数据任务
* 每两秒钟释放一次信号量dataSemId,用来模拟收到的数据
*/
void taskSend(void)
{
/* Send Task的初始化 */
SendInit();
/* 主循环 */
while(1)
{
/* 任务延时两秒 */
taskDelay(sysClkRateGet() * 2);
/* 释放信号量用来表示收到数据 */
semGive(dataSemId);
}
return;
}
/**********************************************************************************
* taskReceive - 接受数据任务
* 等待信号量 dataSemId,用来判断是否收到数据
*/
void taskReceive(void)
{
/* Receive Task的初始化 */
ReceiveInit();
/* 主循环 */
while(1)
{
/* 等待信号量(收数据) */
semTake(dataSemId, WAIT_FOREVER);
printf("\nReceive a data");
}
return;
}
/************************************************************************************
* SendInit - 初始化 Send Task
* 初始化Send Task
*/
void SendInit(void)
{
/* 初始化代码 */
printf("\nInitial Send Task");
return;
}
/************************************************************************************
* ReceiveInit - 初始化 Receive Task
* 初始化Receive Task
*/
void ReceiveInit(void)
{
/* 初始化代码 */
printf("\nInitial Receive Task");
return;
}
/************************************************************************************
* progStop - 终止程序运行
* 删除信号量,删除所有任务,终止程序运行。
*/
void progStop(void)
{
/* 删除信号量 */
semDelete(dataSemId);
/* 删除所有信号量 */
taskDelete(tidSend);
taskDelete(tidReceive);
printf("The End\n");
return;
}