指纹解锁流程分析

640?wx_fmt=gif

640?wx_fmt=gif

极力推荐Android 开发大总结文章:欢迎收藏

640?wx_fmt=other

本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:

1.解锁指纹,发送指纹中断Log

640?wx_fmt=other

1. 解锁指纹,发送指纹中断Log

kernel log中可以查看指纹发送的中断log信息,信息如下:

    Line 1747: 737[03-22 16:04:05.934] <4>[ 1206.056374] c0   174 <blestech_fp>[bf_eint_handler:785]++++irq_handler netlink send+++++,1,0
    Line 1748: 738[03-22 16:04:05.934] <4>[ 1206.056392] c0   174 <blestech_fp>[bf_send_netlink_msg:665]enter, send command 102
    Line 1749: 739[03-22 16:04:05.934] <4>[ 1206.056445] c0   174 <blestech_fp>[bf_send_netlink_msg:707]send done, data length is 32
    Line 1750: 740[03-22 16:04:05.934] <4>[ 1206.056458] c0   174 <blestech_fp>[bf_eint_handler:794]-----irq_handler netlink -----
    Line 1762: 752[03-22 16:04:05.935] <4>[ 1206.057683] c1   612 <blestech_fp>[bf_open:1023] Success to open device.
    Line 1763: 753[03-22 16:04:05.935] <4>[ 1206.057718] c1   612 <blestech_fp>[bf_ioctl:843]BF_IOCTL_ENABLE_INTERRUPT:  command,0

2. 认证指纹,计算指纹耗时

指纹解锁耗时计算16:04:05.934)到指纹认证成功(16:04:06.003)。指纹耗时=1003-934 = 96ms

system log中可以看到 指纹认证(onAuthenticated),以及认证成功(onAuthenticationSucceeded )

//指纹认证
00F359 03-22 16:04:06.002   715   715 V FingerprintService: onAuthenticated(owner=com.android.systemui, id=111, gp=0)
//指纹认证成功
00F35A 03-22 16:04:06.003   715   715 V FingerprintService:  onAuthenticationSucceeded by keyguard,may need send launchapp msg
00F35C 03-22 16:04:06.007   715   715 V FingerprintService: Done with client: com.android.systemui

3. 指纹认证成功,keyguard 响应解锁屏流程

指纹 认证成功后,system log 中可以查看到以下信息,Keyguard 开始解锁流程,流程如下:

00F35C 03-22 16:04:06.007   715   715 V FingerprintService: Done with client: com.android.systemui
// SystemUI 唤醒CPU
00F363 03-22 16:04:06.022   715  4341 I PowerManagerService: Waking up from sleep due tocom.android.systemui android.policy:FINGERPRINT (uid=10040 reason=android.policy:FINGERPRINT)...
00F364 03-22 16:04:06.022   715   715 W UsageStatsService: Event reported without a package name
00F36D 03-22 16:04:06.032   715   740 I DisplayPowerController: Blocking screen on until initial contents have been drawn.
//开始准备打开屏幕,进行唤醒操作
00F36E 03-22 16:04:06.032   715   740 I WindowManager: Screen turning on...
00F370 03-22 16:04:06.044   715   715 I WindowManager: Started waking up...
00F370 03-22 16:04:06.044   715   715 I WindowManager: Started waking up...
00F381 03-22 16:04:06.046   715  4341 D PowerManagerService: userActivityNoUpdateLocked: Scene not defined, event:0
00F383 03-22 16:04:06.047   715   738 I DisplayManagerService: Display device changed state: "Built-in Screen", ON
//广播队列添加亮屏广播
00F386 03-22 16:04:06.048   715   715 D BroadcastQueue: Add broadcast <BroadcastRecord{9e27478 u-1 android.intent.action.SCREEN_ON}> into [ordered | foreground], pending size 0

main logKeyguardViewMediator 这个调节器类开始进行亮屏时候是否显示锁屏界面等流程。notifyScreenOnkeyguardDone() 、handleHidekeyguardGoingAway


//keyguard 调节器通知screen on
00F372 03-22 16:04:06.045  1351  9065 D KeyguardViewMediator: notifyScreenOn
00F373 03-22 16:04:06.045   374   374 D PowerHAL: Enter power_set_interactive: 1
00F374 03-22 16:04:06.045  1351  9065 D KeyguardViewMediator: onStartedWakingUp, seq = 34
00F375 03-22 16:04:06.045  1351  9065 D KeyguardViewMediator: notifyStartedWakingUp
00F37D 03-22 16:04:06.046   374   374 D PowerHAL: ###Exit screen_off scene end###
00F37E 03-22 16:04:06.046   374   374 D PowerHAL: Exit power_set_interactive: 1
//keyguard 调节器执行完成
00F37F 03-22 16:04:06.046  1351  1351 D KeyguardViewMediator: keyguardDone()
00F3AE 03-22 16:04:06.057  1351  1351 D KeyguardViewMediator: handleNotifyScreenTurningOn
00F3BC 03-22 16:04:06.061  1351  1351 D KeyguardViewMediator: handleNotifyWakingUp
00F3BF 03-22 16:04:06.061  1351  1351 D KeyguardUpdateMonitor: FaceLock handleStartedWakingUp
00F458 03-22 16:04:06.077  1351  1351 V KeyguardUpdateMonitor: stopListeningForFaceLock()
//keyguard 结束并因此,开始进入Launcher
00F459 03-22 16:04:06.077  1351  1351 D KeyguardViewMediator: handleKeyguardDone
00F45A 03-22 16:04:06.077  1351  1351 D KeyguardViewMediator: handleHide
//keyguardGoingAway  等待下一个界面绘制完成
00F45B 03-22 16:04:06.077  1351  1351 D KeyguardViewMediator: keyguardGoingAway

4.keyguard 解锁结束,开启动Launcher至绘制工作

event log中可以看到keyguard 解锁结束后开始启动Launcher

//开启启动Launcher
00F466 03-22 16:04:06.079   715  2015 I am_set_resumed_activity: [0,com.android.launcher3/com.android.searchlauncher.SearchLauncher,resumeTopActivityInnerLocked]
00F48F 03-22 16:04:06.085   715  2015 I am_resume_activity: [0,77745185,3,com.android.launcher3/com.android.searchlauncher.SearchLauncher]

main log中可以看到Launcher 绘制完成。

//SurfaceFlinger 完成Launcher 绘制
00F54A 03-22 16:04:06.534  1351  1351 D KeyguardUpdateMonitor: handleBatteryUpdate
00F54D 03-22 16:04:06.535   380   380 D SurfaceFlinger: duplicate layer name: changing com.android.launcher3/com.android.searchlauncher.SearchLauncher to com.android.launcher3/com.android.searchlauncher.SearchLauncher#1

Launcher 绘制耗时计算Launcher绘制耗时计算=绘制完成(16:04:06.535)- 开始启动(16:04:06.079)=458ms(535ms-79ms)

5.Launcher 绘制完成,隐藏Keyguard

system log中可以看到Launcher 绘制完成后,keyguard收到回调,隐藏keygaurd

//keyguard收到回调,隐藏keygaurd
00F577 03-22 16:04:06.588  1351  1351 D KeyguardViewMediator: handleStartKeyguardExitAnimation startTime=1206710 fadeoutDuration=0
00F578 03-22 16:04:06.588  1351  1351 D KeyguardViewMediator: isSimPinOrPuk =false
00F579 03-22 16:04:06.588   715  6388 D WindowManager: mKeyguardDelegate.ShowListener.onDrawn.
// KeyguardDrawComplete 结束后并隐藏
00F57A 03-22 16:04:06.589   715   730 W WindowManager: Setting mKeyguardDrawComplete
00F592 03-22 16:04:06.604  1351  1351 V KeyguardDisplayManager: hide
//窗口焦点在 Launcher上
00F5BE 03-22 16:04:06.621   715  1590 D WindowManager: Input focus has changed to Window{3393c4a u0 com.android.launcher3/com.android.searchlauncher.SearchLauncher}
0

6.电量屏幕结束,统计亮屏时间

system log中搜索关键字 Screen on took, 即可查看总亮屏耗时。

总亮屏耗时798ms)= 亮屏结束Finished waking up(16:04:06.820)- 屏幕开始打开Screen turning on...(03-22 16:04:06.032)

// 绘制结束,显示所有窗口
00F68B 03-22 16:04:06.816   715   738 I WindowManager: All windows ready for display!
00F68C 03-22 16:04:06.817   715   730 W WindowManager: Setting mWindowManagerDrawComplete
00F692 03-22 16:04:06.819   715   730 D WindowManager: finishScreenTurningOn: mAwake=true, mScreenOnEarly=true, mScreenOnFully=false, mKeyguardDrawComplete=true, mWindowManagerDrawComplete=true
//结束亮屏流程,统计 亮屏时间
00F693 03-22 16:04:06.819   715   730 I WindowManager: Finished screen turning on...
00F695 03-22 16:04:06.819   715   740 I DisplayPowerController: Unblocked screen on after 787 ms
00F69A 03-22 16:04:06.820   715   740 W PowerManagerService: Screen on took 798 ms(now:1206942 mLastWakeTime:1206144)
//结束wake up 流程
00F69B 03-22 16:04:06.821   715   715 I WindowManager: Finished waking up...

640?wx_fmt=other

640?wx_fmt=other

长按识别二维码,领福利

至此,本篇已结束,如有不对的地方,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!

640?wx_fmt=other

如有侵权,请联系小编,小编对此深感抱歉,届时小编会删除文章,立即停止侵权行为,请您多多包涵。

640?wx_fmt=other

小礼物走一走,来简书关注我

