打印

ucOS的基本概念问题-关于可剥夺、死锁等等

[复制链接]
3081|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xlander|  楼主 | 2008-6-18 10:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
假如进程1、2,进程1优先级高于进程2。

进程1伪代码:
OSTimeDly(1秒);
抢占资源A;
使用资源A;
释放资源A;

抢占资源B;
使用资源B;
释放资源B;

进程2伪代码:
OSTimeDly(0.5秒);
抢占资源B;
使用资源B;
释放资源B;

抢占资源A;
使用资源A;
释放资源A;

这样的程序是不是会造成死锁?

请问大家在破除死锁方面,都是怎样避免的?
有没有一种方便快捷的方法或代码?
尤其是资源的抢占和使用方面。

相关帖子

沙发
dld2| | 2008-6-18 10:59 | 只看该作者

怎么“抢占资源”?

使用特权

评论回复
板凳
xlander|  楼主 | 2008-6-18 11:05 | 只看该作者

插旗。

谁插上了,就是谁的,别人不准动。

使用特权

评论回复
地板
dld2| | 2008-6-18 11:11 | 只看该作者

“抢占”用在这个地方不合适

这叫申请资源。
再高优先级的任务,申请不到,都要阻塞。

死锁问题,貌似《操作系统》教材上都有。

使用特权

评论回复
5
xlander|  楼主 | 2008-6-18 11:20 | 只看该作者

我对这个很头疼。

死锁有4个必要条件,假如进程很多,资源也很多,大家用的是破除那个必要条件?

使用特权

评论回复
6
dld2| | 2008-6-18 11:30 | 只看该作者

楼主的例子不会死锁

最简单的情况:
A进程在占有资源a的情况下,又去申请b。
B进程在占有资源b的情况下,又去申请a。
这样就死锁了。

使用特权

评论回复
7
xlander|  楼主 | 2008-6-18 11:31 | 只看该作者

没有人想过我的代码是否会死锁么?

我写一段真实的代码,

进程1:

OSTimeDly(OS_TICKS_PER_SECOND);

OSSemPend(pEventA, 0, &err);
if(err == OS_NO_ERR)
{
//do some thing
OSSemPost(pEventA);
}

OSSemPend(pEventB, 0, &err);
if(err == OS_NO_ERR)
{
//do some thing
OSSemPost(pEventB);
}

进程2:

OSTimeDly(OS_TICKS_PER_SECOND/2);

OSSemPend(pEventB, 0, &err);
if(err == OS_NO_ERR)
{
//do some thing
OSSemPost(pEventB);
}

OSSemPend(pEventA, 0, &err);
if(err == OS_NO_ERR)
{
//do some thing
OSSemPost(pEventA);
}

使用特权

评论回复
8
machunshui| | 2008-6-18 16:12 | 只看该作者

不会

不会.

6楼解释的很明确,

lZ的代码都是在使用玩事件保护的资源以后立即释放该资源,
然后在申请另一个资源.

另外一个任务总能获得执行机会.

使用特权

评论回复
9
xlander|  楼主 | 2008-6-20 08:29 | 只看该作者

OK

程序莫名其妙的看门狗复位,一直找不到原因,开始怀疑一切。
死锁也是我的怀疑对象。

这种信号量的控制方法,是我一直使用的方法,也没什么问题,最近才出现问题。


刚才发现,可能是别的原因。

用了OS_ERNTER_CRITICAL,似乎不那么经常复位了,正在观察。

碰上这种问题,真是麻烦。

使用特权

评论回复
10
kanprin| | 2008-6-20 18:08 | 只看该作者

如果能跑起来的话

复位的原因注意堆栈溢出问题。

不知道你喂狗方式是怎么样的?

使用特权

评论回复
11
xlander|  楼主 | 2008-6-27 15:08 | 只看该作者

问题找到了。

经过若干次试验后,问题似乎解决了,连续运行到今天是第3天了,都没有复位。

初步的分析一下原因。

先说下喂狗方法。每个进程置位全局变量nFeedFlag中的对应的位,所有位置位后专门硬件喂狗的进程进行喂狗动作。


访问nFeedFlag用到了信号量,访问方法如下:
if(OSSemPend(dogEvent...))
{
//访问nFeedFlag
OSSemPost(dogEvent);
}

有一个进程一秒钟循环10次,每次都置位nFeedFlag,而且优先级很高,可能是置位过于频繁了,造成其他进程很少得到机会执行,造成看门狗复位.

使用特权

评论回复
12
jack.king| | 2008-6-27 17:42 | 只看该作者

请问os是怎么在搞的

请问os是怎么在搞的?
  难道每个任务内核去调度时都要初始化一次吗?
  让机器执行一个东西若分成3个部分才能去完成,那是不是要建立3个任务还是一个任务就可以了?执行的时间比较长

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

65

主题

165

帖子

0

粉丝