
重大社2023《嵌入式内核与驱动设计》教学课件14.pptx
5页每天成长一点点嵌入式内核与驱动开发嵌入式内核与驱动开发知识点知识点:异步通知简介异步通知简介每天成长一点点异步通知简介01我们已经学些过中断,中断就是处理器提供的一种异步机制,我们配置好中断以后就可以让处理器去处理其他的事情了,当中断发生以后会触发我们事先设置好的中断服务函数,在中断服务函数中做具体的处理Linux应用程序可以通过阻塞或者非阻塞这两种方式来访问驱动设备,通过阻塞方式访问的话应用程序会处于休眠态,等待驱动设备可以使用,非阻塞方式的话会通过 poll 函数来不断的轮询,查看驱动设备文件是否可以使用这两种方式都需要应用程序主动的去查询设备的使用情况,如果能提供一种类似中断的机制,当驱动程序可以访问的时候主动告诉应用程序那就最好信号”为此应运而生,信号类似于我们硬件上使用的“中断”,只不过信号是软件层次上的算是在软件层次上对中断的一种模拟,驱动可以通过主动向应用程序发送信号的方式来报告自己可以访问了,应用程序获取到信号以后就可以从驱动设备中读取或者写入数据了整个过程就相当于应用程序收到了驱动发送过来了的一个中断,然后应用程序去响应这个中断,在整个处理过程中应用程序并没有去查询驱动设备是否可以访问,一切都是由驱动设备自己告诉给应用程序的。
总结:异步通知用到了“信号”,它类似于中断,通过信号可以实现设备驱动主动向应用程序告知,自己是否可以被访问每天成长一点点异步通知简介02异步通知的核心就是信号,在 arch/xtensa/include/uapi/asm/signal.h 文件中定义了Linux 所支持的所有信号:34#define SIGHUP 1/*终端挂起或控制进程终止*/35#define SIGINT 2/*终端中断(Ctrl+C 组合键)*/36#define SIGQUIT 3/*终端退出(Ctrl+组合键)*/37#define SIGILL 4/*非法指令*/38#define SIGTRAP 5/*debug 使用,有断点指令产生*/39#define SIGABRT 6/*由 abort(3)发出的退出指令*/40#define SIGIOT 6/*IOT 指令*/41#define SIGBUS 7/*总线错误*/42#define SIGFPE 8/*浮点运算错误*/43#define SIGKILL 9/*杀死、终止进程*/.53#define SIGSTOP 19/*停止进程的执行,只是暂停*/54#define SIGTSTP 20/*停止进程的运行(Ctrl+Z 组合键)*/.63#define SIGIO 29/*可以进行输入/输出操作*/.68#define SIGUNUSED 31/*未使用信号*/这些信号中,除了 SIGKILL(9)和 SIGSTOP(19)这两个信号不能被忽略外,其他的信号都可以忽略。
这些信号就相当于中断号,不同的中断号代表了不同的中断,不同的中断所做的处理不同,因此,驱动程序可以通过向应用程序发送不同的信号来实现不同的功能每天成长一点点异步通知简介03使用中断的时候需要设置中断处理函数,同样的,如果要在应用程序中使用信号,那么就必须设置信号所使用的信号处理函数,在应用程序中使用 signal 函数来设置指定信号的处理函数,signal 函数原型如下所示:sighandler_t signal(int signum,sighandler_t handler)函数参数和返回值含义如下:signum:要设置处理函数的信号handler:信号的处理函数返回值:设置成功的话返回信号的前一个处理函数,设置失败的话返回 SIG_ERR信号处理函数原型如下所示:typedef void(*sighandler_t)(int)每天成长一点点Thanks!嵌入式内核与驱动开发嵌入式内核与驱动开发。





![河南新冠肺炎文件-豫建科[2020]63号+豫建科〔2019〕282号](http://img.jinchutou.com/static_www/Images/s.gif)






