这是uc/os-II移植到PC中的VC6.0版本,这些版本在网上都能下载到,我用的是其中有shell的版本,我在其中创建了一个任务,希望在shell里面输入命令时可以切换到这个任务:
////////////////////////////////////////////////////////
void Task4(void * pParam)
{
char ch;
INT8U err;
INT8U *now=NULL;
pParam=pParam;
printf("Hello This is Task4!Press anykey to terminate this task!\n");
while(*((char *)pParam)=='\0')
{
if (PC_GetKey((INT16S *)&ch))//按任意键退出
break;
now=OSMboxPend(RxMbox,10,&err);//从邮箱读取数据
if (now==(void *)0||err!=OS_NO_ERR)//读取错误时退出
break;
printf("\rtime%s",now);
}
printf("\nTask4 has exited!\n");
*((char *)pParam)='1';//将标记置为1,表示任务4退出
OSTaskDel(OS_PRIO_SELF);//由于是TaskStart创建的任务,所以需要删除,下次重新创建
OSCtxSw();//笨办法实现任务切换
}
//////////////////////////////////////////////////////////
这是任务4,使用了邮箱机制,在下面的任务开始(StakStart函数)里面有这样一句话,用于创建任务4并向邮箱中发送数据,任务4则读取邮箱数据:
///////////////////////////////////////////////////////////
///////.......other expressions......./////////////////////
RxMbox = OSMboxCreate((void *)0);//创建邮箱
ch='\0';//置标记为0
OSTaskCreate(Task4, &ch, &TaskStk[5][TASK_STK_SIZE-1], Task4_Prio);
OSCtxSw();//任务切换
while (ch=='\0')//当任务4未退出时
{
PC_GetDateTime(now);//获取系统时间
if (OS_NO_ERR!=OSMboxPost(RxMbox,(void *)now))//向邮箱发送数据
{
ch='1';//发送数据错误时置标记为1,强制任务4退出
break;
}
}
OSMboxDel(RxMbox,OS_DEL_NO_PEND,&err);//删除邮箱,下次重新传关键
////////..........other expressions......//////////////
///////////////////////////////////////////////////////
其中ch就相当于一个标记,当任务4退出时,置标记为1,使邮箱发送停止;或者需要任务4退出时,在外部将标记置为1,强制任务4退出。
简单来说,就是main函数里面创建了两个任务,一个TaskStart(优先级8),一个Shell(优先级2),运行时,Shell先运行,输入命令后切换到TaskStart,在里面再加一个输入函数,检测输入的数据,如果按'4'则创建并切换到Task4(优先级6),就是上面第二段程序的作用,否则退回Shell。Task4就是上面第一段程序,里面不断获取邮箱数据,直到按下任意按键退出,退出后回到TaskSTart,然后TaskStart等待按键,再根据'4'或者其他按键实现切换。
其中按任意键退出是没有任何问题的,另外如果我把OSMboxPend第二个参数,即获取超时设置为1(原本为10),那么任务4差不多获取几秒的系统时间后就因为超时退出了,说明邮箱发送获取数据,以及任务4的创建和删除都是没有任何问题的。
但是现在的问题是,如果不进行任务切换,只让这个Task4一直显示时间,运行一段时间后,他就会停止响应,不知道是为什么,我自己的猜测是uc/os-II的邮箱机制我没有用对,还请有懂得uc/os-II的大神帮帮忙,谢谢大家了
|