当前位置: 首页 > news >正文

白云区建网站/seo策略

白云区建网站,seo策略,上海cms模板建站,上海做网站hlanggroup在最简单的硬件驱动开发和内容使用当中,使用最简单的阻塞和非阻塞两种方式完成应用和硬件数据交互工作。将阻塞和非阻塞两种方式简单,将两部分内容写在同一块内容当中。 1. 概念 应用程序使用API接口,如open、read等来最终操作驱动&#xff…

在最简单的硬件驱动开发和内容使用当中,使用最简单的阻塞和非阻塞两种方式完成应用和硬件数据交互工作。将阻塞和非阻塞两种方式简单,将两部分内容写在同一块内容当中。

1. 概念

      应用程序使用API接口,如open、read等来最终操作驱动,有两种结果--成功和失败。成功,很好处理,直接返回想要的结果;但是,失败,是继续等待,还是返回失败类型呢?  如果继续等待,将进程休眠,那么这类驱动设计就是阻塞式的;如果不等待,返回失败的类型(原因),那么这类驱动的设计就是非阻塞式的。

      在应用程序打开驱动文件的时候,可以通过参数向驱动传递使用驱动的方式(阻塞或者非阻塞),通过flags这个参数来传递。当flags中包含“O_NONBLOCK”,就是非阻塞,否则就是阻塞式的。在底层设备驱动代码中,使用相同的标识位进行代码隔离区分,确定不同类型的设备读写方式完成驱动开发。

fd = open("/dev/xxx", O_RDWR | O_NONBLOCK);

2. 应用层

2.1 阻塞

在无法获取数据时,会将当前线程睡眠,知道底层有数据的才会被唤醒返回read读数据结果。

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>/* seconddrvtest */
int main(int argc, char **argv)
{int fd;unsigned char key_vals[4];int cnt = 0;fd = open("/dev/buttons", O_RDWR);if (fd < 0){printf("can't open!\n");}while (1){read(fd, key_vals, sizeof(key_vals));if (!key_vals[0] || !key_vals[1] || !key_vals[2] || !key_vals[3]){printf("%04d key pressed: %d %d %d %d\n", cnt++, key_vals[0], key_vals[1], key_vals[2], key_vals[3]);}}return 0;
}

2.2 非阻塞

int main(int argc, char **argv)
{unsigned char key_val;int ret;int Oflags;fd = open("/dev/buttons", O_RDWR | O_NONBLOCK);if (fd < 0){printf("can't open!\n");return -1;}while (1){ret = read(fd, &key_val, 1);printf("key_val: 0x%x, ret = %d\n", key_val, ret);sleep(5);  // 非阻塞上面直接返回,这里睡眠一下防止平凡打印}return 0;
}

2.3 驱动实现

      以按键驱动为例进行说明,主要是利用互斥锁功能来实现。

1、实现open函数的阻塞非阻塞功能

static DECLARE_MUTEX(buttons_lock); static int buttons_open(struct inode *inode, struct file *file)
{    if (file->f_flags & O_NONBLOCK){if (down_trylock(&buttons_lock))return -EBUSY;}else{down(&buttons_lock);}............return 0;
}

      open()函数的目的是打开驱动文件/dev/buttons,而通常驱动文件允许打开的进程数量是有限制的,本例中是独占式的,所以需要利用互斥锁。函数down_trylock()和函数down(),分别具有非阻塞和阻塞的特性,所以利用这种特性,很容易实现open()函数的需求。

      注意在buttons_close()函数,不要忘记调用up(&buttons_lock)把互斥锁释放。

2、实现read函数的阻塞非阻塞功能

static int buttons_read(struct file *filp, char __user *buff, size_t count, loff_t *offp)
{unsigned long err;if (filp->f_flags & O_NONBLOCK){if(0 == ev_press){return -EAGAIN;}}else{/* 如果没有按键动作, 休眠 */wait_event_interruptible(button_waitq, ev_press);}/* 执行到这里时,ev_press等于1,将它清0 */ev_press = 0;/* 将按键状态复制给用户,并清0 */err = copy_to_user(buff, &keys_val, count);return err ? -EFAULT : 0;
}

      read()函数的目的是来读取/dev/buttons文件,所收到的按键键值。当被按下,中断程序令ev_press置1,读取完之后清0。

      显然,如果已经被按下,已经存入了键值,那么read函数很容易成功返回。但是,如果没有按键按下,这个时候阻塞的处理就是继续等待,将进程休眠;而非阻塞则是返回-EAGAIN,重新来读。

http://www.lbrq.cn/news/1049707.html

相关文章:

  • wordpress 美食主题/百度搜索优化建议
  • 网站开发需要哪些工程师/百度广告投放价格表
  • 自己做黑彩网站/广告营销方式有哪几种
  • 用竹片做的网站/营销模式和营销策略
  • 电商网站管理系统模板下载/徐州做网站的公司
  • 做网站需要哪些东西和步骤/怎样有效的做网上宣传
  • 筑巢网站建设/全网营销是什么
  • 签约做网站模板/百度登录首页
  • 用pc做网站服务器为什么不如云主机/网站推广如何引流
  • 合肥网络公司网站建设/兰州seo快速优化报价
  • 柳州建设厅官方网站/搜狗搜索旧版本
  • 网站空间每年继费到哪交/免费招聘信息发布平台
  • adobe专门做网站的软件/爱战网关键词挖掘
  • 怎么做套板网站/品牌推广活动有哪些
  • sublime做网站/aso优化技巧大aso技巧
  • 网站开发网站制作/b站大全永不收费2023入口在哪
  • 小说网站建设方案书ppt/网站建设维护
  • 广州网站开发设计公司/核心关键词举例
  • 阳江企业网站建设/12345浏览器网址大全
  • 网站做跳转/seo免费浏览网站
  • 做网站导流/小江seo
  • 河北移动端网站建设/在线刷关键词网站排名
  • 建设一个网站大概多少钱/电商运营自学网站
  • 网站导航网站建设多少钱/百度销售推广
  • 怎么做出有品牌感的网站/百度排名查询
  • 网站是哪个公司做的好处/百度投广告怎么收费
  • 企业网站建设联系电话/北京排名seo
  • 新闻网站建设规划书/5118站长工具箱
  • 杭州湾新区开发建设公司网站/百度一下首页登录入口
  • 网站建设中企动力公司/百度下载安装2021
  • 第4章 程序段的反复执行for语句P115练习题(题及答案)
  • 基于IPD体系的研发项目范围管理
  • Effective C++ 条款31: 将文件间的编译依存关系降至最低
  • Linux-JSON Schema
  • 解决flex元素内部文本溢出的问题min-width: 0
  • 接入小甲鱼数字人API教程【详解】