<think>好的,我现在需要回答用户关于FreeRTOS中多个任务之间如何操作的问题。用户提到指纹解锁后控制屏幕显示或步进电机转动,这些任务之间是如何协调的。我需要先回忆FreeRTOS的任务调度机制和相关通信方法。 首先,FreeRTOS是实时操作系统,任务之间需要同步和通信。常见的机制有队列、信号量、任务通知、事件组等。用户提到的场景可能涉及到任务间的触发和数据传递。例如,指纹解锁任务完成后需要通知屏幕任务更新显示,或者发送指令给电机控制任务。 接下来要考虑任务划分。指纹识别可能是一个独立任务,解锁成功后如何触发其他任务。可能需要使用队列发送消息,或者使用信号量来通知。比如,指纹任务完成后释放一个二值信号量,屏幕任务等待该信号量,一旦获取到就执行显示操作。 对于步进电机的控制,可能需要精确的时序,所以电机任务应该有较高的优先级。同时,如果电机动作需要参数,比如转动角度,可以通过队列传递数据。这样指纹任务发送角度数据到队列,电机任务接收并执行。 还要注意资源保护,比如共享资源(如SPI总线或屏幕缓冲区)需要使用互斥量来防止冲突。例如,多个任务同时访问屏幕时,互斥量确保一次只有一个任务写入。 另外,事件组可能用于多个事件的同时等待。比如屏幕任务需要等待指纹解锁成功和网络连接成功两个事件,事件组可以同时检查这两个标志位。 可能还需要考虑任务优先级,确保高优先级任务及时响应。例如,电机控制需要实时性,优先级应高于屏幕更新。但需注意优先级反转问题,使用互斥量的优先级继承特性来避免。 最后,确保所有通信机制正确初始化,任务创建时分配合理的堆栈大小,避免溢出。调试时可以使用FreeRTOS的跟踪功能,检查任务状态和资源使用情况。 总结步骤:任务划分、选择通信机制(信号量、队列等)、处理共享资源、设置优先级、测试调试。需要具体说明每种机制的应用场景,并结合用户例子详细说明。</think>在FreeRTOS中,多个任务通过以下核心机制协同工作,以指纹解锁后控制屏幕和步进电机为例: $$任务划分原则$$ 1. **指纹识别任务**:轮询或中断触发 2. **屏幕控制任务**:响应显示更新 3. **电机控制任务**:执行精密运动 4. **系统监控任务**(可选):协调全局状态 $$关键通信方式$$ 一、**事件驱动架构** - 使用`xEventGroup`实现跨任务事件传递 ```c // 创建事件组 EventGroupHandle_t xUnlockEvent = xEventGroupCreate(); // 指纹任务解锁成功后 xEventGroupSetBits(xUnlockEvent, UNLOCK_SUCCESS_BIT); // 屏幕任务等待事件 xEventGroupWaitBits(xUnlockEvent, UNLOCK_SUCCESS_BIT, pdTRUE, // 清除事件标志 pdFALSE, // 不需要所有位 portMAX_DELAY); ``` 二、**消息队列传输** - 通过`xQueueSend()`传递电机控制参数 ```c // 定义电机控制结构体 typedef struct { uint16_t angle; uint8_t speed; } MotorCmd_t; // 创建队列 QueueHandle_t xMotorQueue = xQueueCreate(5, sizeof(MotorCmd_t)); // 指纹任务发送指令 MotorCmd_t cmd = {.angle=90, .speed=50}; xQueueSend(xMotorQueue, &cmd, pdMS_TO_TICKS(100)); // 电机任务接收指令 MotorCmd_t receivedCmd; xQueueReceive(xMotorQueue, &receivedCmd, portMAX_DELAY); ``` 三、**优先级控制** 1. 电机任务优先级 > 屏幕任务 > 指纹任务 2. 使用`vTaskPrioritySet()`动态调整优先级 ```c // 紧急情况提升电机任务优先级 vTaskPrioritySet(xMotorTaskHandle, HIGH_PRIORITY); ``` 四、**资源保护** - 屏幕访问使用互斥量 ```c SemaphoreHandle_t xScreenMutex = xSemaphoreCreateMutex(); // 写屏前获取锁 if(xSemaphoreTake(xScreenMutex, pdMS_TO_TICKS(100)) == pdTRUE){ // 执行屏幕操作 xSemaphoreGive(xScreenMutex); } ``` $$典型工作流程$$ 1. 指纹任务通过中断唤醒 2. 验证成功后: - 设置事件组标志 - 发送电机参数到队列 3. 屏幕任务检测到事件标志后: - 获取屏幕互斥量 - 更新UI显示 4. 电机任务收到队列数据后: - 执行步进电机控制算法 - 通过PWM输出驱动电机 $$优化策略$$ 1. 使用**流缓冲区**传输大尺寸显示数据 2. **任务通知**实现快速轻量级同步 ```c // 直接通知屏幕任务 xTaskNotify(xScreenTaskHandle, DISPLAY_UPDATE_CMD, eSetValueWithOverwrite); ``` 3. 为电机任务配置**独立定时器**保证时序精度 建议结合硬件特性选择机制: - 对时间敏感操作(如电机)使用中断+任务通知 - 大数据传输(如图片)使用流缓冲区 - 多条件触发使用事件组组合判断 实际开发中需注意: 1. 严格计算任务堆栈深度 2. 优先级设置避免反转 3. 关键操作添加看门狗监控 4. 使用Tracealyzer工具分析任务交互
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员Android

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值