- 1、本文档共223页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
嵌入式软件开发简介以linux为例.ppt
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 阻塞I/O,poll()非阻塞I/O、异步通知 * v08: 08/02, Rob Levy - Style update, black white view amended v07: 12/01, CJS Main changes: - ARM Development Boards slide removed (now in Debug Solutions module) - Register set slides re-ordered so that the animated graphic comes first - slide 12: Q bit in v5TEJ as well as v5TE - slide 14: CPSR changes rephrased slightly - slide 16: reference to v5T removed. - slide 27: EASY/Micropack replaced with ADK/ACT - slide 30: Trace slide updated * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 全局标志的竞争问题 在上例中,如果有两个进程试图同时打开设备,则他们有可能同时测试全局标志,并同时成功打开。 为了避免这种情况发生,我们可以以原子操作的形式修改标志 使用自旋锁比较适合此处使用 限制每次只有一个用户访问 此种实现允许一个用户多次打开设备 维护数据结构的完整性由用户来完成 用户第一次打开设备时授权,并记录下设备的属主。该用户可以对此打开设备 其他用户试图再打开设备时,UID检查结果会拒绝打开,并返回-EBUSY,指示设备忙 用阻塞open代替EBUSY 有些情况下,设备忙时最好让用户稍延迟一会儿而不是返回失败 可以用阻塞型的open来实现 当用户试图打开设备时,如果设备忙,则把当前进程置入等待队列 当前一个用户使用完设备,使用计数减到0时,下一个用户睡眠的进程将被唤醒 字符设备访问控制 同步、互斥、阻塞、睡眠 poll和select操作 异步通知机制 竟态产生的原因 对称多处理器(SMP)的多个CPU 单CPU内进程与抢占它的进程 中断(硬中断、软中断、Tasklet、底半部)与进程之间 原子操作 原子操作指的是在执行过程中不会被别的代码路径所中断的操作。 常用原子操作函数举例: atomic_t v = ATOMIC_INIT(0); //定义原子变量v并初始化为0 atomic_read(atomic_t *v); //返回原子变量的值 void atomic_inc(atomic_t *v); //原子变量增加1 void atomic_dec(atomic_t *v); //原子变量减少1 int atomic_dec_and_test(atomic_t *v); //自减操作后测试其是否为0,为0则返回true,否则返回false。 原子变量的使用实例 原子变量的使用实例:最多只能被一个进程打开 static atomic_t xxx_available = ATOMIC_INIT(1); /*定义原子变量*/ static int xxx_open(struct inode *inode, struct file *filp) { ... if (!atomic_dec_and_test(xxx_available)) { atomic_inc(xxx_available); return - EBUSY; /*已经打开*/ }... return 0; /* 成功 */ } static int xxx_release(struct inode *inode, struct file *filp) { atomic_inc(xxx_available); /* 释放设备 */ return 0; } 自旋锁 自旋锁(spin lock)是一种对临界资源进行互斥手访问的典型手段 Linux系统中与自旋锁相关的操作主要有如下4种。 1.定义自旋
文档评论(0)