笔记【1】
今天晚上闲着蛋疼又看了看内核,想做点优化,然后去看了sultan家的commit。
sultan是谁?
需要:
C语言知识;
计算机知识;
今天翻看到sultan为某手机指纹做了一个中断的实例,我也针对自己手机的代码重写了一份。
对于指纹,我们非常希望它能在息屏的手机里高速响应,因为我们要解锁。
因此我们直接分析我修改了什么代码。
在goodix的指纹(9se)当中。
drivers/input/fingerprint/goodix_fod/gf_spi.c
static void drm_state_callback_worker(struct work_struct *work)
{
//...
if (!gf_dev->device_available)
return;
//...
char temp[0] = gf_dev->fb_black ?
GF_NET_EVENT_FB_BLACK : GF_NET_EVENT_FB_UNBLACK;
sendnlmsg(&temp);
}
//...
}
static int goodix_fb_state_chg_callback(struct notifier_block *nb,
unsigned long val, void *data)
{
struct gf_dev *gf_dev;
//...
unsigned int blank;
//...
blank = *(int *)(evdata->data);
switch (blank) {
case DRM_BLANK_POWERDOWN:
if (gf_dev->device_available == 1) {
gf_dev->fb_black = 1;
gf_dev->wait_finger_down = true;
//...
case DRM_BLANK_UNBLANK:
if (gf_dev->device_available == 1) {
gf_dev->fb_black = 0;
//...
default:
pr_debug("%s defalut\n", __func__);
break;
}
//...
sultan 把上面这一段全是switch case语句全删掉了,然后单独封装了新的函数叫drm_state_callback_worker
接着往下看
blank = *(int *)(evdata->data);
switch (blank) {
case DRM_BLANK_POWERDOWN:
gf_dev->fb_black = 1;
gf_dev->wait_finger_down = true;
/*获取fb_work在工作队列中的地址,送给workqueue执行任务*/
schedule_work(&gf_dev->fb_work);
break;
case DRM_BLANK_UNBLANK:
gf_dev->fb_black = 0;
schedule_work(&gf_dev->fb_work);
break;
//...
#if defined(CONFIG_FB)
/* 初始化一个工作,关键是初始化该工作的执行函数 */
INIT_WORK(&gf_dev->fb_work, drm_state_callback_worker);
还有在drivers/input/fingerprint/goodix_fod/gf_spi.h的gf_dev结构体中加入work_struct的实例
struct gf_dev {
//...
+ #if defined(CONFIG_FB)
+ struct work_struct fb_work;
//...
在case中,我们发现了多了schedule_work();
函数,他通常用来执行workstruct的一个具体任务,中断通过调用schedule_work()
来通知内核工作队列线程。还有INIT_WORK(&workstruct, func);
,通过INIT_WORK()将work_struct与func建立起来.
在内核中断处理中,经常用到工作队列WQ(workqueue),这样便能缩短中断处理时的时间
什么是中断:
中断 指 处理微处理器在执行某段程序的过程中,由于某种原因,暂时中止原程序的执行,转去执行相应的处理程序,执行完再回来继续执行原程序的过程。
例如: 你本来在看书,突然尿急,撒尿后继续看书。
那么,当你使用指纹的时候,上面段代码就开始在中断的下半部分工作了,在指纹触摸到屏幕亮起这段时期,CPU会有很多的驱动进程活动,例如sound,震动,光传感器之类的,不只是指纹。在内核里,那么我们用一个中断,可以把指纹解锁的中断的工作队列提前,让别的驱动进程靠后,节约资源。这样亮屏就会快一点(非感知),然后再让其他进程按顺序在CPU中异步工作。
当然,撒尿这个过程其实会被更高优先级的中断进程而中断。。。
不过常有的事是,用户不会刷,用户觉得这些优化比不上官核🤬…
💔⭐看到这儿还是认为第三方内核不如官核的可以关闭网页了⭐💔
毕竟我还没进行测试,因此没有任何说服力,改天试一试谷歌安卓simpleperf这样的性能评估的工具,检测屏幕抖动。
参考文章
[1].带您进入内核开发的大门 | 内核中的工作队列. 知乎. https://zhuanlan.zhihu.com/p/60905711
[2].INIT_WORK()工作队列使用 . 腾讯云. https://cloud.tencent.com/developer/article/1350770
[3].嵌入式系统中断怎么解释. 知乎 .https://www.zhihu.com/question/389467738/answer/1524895659