📄 user.c
字号:
/*
* usertask.c
* the user task for ucosII
*
*
*
* Last modified: 2010-10-15
* writen by卢有亮
* for book:嵌入式实时操作系统μCOS分析与实践
* 2011于成都电子科技大学
* luyl@uestc.edu.cn
*/
#include "includes.h"
int a,b,c;
int add1(int *p1,int *p2)
{
int a,b,c;
a=*p1;
b=*p2;
OSTimeDly(OS_TICKS_PER_SEC);
c=a+b;
return(c);
}
int add2(int p1,int p2)
{
//int a,b;
a=p1;
b=p2;
OSTimeDly(OS_TICKS_PER_SEC);
c=a+b;
return(c);
}
void usertask(void *pParam)
{
/* INT8U i=0;
for(;;){
printf("%d\n",i);
i++;
OSTimeDly(100);
}*/
INT8U i=(INT8U)pParam;
//printf("优先级为%d的任务输出后延时%d秒\n",OSPrioCur,OSPrioCur);
for(;;)
{
printf("优先级为%d的任务输出%d\n",OSPrioCur,i++);
OSTimeDly(100);
}
}
void usertask1(void *pParam)
{
int sum;
for(;;){
//printf("\ntask%d call add2(1,2)\n",1);
sum=add2(1,2);
printf("\ntask%d call add2(1,2) solution is %d\n",1,sum);
}//for(;;)
}
void usertask2(void *pParam)
{
int sum;
for(;;){
//printf("\n\rtask%d call add2(100,200)\n",2);
sum=add2(100,200);
printf("\ntask%d call add2(100,200) solution is %d\n",2,sum);
}//for(;;)
}
void UsrCouPri()
{
int crt;
crt=0;
for(;;){
// sum=add2(100,200);
}
}
//信号量管理的例子
void UserTaskSemA(void *pParam)
{
/*任务SemA创建信号量,然后周期性访问资源R*/
/*创建信号量*/
INT8U *perr;
INT8U err;
//INT8U i;
OS_SEM_DATA mySemData;
err=0;
perr=&err;
MyEventSem=OSSemCreate(2);
if (MyEventSem==(OS_EVENT *)0)
{
printf("任务A创建信号量失败!\n");
OSTaskDel(OS_PRIO_SELF);
return;
}
OSSemQuery(MyEventSem,&mySemData);
printf("时间:%d, 任务A创建信号量。当前信号量值=%d\n",OSTimeGet(),mySemData.OSCnt);
while(1)
{
OSSemQuery(MyEventSem,&mySemData);
printf("时间:%d,任务A开始请求信号量!当前信号量值=%d\n",OSTimeGet(),mySemData.OSCnt);
OSSemPend(MyEventSem,0,perr);
if (err!=OS_ERR_NONE)
{
printf("任务A请求信号量失败\n");
printf("错误号%d\n",err);
continue;
}
OSSemQuery(MyEventSem,&mySemData);
printf("时间:%d,任务A获得信号量。当前信号量值=%d,任务A开始对R操作\n",OSTimeGet(),mySemData.OSCnt);
OSTimeDly(1000); /*模拟操作资源,需要10秒,1000个时钟嘀嗒*/
printf("时间:%d,任务A结束资源操作,提交信号量!\n",OSTimeGet());
OSSemPost(MyEventSem);
OSSemQuery(MyEventSem,&mySemData);
printf("时间:%d,任务A提交信号量完成,当前信号量值=%d,任务A将延时阻塞1000嘀嗒\n",OSTimeGet(),mySemData.OSCnt);
OSTimeDly(1000);
}
}
void UserTaskSemB(void *pParam)
{
/*任务SemA创建信号量,然后周期性访问资源R*/
INT8U *perr;
INT8U err;
OS_SEM_DATA mySemData;
err=0;
perr=&err;
printf("时间:%d,任务B开始延时300个时钟嘀嗒",OSTimeGet());
OSTimeDly(300);/*任务B先延时3秒*/
if (MyEventSem==(OS_EVENT *)0)
{
printf("任务A创建信号量失败!\n");
OSTaskDel(OS_PRIO_SELF);
return;
}
while(1)
{
OSSemQuery(MyEventSem,&mySemData);
printf("时间:%d,任务B开始请求信号量!当前信号量值=%d\n",OSTimeGet(),mySemData.OSCnt);
OSSemPend(MyEventSem,0,perr);
if (err!=OS_ERR_NONE)
{
printf("任务B请求信号量失败\n");
printf("错误号%d\n",err);
continue;
}
OSSemQuery(MyEventSem,&mySemData);
printf("时间:%d,任务B获得信号量。当前信号量值=%d,任务B开始对R操作,需1000个时钟嘀嗒\n",OSTimeGet(),mySemData.OSCnt);
OSTimeDly(1000); /*模拟操作资源,需要10秒,1000个时钟嘀嗒*/
printf("时间:%d,任务B结束资源操作,提交信号量!\n",OSTimeGet());
OSSemPost(MyEventSem);
OSSemQuery(MyEventSem,&mySemData);
printf("时间:%d,任务B提交信号量完成,当前信号量值=%d,任务B将延时阻塞1000嘀嗒\n",OSTimeGet(),mySemData.OSCnt);
OSTimeDly(1000);
}
}
void UserTaskSemC(void *pParam)
{
/*任务SemA创建信号量,然后周期性访问资源R*/
INT8U *perr;
INT8U err;
INT8U i;
OS_SEM_DATA mySemData;
err=0;
perr=&err;
printf("时间:%d,任务C开始延时400个时钟嘀嗒",OSTimeGet());
OSTimeDly(400);/*任务C先延时4秒*/
if (MyEventSem==(OS_EVENT *)0)
{
printf("任务A创建信号量失败!\n");
OSTaskDel(OS_PRIO_SELF);
return;
}
while(1)
{
OSSemQuery(MyEventSem,&mySemData);
printf("时间:%d,任务C开始请求信号量!当前信号量值=%d\n",OSTimeGet(),mySemData.OSCnt);
OSSemPend(MyEventSem,0,perr);
if (err!=OS_ERR_NONE)
{
printf("任务C请求信号量失败\n");
printf("错误号%d\n",err);
continue;
}
OSSemQuery(MyEventSem,&mySemData);
printf("时间:%d,任务C获得信号量。当前信号量值=%d,任务C开始对R操作,需1000个时钟嘀嗒\n",OSTimeGet(),mySemData.OSCnt);
OSTimeDly(1000); /*模拟操作资源,需要10秒,1000个时钟嘀嗒*/
printf("时间:%d,任务C结束资源操作,提交信号量!\n",OSTimeGet());
OSSemPost(MyEventSem);
printf("时间:%d,任务C提交信号量完成,当前信号量值=%d,任务C将延时阻塞1000嘀嗒\n",OSTimeGet(),mySemData.OSCnt);
OSTimeDly(1000);
}
}
//事件标志组的例子
INT8U IO[4][10];
OS_FLAG_GRP * pFlagGroupDataProcess;
void TaskDataProcess(void *pParam)
{
INT8U *perr;
INT8U err,i;
INT16U SUM;
OS_FLAGS processflag,retflag;
err=OS_ERR_NONE;
perr=&err;
processflag=0x0F;
/*创建事件标志组,事件标志初始值0,没有事件发生*/
pFlagGroupDataProcess=OSFlagCreate(0,perr);
/*省略了检查是否创建成功*/
while(1)
{
printf("时间:%d,任务TaskDataProcess开始请求事件标志-----------!\n",OSTimeGet());
retflag=OSFlagPend (pFlagGroupDataProcess,
processflag,
OS_FLAG_WAIT_SET_ALL+OS_FLAG_CONSUME,
0,
perr);
if (retflag==processflag)
{
SUM=0;
printf("时间:%d,任务TaskDataProcess请求事件标志成功,开始处理数据!\n",OSTimeGet());
for (i=0;i<10;i++)
{
SUM+=IO[0][i]+IO[1][i]+IO[2][i]+IO[3][i];
}
printf("时间:%d,任务TaskDataProcess处理数据完成,结果为%d:\n",OSTimeGet(),SUM);
}
}
}
void TaskIO1(void *pParam)
{
INT8U *perr;
INT8U err,i;
OS_FLAGS rdyflag;
//OS_FLAG_GRP * pFlagGroup;
err=OS_ERR_NONE;
perr=&err;
rdyflag=0;
while(1)
{
OSTimeDly(100);/*延时1秒*/
for (i=0;i<10;i++) /*模拟获取数据的过程*/
{
IO[0][i]=1;
}
printf("时间:%d,任务TaskIO1获取IO数据后,准备提交事件,当前事件标志位:%d\n",OSTimeGet(),rdyflag);
rdyflag=OSFlagPost (pFlagGroupDataProcess,
0x01,
OS_FLAG_SET,
perr); /*提交事件标志,置位事件标志组中最后一位位0*/
printf("时间:%d,任务TaskIO1获取IO数据后,提交事件,当前事件标志位:%d\n",OSTimeGet(),rdyflag);
}
}
void TaskIO2(void *pParam)
{
INT8U *perr;
INT8U err,i;
OS_FLAGS rdyflag;
perr=&err;
err=OS_ERR_NONE;
rdyflag=0;
while(1)
{
OSTimeDly(100);/*延时1秒*/
for (i=0;i<10;i++) /*模拟获取数据的过程*/
{
IO[1][i]=2;
}
printf("时间:%d,任务TaskIO2获取IO数据后,准备提交事件,当前事件标志位:%d\n",OSTimeGet(),rdyflag);
rdyflag=OSFlagPost (pFlagGroupDataProcess,
0x02,
OS_FLAG_SET,
perr); /*提交事件标志,置位事件标志组中位1*/
printf("时间:%d,任务TaskIO2获取IO数据后,提交事件,当前事件标志位:%d\n",OSTimeGet(),rdyflag);
}
}
void TaskIO3(void *pParam)
{
INT8U *perr;
INT8U err,i;
OS_FLAGS rdyflag;
perr=&err;
err=OS_ERR_NONE;
rdyflag=0;
while(1)
{
OSTimeDly(100);/*延时1秒*/
for (i=0;i<10;i++) /*模拟获取数据的过程*/
{
IO[2][i]=3;
}
printf("时间:%d,任务TaskIO3获取IO数据后,准备提交事件,当前事件标志位:%d\n",OSTimeGet(),rdyflag);
rdyflag=OSFlagPost (pFlagGroupDataProcess,
0x04,
OS_FLAG_SET,
perr); /*提交事件标志,置位事件标志组中位2*/
printf("时间:%d,任务TaskIO3获取IO数据后,提交事件,当前事件标志位:%d\n",OSTimeGet(),rdyflag);
}
}
void TaskIO4(void *pParam)
{
INT8U *perr;
INT8U err,i;
OS_FLAGS rdyflag;
perr=&err;
err=OS_ERR_NONE;
rdyflag=0;
while(1)
{
OSTimeDly(100);/*延时1秒*/
for (i=0;i<10;i++) /*模拟获取数据的过程*/
{
IO[3][i]=3;
}
printf("时间:%d,任务TaskIO4获取IO数据后,准备提交事件,当前事件标志位:%d\n",OSTimeGet(),rdyflag);
rdyflag=OSFlagPost (pFlagGroupDataProcess,
0x08,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -