Chinaunix首页 | 论坛 | 博客
  • 博客访问: 31040016
  • 博文数量: 230
  • 博客积分: 2868
  • 博客等级: 少校
  • 技术积分: 2223
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-08 21:48
个人简介

Live & Learn

文章分类

全部博文(230)

文章存档

2022年(2)

2019年(5)

2018年(15)

2017年(42)

2016年(24)

2015年(13)

2014年(1)

2012年(5)

2011年(58)

2010年(56)

2009年(9)

我的朋友

分类: C/C++

2011-08-18 10:48:45

1 通常在一般裸奔的程序中实现数据共享的方式是 定义和声明全局变量,然后通过对全局变量的操作实现数据共享。
    
     在uc/OS中,我使用全局变量共享数据时,程序不能正常运行。那么,在uc/OS系统中如何实现数据共享?

可以通过全局变量来实现数据共享。
但是全局变量是共享资源,任务访问它的时候要注意关中断。
消息和消息队列也可以用来进行数据共享。

全局变量是可以的,不过好像邮箱和消息机制更有效一些

最好不要用全局变量,用邮箱吧,要不到最后程序里面一大堆全局变量,自己都不清楚怎么修改了它们。

2   有3个以上的任务需要共享同一个数据(数组),要求每个任务都可以对数据进行读写操作,但不能同时。怎样实现呢?用可斥信号量   吗?还是用消息队列?

使用互斥比信号量简单些

‍数组资源的个数是一个,可以用互斥或信号量

3‍

当共享地址空间进行数据交换时,为避免竞争,需要对内存进行互锁。
实现资源互斥访问的方法有很多,不同之处仅在于互斥的范围:禁止中断,禁止任务调度以及信号量对资源的上锁。

1.禁止中断
对于互斥使用最强有力的办法是禁止中断,这种方法保证了对CPU的单独访问。
uC/OS-II:
OS_ENTER_CRITICAL()
OS_EXIT_CRITICAL()

VxWorks:
intLock()
intUnlock()

对于大部分实时系统,禁止中断不能作为一种通用的互斥方法。因为若关中断的时间太长的话,会影响整个系统的中断相应时间,即中断延迟时间。
当改变或复制几个变量的值时,应想到用这种办法来做。
注意:在中断服务子程序ISR中,禁止中断是处理共享数据结构的唯一办法。


2.禁止任务调度
不允许其他任务抢占当前执行任务时,禁止抢占提供了一种较小限制性的互斥,此时,中断仍能响应。
uC/OS-II:
OSSchedLock()
OSSchedUnlock()

VxWorks:
taskLock()
taskUnlock()

使用这种办法也会使系统实时性得不到充分的保证,类似于第一种办法。


3.信号量
在大多数RTOS中,信号量被高度优化,可以提供最快的任务间通信机制。信号量是互斥和任务同步的最主要手段。
对于互斥,信号量可对共享资源访问进行互锁。
对于同步,信号量可协调外部事件与任务之间的执行。

二进制信号量
uC/OS-II:
OSSemCreate()
OSSemPost()
OSSemPend()
OSSemDel()
OSSemQuery()

VxWorks:
semBCreate()   // 分配并初始化一个二进制信号量
semTake()      // 获取一个信号量
semGive()      // 提供一个信号量
semDelete()    // 中止并释放一个信号量
semFlush()     // 解锁所有正在等待信号量的任务

互斥信号量:
uC/OS-II:
OSMutexCreate()
OSMutexPost()
OSMutexPend()
OSMutexDel()
OSMutexQuery()

VxWorks:
semMCreate()   // 分配并初始化一个互斥信号量
semTake()      // 获取一个信号量
semGive()      // 提供一个信号量
semDelete()    // 中止并释放一个信号量
semFlush()     // 解锁所有正在等待信号量的任务


总结:
使用实时系统时,访问共享资源或数据结构,一般使用信号量的方法。
值得注意的是,在ISR中,只能使用禁止中断的办法。

阅读(3426) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~