搜索
您的当前位置:首页正文

实验参考代码

来源:二三娱乐
实验1多任务

/****************************************Copyright (c)**************************************************

作者:杨洪建 时间:2015.1.11 版本:1.0

修改:2015.1.11

描述:多任务实验,创建task1,task2,task2运行20次后挂起task1();task2运行40次后恢复task1();

task1();恢复后删除task2。

********************************************************************************************************/ #include \"config.h\" #include \"stdlib.h\" #include \"uart.h\"

#define TaskStkLengh 128 长度

INT8U err;

//Define the Task0 stack length 定义用户任务0的堆栈

OS_STK Task1Stk [TaskStkLengh]; //Task1 的堆栈 OS_STK Task2Stk [TaskStkLengh];

void Task1(void *pdata); //Task1 void Task2(void *pdata); //Task2

int main (void) { TargetInit (); //初始化CPU和硬件电路 OSInit (); Uart0_Pin_Set(); UARTInit(); OSTaskCreate (Task1,(void *)0, &Task1Stk[TaskStkLengh - 1], 3); OSTaskCreate (Task2,(void *)0, &Task2Stk[TaskStkLengh - 1], 2); OSStart (); return 0; }

void Task1 (void *pdata) {

pdata=pdata; while(1) {

UART0SendStr(\"task1在运行\\n\");

OSTaskDelReq(2); OSTimeDly(100); } }

void Task2 (void *pdata) {

INT8U i = 0; pdata=pdata; while(1) {

UART0SendStr(\"task2在运行\\n\"); if(i==5) { OSTaskSuspend(3); } if(i == 10) { OSTaskResume(3); if(OSTaskDelReq(OS_PRIO_SELF) == OS_TASK_DEL_REQ) { OSTaskDel(OS_PRIO_SELF); } } i++; OSTimeDly(100); } }

/*********************************************************************************************************

** End Of File

********************************************************************************************************/

实验2调度

/****************************************Copyright (c)************************************************** 作者:杨洪建 时间:2015.1.11 版本:1.0

修改:2015.1.11

描述:调度试验,创建task1,priority = 1,发送M每秒 创建task2,priority = 2,发送Y每两秒 创建task3,priority = 3,换行每200个节拍。

********************************************************************************************************/ #include \"config.h\" #include \"stdlib.h\" #include \"uart.h\"

#define TaskStkLengh 128 长度

INT8U err;

//Define the Task0 stack length 定义用户任务0的堆栈

OS_STK Task1Stk [TaskStkLengh]; //Task1 的堆栈 OS_STK Task2Stk [TaskStkLengh]; OS_STK Task3Stk [TaskStkLengh];

void Task1(void *pdata); //Task1 void Task2(void *pdata); //Task2 void Task3(void *pdata); //Task3 int main (void) { TargetInit (); //初始化CPU和硬件电路 OSInit (); Uart0_Pin_Set(); UARTInit(); OSTaskCreate (Task1,(void *)0, &Task1Stk[TaskStkLengh - 1], 1); OSTaskCreate (Task2,(void *)0, &Task2Stk[TaskStkLengh - 1], 2); OSTaskCreate (Task3,(void *)0, &Task3Stk[TaskStkLengh - 1], 3); OSStart (); return 0; }

void Task1 (void *pdata) {

pdata=pdata; while(1) {

UART0SendStr(\"M\\n\"); OSTimeDlyHMSM(0,0,1,0); } }

void Task2 (void *pdata) {

pdata=pdata;

while(1) {

UART0SendStr(\"Y\\n\"); OSTimeDlyHMSM(0,0,2,0); } }

void Task3 (void *pdata) {

pdata=pdata; while(1) {

UART0SendStr(\".\\n\"); OSTimeDly(200); } }

/*********************************************************************************************************

** End Of File

********************************************************************************************************/

实验3时间管理

/****************************************Copyright (c)**************************************************

作者:杨洪建 时间:2015.1.11 版本:1.0

修改:2015.1.11

描述:时间管理实验,创建task1,延时1S 创建task2,延时200个节拍

********************************************************************************************************/ #include \"config.h\" #include \"stdlib.h\" #include \"uart.h\"

#define TaskStkLengh 128 //Define the Task0 stack length 定义用户任务0的堆栈长度

INT8U err;

OS_STK Task1Stk [TaskStkLengh]; //Task1 的堆栈 OS_STK Task2Stk [TaskStkLengh];

void Task1(void *pdata); //Task1 void Task2(void *pdata); //Task2

int main (void) { TargetInit (); //初始化CPU和硬件电路 OSInit (); Uart0_Pin_Set(); UARTInit(); OSTaskCreate (Task1,(void *)0, &Task1Stk[TaskStkLengh - 1], 1); OSTaskCreate (Task2,(void *)0, &Task2Stk[TaskStkLengh - 1], 2); OSStart (); return 0; }

void Task1 (void *pdata) {

pdata=pdata; while(1) {

UART0SendStr(\"task1在运行\\n\"); OSTimeDlyHMSM(0,0,1,0); } }

void Task2 (void *pdata) {

pdata=pdata; while(1) { UART0SendStr(\"task2在运行\\n\"); OSTimeDly(20); } }

/*********************************************************************************************************

** End Of File

********************************************************************************************************/

实验4信号量

/****************************************Copyright (c)**************************************************

作者:杨洪建 时间:2015.1.11 版本:2.0

修改:2015.1.11、2015.1.12、2015/1/13 描述:哲学家进餐问题

********************************************************************************************************/ #include \"config.h\" #include \"stdlib.h\" #include \"uart.h\"

#define TaskStkLengh 64 //Define the Task0 stack length 定义用户任务0的堆栈长度

INT8U err;

OS_EVENT *sem1; OS_EVENT *sem2; OS_EVENT *sem3; OS_EVENT *sem4; OS_EVENT *sem5;

OS_STK Task1Stk [TaskStkLengh]; //Task1 的堆栈 OS_STK Task2Stk [TaskStkLengh]; OS_STK Task3Stk [TaskStkLengh]; OS_STK Task4Stk [TaskStkLengh]; OS_STK Task5Stk [TaskStkLengh];

void Task1(void *pdata); //Task1 void Task2(void *pdata); //Task2 void Task3(void *pdata); void Task4(void *pdata); void Task5(void *pdata); void Fun(int i);

int main (void) { TargetInit (); //初始化CPU和硬件电路

OSInit (); Uart0_Pin_Set(); UARTInit(); sem1 = OSSemCreate(1); sem2 = OSSemCreate(1); sem3 = OSSemCreate(1); sem4 = OSSemCreate(1); sem5 = OSSemCreate(1); OSTaskCreate (Task1,(void *)0, &Task1Stk[TaskStkLengh - 1], 1); OSTaskCreate (Task2,(void *)0, &Task2Stk[TaskStkLengh - 1], 2); OSTaskCreate (Task3,(void *)0, &Task3Stk[TaskStkLengh - 1], 3); OSTaskCreate (Task4,(void *)0, &Task4Stk[TaskStkLengh - 1], 4); OSTaskCreate (Task5,(void *)0, &Task5Stk[TaskStkLengh - 1], 5); OSStart (); return 0; }

void Task1 (void *pdata) {

pdata=pdata; while(1) { OSSemPend(sem5,0,&err); OSSemPend(sem1,0,&err); Fun(1); OSTimeDly(100); OSSemPost(sem5); OSSemPost(sem1); } }

void Task2 (void *pdata) {

pdata=pdata; while(1) { OSSemPend(sem1,0,&err); OSSemPend(sem2,0,&err);

Fun(2);

OSTimeDly(100); OSSemPost(sem1); OSSemPost(sem2); } }

void Task3 (void *pdata) {

pdata=pdata; while(1) { OSSemPend(sem2,0,&err); OSSemPend(sem3,0,&err); Fun(3);

OSTimeDly(100); OSSemPost(sem2); OSSemPost(sem3); } }

void Task4 (void *pdata) {

pdata=pdata; while(1) { OSSemPend(sem3,0,&err); OSSemPend(sem4,0,&err); Fun(4); OSTimeDly(100);

OSSemPost(sem3); OSSemPost(sem4); } }

void Task5 (void *pdata) {

pdata=pdata; while(1) { OSSemPend(sem4,0,&err); OSSemPend(sem5,0,&err); Fun(5); OSTimeDly(100); OSSemPost(sem4); OSSemPost(sem5); } }

void Fun(int i) { switch(i) { case 1 : UART0SendStr(\"哲学家1正在吃饭\\n\");break; case 2 : UART0SendStr(\"哲学家2正在吃饭\\n\");break; case 3 : UART0SendStr(\"哲学家3正在吃饭\\n\");break; case 4 : UART0SendStr(\"哲学家4正在吃饭\\n\");break; case 5 : UART0SendStr(\"哲学家5正在吃饭\\n\");break; default :break; } }

/*********************************************************************************************************

** End Of File

********************************************************************************************************/

实验5消息邮箱

/****************************************Copyright (c)**************************************************

作者:杨洪建 时间:2015.1.12 版本:1.0

修改:2015.1.12 描述:消息邮箱实验

存在问题:UART0SendStr不能正常显示字符串

********************************************************************************************************/ #include \"config.h\" #include \"stdlib.h\" #include \"uart.h\"

#define TASK_STK_SIZE 64 //Define the Task0 stack length 定义用户任务0的堆栈长度

INT8U err;

OS_STK MyTaskStk[TASK_STK_SIZE]; OS_STK YouTaskStk[TASK_STK_SIZE];

char *s = \"0\"; char *ss = \"0\";

OS_EVENT *Str_Box; //定义事件控制块指针

INT32U Times=0;

void MyTask(void *pdata); void YouTask(void *pdata);

int main (void) { TargetInit (); //初始化CPU和硬件电路 OSInit (); Uart0_Pin_Set(); UARTInit();

OSTaskCreate(MyTask,(void*)0,&MyTaskStk [TASK_STK_SIZE - 1], 3); OSTaskCreate(YouTask,(void*)0,&YouTaskStk[TASK_STK_SIZE - 1], 4);

OSStart(); return 0; }

void MyTask(void *pdata) { OSStatInit(); pdata = pdata; Str_Box=OSMboxCreate((void*)NULL); //创建邮箱 while(1) {

sprintf(s,\"%d\//将Times直接打印到字符串s中。 // UART0SendStr(s);

OSMboxPost(Str_Box,s); //发送消息 Times++; OSTimeDlyHMSM(0,0,1,0); } }

void YouTask(void *pdata) { pdata=pdata; while(1) { ss=OSMboxPend(Str_Box,1,&err); //接收消息 UART0SendStr(\"YouTask接收到MyTask传来的运行次数\\n运行次数为:\"); UART0SendStr(ss); UART0SendStr(\"\\n\"); OSTimeDlyHMSM(0,0,1,0);

} }

/*********************************************************************************************************

** End Of File

********************************************************************************************************/

实验6消息队列

/****************************************Copyright

(c)**************************************************

作者:杨洪建 时间:2015.1.12 版本:3.0

修改:2015.1.12 描述:消息队列

********************************************************************************************************/ #include \"config.h\" #include \"stdlib.h\" #include \"uart.h\"

#define TaskStkLengh 128 //Define the Task0 stack length #define N_MESSAGES 64 //define the massage length INT8U err; char *ss;

char *s100 = \"现在OSTime的值在100到500之间\\n\"; char *s;

char *s500 = \"现在OSTime的值在500到1000之间\\n\";

void *MsgGrp[N_MESSAGES]; //定义消息指针数组 OS_EVENT *Str_Q; //定义事件控制块

OS_STK StartTaskStk [TaskStkLengh]; OS_STK MyTaskStk [TaskStkLengh]; OS_STK YouTaskStk [TaskStkLengh];

void StartTask(void *pdata); void MyTask(void *pdata); void YouTask(void *pdata);

int main (void) { TargetInit (); //初始化CPU和硬件电路 OSInit (); Uart0_Pin_Set(); UARTInit(); Str_Q=OSQCreate(&MsgGrp[0],N_MESSAGES); //初始化 OSTaskCreate (StartTask, (void *)0, &StartTaskStk [TaskStkLengh - 1], 1); OSTaskCreate (MyTask, (void *)0, &MyTaskStk [TaskStkLengh - 1], 2); OSTaskCreate (YouTask,(void *)0, &YouTaskStk[TaskStkLengh - 1], 3);

OSStart (); return 0; }

void StartTask (void *pdata) {

pdata=pdata; OSStatInit();

s = \"这个串能收到几次?\\n\"; OSQPost(Str_Q,s); //发送消息 while(1) {

if(OSTimeGet()>100&&OSTimeGet()<500) { OSQPost(Str_Q,s100); s = \"这个串是哪个任务收到的?\\n\"; OSQPost(Str_Q,s); } if(OSTimeGet()>500&&OSTimeGet()<1000) { OSQPost(Str_Q,s500); } OSTimeDlyHMSM(0,0,1,0); } }

void MyTask (void *pdata) {

pdata=pdata; while(1) {

ss = OSQPend(Str_Q,0,&err);

UART0SendStr(ss); UART0SendStr(\"上边一行是MyTask收到\\n\"); OSTimeDlyHMSM(0,0,1,0); } }

void YouTask (void *pdata) {

pdata=pdata; while(1) {

ss = OSQPend(Str_Q,0,&err); UART0SendStr(ss); UART0SendStr(\"上边一行是YouTask收到\\n\"); OSTimeDlyHMSM(0,0,1,0); } }

/*********************************************************************************************************

** End Of File

********************************************************************************************************/

实验7信号量集

/******************************************************************************************************* 作者:杨洪建 时间:2015.1.12 版本:2.0

修改:2015.1.11/2015.11.12/ 描述:信号量集

********************************************************************************************************/ #include \"config.h\" #include \"stdlib.h\" #include \"uart.h\"

#define TASK_STK_SIZE 64

OS_STK MyTaskStk[TASK_STK_SIZE]; OS_STK YouTaskStk[TASK_STK_SIZE]; OS_STK HerTaskStk[TASK_STK_SIZE];

INT8U err;

OS_FLAG_GRP *Sem_F; //定义全局变量的指针信号量集的指针

void MyTask(void *pdata); void YouTask(void *pdata); void HerTask(void *pdata);

int main (void) {

TargetInit (); //初始化CPU和硬件电路 OSInit ();

Uart0_Pin_Set(); UARTInit();

Sem_F=OSFlagCreate(0,&err); //创建信号量集,且初始值为0。

OSTaskCreate(MyTask, (void*)0,&MyTaskStk [TASK_STK_SIZE - 1], 5); //创建任务 OSTaskCreate(YouTask,(void*)0,&YouTaskStk[TASK_STK_SIZE - 1], 3); OSTaskCreate(HerTask,(void*)0,&HerTaskStk[TASK_STK_SIZE - 1], 4); OSStart (); return 0; }

void MyTask(void *pdata) {

pdata=pdata; while(1) { OSTimeDlyHMSM(0,0,1,0);

OSFlagPend(Sem_F,(OS_FLAGS)3,OS_FLAG_WAIT_SET_ALL,0,&err);

//(OS_FLAGS)3代表二进制11; UART0SendStr(\"MyTask 请求到了两个信号量集\\n\"); UART0SendStr(\"MyTask 进入工作状态工作!\\n\"); } }

void YouTask(void *pdata) {

pdata=pdata; while(1) { OSTimeDlyHMSM(0,0,2,0);

OSFlagPost(Sem_F,(OS_FLAGS)2,OS_FLAG_SET,&err); //(OS_FLAGS)3代表二进制10; UART0SendStr(\"YouTask 发出了信号量集\\n\");

} }

void HerTask(void *pdata) {

pdata=pdata; while(1) { OSTimeDlyHMSM(0,0,3,0); OSFlagPost(Sem_F,(OS_FLAGS)1,OS_FLAG_SET,&err); //(OS_FLAGS)3代表二进制01; UART0SendStr(\"HerTask 发出了信号量集\\n\"); } }

/*********************************************************************************************************

** End Of File

********************************************************************************************************/

实验8见课本

因篇幅问题不能全部显示,请点此查看更多更全内容

Top