阅读以下关于利用信号量机制解决进程同步与互斥方面的应用实例,回答问题1至问题3。 [说明] 在多道程序系统中,进程是并发执行的。这些进程间存在着不同的相互制约关系,主要表现为同步和互斥两个方面。信号量机制是解决进程间同步与互斥的有效方法。下面是

admin2010-05-08  39

问题 阅读以下关于利用信号量机制解决进程同步与互斥方面的应用实例,回答问题1至问题3。
   [说明]
   在多道程序系统中,进程是并发执行的。这些进程间存在着不同的相互制约关系,主要表现为同步和互斥两个方面。信号量机制是解决进程间同步与互斥的有效方法。下面是信号量应用实例。
   下图所示代码是在μC/OS-II操作系统上运行的一个应用的主函数。该函数创建了任务Task1和Task2,其中Task1实现从键盘读入一个字符的功能,Task2将该字符输出到屏幕,它们使用信号量和一个公共变量buffer来传递该字符。
   主函数、Task1和Task2中所调用的函数原型说明如下:
   a.创建一个信号量:OS EVENT*#OSSemCreate(INT16Uvalue);
   b.创建一个任务:INT8U OSTaskCreate(void(*#task)(void*#pd),void*#pdata,OS_STK *#ptos,INT8U prio);
   c.开始执行多任务:void OSStart(void);
   d.从键盘读入一个字符:char scanc();
   e.输出一个字符至屏幕:void printc(char ch);
   f.发出一个信号量:INT8U OSSemPost(OS EVENT*#pevent);
   g.等待一个信号量:void OSSemPend(OS_EVENT*#pevent,INT16U timeout,INT8U *#err)

请根据本题要求完善任务Task1和任务Task2的程序代码,填补图中的空缺。

选项

答案(1)OSSemPend(emptySem,O,&err) (2)Buffer=readc (3)ret=OSSemPost(fullSem) (4)OSSemPend(fullSem,O,&err) (5)ret=OSSemPost(emptySem) (6)Printc(wntec)

解析 本问题是信号量应用实例。
   μC/OS-II操作系统提供了操作信号量的若干系统调用,任务Task1为了实现从键盘读入一个字符并写到buffer的功能,就必须在读完字符后调用OSSemPend()和OSSemPost()对写buffer缓冲的动作加锁和解锁。
   Task2为了完成将该字符输出到屏幕,也必须在读buffer缓冲的动作时加锁和解锁。这样就避免任务Task1和Task2同时操作buffer缓冲的资源冲突。
   因此,任务Task1的代码如下:
   void    Task1(void*#pdata)
   {
       INT8U readc;
       INT8U err;
       INT8U ret;
           while(1){
               readc=scanc();
   OSSemPend(emptySem,0,&err);
   Buffer=readc;
   ret=OSSemPost(fullSem);
           }
       }
   任务Task2的代码如下:
   void    Task2(void*#pdata)
   {
       INT8U writec;
       INT8U err;
       INT8U ret;
       while(1){
           OSSemPend(fullSem,0,&err);
           writec=buffer;
           ret=OSSemPost(emptySem);
           Printc(writec);
           }
       }
转载请注明原文地址:https://kaotiyun.com/show/EhWZ777K
0

相关试题推荐
最新回复(0)