uC/OS-II中的任务创建

任务说明

本次试验拟定安排在第二章讲解进程控制之后进行,需要了解µC/OS-II的任务控制块结构及作用,任务堆栈的定义及作用,以及使用µC/OS-II提供的系统调用来创建任务。

要求

根据示例程序编写创建具有两个不同优先级别任务的程序,两个任务分别是MyTask和YouTask。MyTask优先级为1,每隔3秒钟打印一次学号;YouTask优先级为2,每隔1秒打印一次姓名全拼。示例如下:

代码

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
#include "includes.h"
#define TASK_STK_SIZE 512 //任务堆栈长度
OS_STK MyTaskStk[TASK_STK_SIZE]; //定义任务堆栈区
OS_STK YouTaskStk[TASK_STK_SIZE];
INT16S key; //用于退出µC/OS-II_II的键
INT8U x=0,y=0; //字符显示位置
void MyTask(void * data);
void YouTask(void * data);
void main (void)
{
char* s_M="你的学号"; //定义要显示的字符
char* s_N="你的姓名";
OSInit(); //初始化µC/OS-II_II
PC_DOSSaveReturn(); //保存Dos环境
PC_VectSet(uCOS, OSCtxSw); //安装µC/OS-II_II中断
OSTaskCreate(MyTask, //创建任务MyTask
s_M, //给任务传递参数
&MyTaskStk[TASK_STK_SIZE - 1],//设置任务堆栈栈顶指针
1); //使任务MyTask的优先级别为1
OSTaskCreate(YouTask, //创建任务YouTask
s_N, //给任务传递参数
&YouTaskStk[TASK_STK_SIZE - 1],//设置任务堆栈栈顶指针
2); //使任务YouTask的优先级别为2
OSStart(); //启动µC/OS-II_II的多任务管理
}
void MyTask (void *pdata)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
pdata = pdata;
OS_ENTER_CRITICAL();
PC_VectSet(0x08, OSTickISR); //安装µC/OS-II_II时钟中断向量
PC_SetTickRate(OS_TICKS_PER_SEC); //设置µC/OS-II_II时钟频率
OS_EXIT_CRITICAL();
OSStatInit(); //初始化µC/OS-II_II的统计任务
for (;;)
{
y += 1;
PC_DispStr(x,y,pdata,DISP_BGND_BLACK+DISP_FGND_YELLOW); // 设置颜色
//如果按下Esc键则退出µC/OS-II_II
if (PC_GetKey(&key) == TRUE) {
/* See if key has been pressed */
if (key == 0x1B) { /* Yes, see if it's the ESCAPE key */
PC_DOSReturn(); /* Return to DOS*/
}
}
OSTimeDlyHMSM(0, 0, 3, 0); //等待3s
}
}

void YouTask (void *pdata)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
pdata = pdata;
OS_ENTER_CRITICAL();
PC_VectSet(0x08, OSTickISR); //安装µC/OS-II_II时钟中断向量
PC_SetTickRate(OS_TICKS_PER_SEC); //设置µC/OS-II_II时钟频率
OS_EXIT_CRITICAL();
OSStatInit(); //初始化µC/OS-II_II的统计任务
for (;;)
{
// if (x>50)
// { x=0;
// y+=2;
// }
y += 1;
PC_DispStr(x,y,pdata,DISP_BGND_BLACK+DISP_FGND_GREEN); //设置颜色
//如果按下Esc键则退出µC/OS-II_II
if (PC_GetKey(&key) == TRUE) {
/* See if key has been pressed */
if (key == 0x1B) { /* Yes, see if it's the ESCAPE key */
PC_DOSReturn(); /* Return to DOS*/
}
}
OSTimeDlyHMSM(0, 0, 1, 0); //等待1s
}
}

这东西vsc里还一直给报错,只能揣测着给模板的人的内心写,看了20多分钟(笑

看起来写的没问题