嵌入式Linux开发笔记(韦东山3)

应用程序怎么读取按键值

应用程序读取按键值,需要有按键驱动程序。

  • 应用程序去读取按键的方法有4种(4种方法没有优劣之分,不同的场合使用不同的方法):
    (1)查询方式:
    时不时去查看,简单,但是累
    (2)休眠-唤醒方式:
    同样休眠,会被按键唤醒,不累,但是也处于休眠状态(不工作状态)
    (3)poll方式:
    类似于定个闹钟,要么是被按键唤醒,要么是被闹钟唤醒,需要浪费一点时间,但是可以继续工作
    (4)异步通知方式:
    按键值出现会自己通知应用程序,互相不耽误

第2、3、4种方法,都涉及到中断服务程序。中断,就像小孩醒了会哭闹一样,中断不经意的到来,它会做某些事情:唤醒应用程序、向应用程序发信号。
所以,在按键驱动程序中,中断是核心。
中断无论是在单片机还是在linux中都很重要,在Linux中,中断的知识还涉及进程、线程等。

  • 驱动的基本技能:
    中断、休眠、唤醒、poll等机制
    这些基本技能是驱动开发的基础,其他大型驱动复杂的地方是它的框架和设计思想,但是基本技术就是这些。

  • APP开发的基本技能:
    阻塞(休眠-唤醒方式)、非阻塞(查询方式)、休眠、poll、异步通知。

查询方式

在这里插入图片描述

休眠-唤醒方式

在这里插入图片描述

poll方式:

在这里插入图片描述

异步通知方式:

驱动程序发送SIGIO类型的信号给应用程序,应用程序收到信号后就会执行信号的处理函数,执行完之后继续执行之前的代码。
在这里插入图片描述

查询方式的按键驱动程序框架

在这里插入图片描述
在这里插入图片描述

//button_drv.c
//等着内核自动给分配设备号
static int major = 0;
//定义file_operations结构体
static struct file_operations button_fops = {
	.open = button_open,
	.read = button_read,
};
//在入口函数中向内核注册file_operations
int button_init(void)
{
	major = register_chrdev(0,"100ask_button",&button_fops);
	return 0;
}
//有入口函数就需要注销函数
void button_exit(void)
{
	unregister_chrdev(major,"100ask_button");
}
//怎么把一个函数定义为入口函数,以及把一个函数定义为出口函数
module_init(button_init);
module_exit(button_exit);


.......(具体实现每个函数button_open、button_read)

异常与中断的概念及处理流程

  • ARM对异常(中断)的处理过程:
    (1)初始化:
    设置中断源,让它可以产生中断 -->设置中断控制器(屏蔽掉某些中断、优先级)–>设置CPU总开关
    (2)执行其他程序
    (3)产生中断
    (比如按下按键–>中断信号发送给中断控制器–>中断控制器又发送给CPU)
    (4)CPU每执行完一条指令,都会检查有无中断、异常产生
    (5)发现有异常/中断产生,开始处理,对于CPU来说对于不同的异常,跳去不同的地址执行程序,这些地址上,只是一条跳转指令,跳去执行某个函数
    (6)这些函数做的事情:
    处理如下:
    保存现场(各种寄存器)–>处理异常(中断也是一种特殊的异常):分辨中断源之后再根据中断源调用不同的函数–>恢复现场

学习资源(韦东山视频链接):http://dev.t-firefly.com/thread-100207-1-1.html

猜你喜欢

转载自blog.csdn.net/qq_43348528/article/details/103971511