周立功lpc2131嵌入式ucos关于信号量的实验,

[复制链接]
查看11 | 回复3 | 2011-1-27 10:31:50 | 显示全部楼层 |阅读模式
void Task1(void xdata * ppdata)reentrant
{ uint8err;

uint8 t1[]="a";
ppdata = ppdata;

TargetInit();
for(;;)
{

OSSemPend(DispSem,0,&err);

UART0_SendStr(t1);

OSTimeDly(200);

OSSemPost(DispSem);
}
}
void Task2(void xdata * ppdata) reentrant
{ uint8err;


uint8 t2[]="A";

ppdata = ppdata;


for(;;)
{

OSSemPend(DispSem,0,&err);
//

UART0_SendStr(t2);

OSSemPost(DispSem);

}
}
下面是我分析的,忘高手指点、
任务开始的时候OSSEMCreate(1);所以task1就运行至ostimedly(),然后运行task2,因为task2没有得到信号量而被挂起,ostimedly()时间到以后运行ossempost()使任务task2继续运行,好像就不能再切换到其他任务了??????高手指点
但这个两个任务是交替运行的

回复

使用道具 举报

千问 | 2011-1-27 10:31:50 | 显示全部楼层
你这段代码挺熟,好像是书上的demo代码吧?记得一共只有两个任务。你说任务task2运行后“不能再切换到其他任务”,是指task1和task2不应该再运行么?因为每个任务都是for(;;)死循环的,所以每个任务是肯定可以反复运行的。那只存在信号量等待一个问题,关于这个问题,你的理解是非常对的。总结:两个任务是可以持续交替运行下去的。ps:楼主能看到信号量的初始为OSSEMCreate(1),其实靠你自己是完全可以解答这个提问的。呵呵,或许现在你已经弄清楚了呢。
回复

使用道具 举报

千问 | 2011-1-27 10:31:50 | 显示全部楼层
OSSemPend和OSSemPost生产与消费的关系,想消费得先生产;一个是产生信号量,一个是消耗信号量。第二个任务挂起等待,直到第一个任务产生信号量,这时第二个任务就消耗掉这个信号量,继续运行。调用OSSemPend在检测到资源数目等于0进行等待的时候会进行任务切换OS_Sched()
回复

使用道具 举报

千问 | 2011-1-27 10:31:50 | 显示全部楼层
任务切换不是只有运行ostimedly()才切换的。OSSemPend这个就是挂起,交给其他任务运行。所以能交替运行。
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行