问题 问答题


阅读以下关于嵌入式系统技术的说明,根据要求回答问题1至问题3。
[说明]
某水电站根据安全监控的需要决定采用嵌入式工控微机进行实时多任务安全监测。该系统有32路模拟量输入、96路开关量、16路脉冲量输入和水位落差量输入,产生显示信息、报警信号、监测报表和水位传感器控制信号等输出。该水电站安全监测系统具有以下几个特点:
(1)对各种模拟量、开关量、脉冲量、水位落差量等数据量的监测,事实上只是周期性地重复执行相应的各个任务模块。
(2)监视的对象比较固定,系统硬件的规模相对固定不变。
(3)尽可能允许把所有软件都固化在EPROM中。
(4)人机交互作用的内容固定,即由操作人员通过键盘去调用此系统中所存入的相应应用程序,不会去修改应用程序。
基于以上安全监测系统的特点,该水电站技术研发部门准备选用现有的工业控制机系统及现成的各种模板等硬件,由本部门的开发人员自行开发软件。所开发的软件主要包括:
(1)应用程序,即按各类输入/输出量的采集、处理、显示、报警和制表等功能分别作为若干任务块,由这些任务组成应用程序。
(2)多任务嵌入式实时操作系统,用来协调各任务的资源分配与管理,管理任务之间的联系与多任务操作。

[问题3]
在该水电站安全监测系统中,数据采集任务(Collect_task)把所采集的数据送入一单缓冲区,计算任务(Calculate_task)从该单缓冲区中取出数据进行计算。以下是利用信号量机制实现两个任务共享单缓冲区的C语言形式化描述程序。请将程序代码中(6)~(9)空缺处以及(10)空缺处的内容填写完整。
int sr=0’
int (6)
main()
{
cobegin
Collect_task();
Calculate_task();
coend
}
Collect_task()
{
While(采集工作未完成)
{
采集一个数据,
P(se),
将数据送入缓冲区中:
(7)
}
}
Calculate_task()
{
While(计算工作未完成)
{
(8)
从缓冲区中取出数据:
(9)
进行数据计算送入缓冲区中,
}
}
如果以上程序中“int sf=0;”语句不小心被改写成“ints{=-1;”,那么系统运行时将会进入 (10) 状态。

答案

参考答案:

解析:se=1 (7)V(sf)(8)P(sf) (9)V(se)(10)死锁这是一道要求读者掌握信号量操作机制的程序分析题。本题的解答思路如下: ①在本试题中,数据采集任务(Collect_task)和计算任务(Calculate_task)共用一个单缓冲区。数据采集任务(Collect_task)采集到一个数据后,只有当缓冲区为空时,才能将数据送入该单缓冲区存放,否则应等待单缓冲区腾空。当单缓冲区中有数据时,计算任务 (Calculate task)才能从缓冲区中取出数据进行计算,否则也应等待。

②本试题信号量操作机制的实质是一个典型的生产者——消费者操作问题,即需要使用两个任务间同步算法解决问题。 ③本试题中应设置两个信号量,其中一个信号量来表示缓冲区中是否有可供计算的数据,其初值为0。程序代码中“int sf=0;”语句正是对该信号量的定义。 ④实现两个任务间同步算法时,还需定义另一个信号量来表示单缓冲区中有无空位置存放新的数据,其初值为1。数据采集任务(Collect_task)程序代码中已给出“P(se),”语句,间接说明另一个信号量的标识是“se”。因此(6)空缺处所填写的内容是“se=1”。 ⑤当数据采集任务(Collect_task)将数据送入单缓冲区中时,应使用“V(sf),”语句唤醒原处于等待状态的计算任务(Calculate_task)。因此(7)空缺处所填写的内容是“V(sf);”语句。 ⑥由于计算任务(Calculate_task)需要等待单缓冲区中有数据时,才能从缓冲区中取出数据进行计算,也就是说,单缓冲区中没有数据时,计算任务(Calculate_task)应处于等待状态。因此(8)空缺处实现此功能语句的语句是“P(sf);”。 ⑦当计算任务(Calculate_task)从缓冲区中取出数据时,单缓冲区的空间被腾空,此时允许将新数据存人该单缓冲区,即单缓冲区的使用权限将交付给数据采集任务(Collect _task因此(9)空缺处需填入语句“V(se);”实现此功能。 ⑧当信号量sf的初始值为-1时,假设计算任务(Calculate_task)先被调度执行,它执行P(sf)操作时,使sf的值变为-2,计算任务(Calculate_task)进入阻塞状态。假设此时发生了一次时钟中断,数据采集任务(Collect_task)被调度执行,它顺利通过了P(se)操作,并使se的值变为o,接着在执行V(sf)操作,并使sf的值变为-1,假设满足“While(采集工作未完成)”判断条件,P(se)操作将再次执行,并使se的值变为-1,数据采集任务 (Collect_task)也进入阻塞状态。这样一来,两个任务都在等待对方释放信号量,就成为了一种死锁状态。

问答题
单项选择题