OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5779|回复: 2

菜鸟求助PC里VC下移植的uc/os-II关于任务切换的问题

[复制链接]

7

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2012-5-20
在线时间
8 小时
发表于 2013-1-16 12:34:30 | 显示全部楼层 |阅读模式
菜鸟一个,想先在PC上熟悉一下uc/os-II ,   但是遇到了些问题了,希望熟悉uc/os-II的高手们帮帮忙吧。任务切换什么的完全不会,OSTimeDly()函数貌似在PC上面有很大的问题,任务切换过去后切换不回来,现在使用OSTaskSuspend()和OSTaskResume()函数加上手动调用OSCtxSw()函数这样的笨办法来实现任务切换,下面的问题不知道是不是因为这个切换机制造成的,请大大们分析一下:

这是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的大神帮帮忙,谢谢大家了

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2013-1-16 14:36:15 | 显示全部楼层
看你的邮箱使用,貌似没问题。
你的任务切换,通过OS DELAY,不能切换,就有问题了。
不过VC这东东我也不熟,你可以参考下我们战舰板的OS例子,可以直接在MDK下仿真的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2012-5-20
在线时间
8 小时
 楼主| 发表于 2013-1-16 21:06:13 | 显示全部楼层
感谢原子哥的指点,我现在换了一个版本的uc/os for vc,这下用的是信号量来控制任务切换,感觉要比上面的笨方法要好操作和理解。不过这样带来了一个新问题,就是邮箱不能用了!如果在Task4里面创建邮箱,那么返回的是空指针,在说明里面说空指针就是没有可用事件控制块了,我不知道为什么会没有可用事件控制块的,是不是因为创建了信号量的关系?感觉信号量和邮箱都是OS_EVENT*类型的,而我为每一个任务都创建了一个信号量。那如果是的话,应该怎么操作才能增加事件控制块呢?另外,如果邮箱创建在main函数里面或者TaskStarter的循环之前,试了一下,这个操作,把我的所有任务切换都搞乱了,让我的shell一直输入回车,而TaskStart循环里面和创建在Task里面是一样的效果..说得有点乱,简单说就是邮箱创建返回空指针,不知怎么解决,请教教我吧
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 23:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表