异步通知和同步通知_嵌入式Linux异步通知方式

  1. 功能介绍
    所谓同步,就是“你慢我等你”。
    那么异步就是:你慢那你就自己玩,我做自己的事去了,有情况再通知我。
    所谓异步通知,就是 APP 可以忙自己的事,当驱动程序用数据时它会主动给 APP 发信号,这会导致 APP执行信号处理函数。
    仔细想想“发信号”,这只有 3 个字,却可以引发很多问题:
    ① 谁发:驱动程序发
    ② 发什么:信号
    ③ 发什么信号:SIGIO
    ④ 怎么发:内核里提供有函数
    ⑤ 发给谁:APP,APP 要把自己告诉驱动
    ⑥ APP 收到后做什么:执行信号处理函数
    ⑦ 信号处理函数和信号,之间怎么挂钩:APP 注册信号处理函数

小孩通知妈妈的事情有很多:饿了、渴了、想找人玩。
Linux 系统中也有很多信号,在 Linux 内核源文件 includeuapiasm-genericsignal.h 中,有很多信号的宏定义:

eff8a73c2b2e6b76d3098748f2174c33.png


驱动程序通知 APP 时,它会发出“SIGIO”这个信号,表示有“IO 事件”要处理。
就 APP 而言,你想处理 SIGIO 信息,那么需要提供信号处理函数,并且要跟 SIGIO 挂钩。这可以通过一个 signal 函数来“给某个信号注册处理函数”,用法如下:

07505b8d0799e99804369666d5deba1f.png


除了注册 SIGIO 的处理函数,APP 还要做什么事?想想这几个问题:

① 内核里有那么多驱动,你想让哪一个驱动给你发 SIGIO 信号?
APP 要打开驱动程序的设备节点。

② 驱动程序怎么知道要发信号给你而不是别人?
APP 要把自己的进程 ID 告诉驱动程序。

③ APP 有时候想收到信号,有时候又不想收到信号:
应该可以把 APP 的意愿告诉驱动:设置 Flag 里面的 FASYNC 位为 1,使能“异步通知”。

  1. 应用编程
    应用程序要做的事情有这几件:

① 编写信号处理函数:

static void sig_func(int sig)
{
int val;
read(fd, &val, 4);
printf("get button : 0x%xn", val);
}

② 注册信号处理函数:

signal(SIGIO, sig_func);

③ 打开驱动:

fd = open(argv[1], O_RDWR);

④ 把进程 ID 告诉驱动:

fcntl(fd, F_SETOWN, getpid());

⑤ 使能驱动的 FASYNC 功能:

flags = fcntl(fd, F_GETFL);
fcntl(fd, F_SETFL, flags | FASYNC);

百问网技术论坛:http://bbs.100ask.net/

百问网官方wiki(资料下载):http://wiki.100ask.org/

线上课堂:https://www.100ask.net/index

百问网开发板:
淘宝:https://100ask.taobao.com/
天猫:https://weidongshan.tmall.com/

技术交流群(鸿蒙开发/Linux/嵌入式/驱动/资料下载)
QQ群:869222007

单片机-嵌入式Linux交流群:
QQ群:536785813

http://weixin.qq.com/r/M0hvd2-EwjK9rSsU9x0h (二维码自动识别)

百问科技公众号

http://weixin.qq.com/r/nkx-Z6jEa-UUrewE9xmM (二维码自动识别)

百问科技服务号

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值