当前位置: 首页 > news >正文

MTK system_server 卡死导致手机重启案例分析

05d4a90957f99f8afe6328405867a439.gif

和你一起终身学习,这里是程序员Android

经典好文推荐,通过阅读本文,您将收获以下知识点:

一、MTK AEE Log分析工具
二、AEE Log分析流程
三、system_server 卡死案例分析及解决

本文主要针对 Exception Type: system_server_watchdog , system_server卡死找出的分析以及解决方案。

一、MTK AEE Log分析工具

MTK AEE Log 获取方式:

程序员Android
回复 aee 即可获取解析重启db log的工具。

二、AEE Log分析流程

1. 使用AEE 工具解析 dbg 文件。

3c97631ef0c1e3120b01b15bb1d983d4.jpeg

使用解析db.fatal.02.SWT.dbg

059278b2f9d936e2bc90298da034bdc8.jpeg

AEE Log 解析出来的文件

2.分析解析出来的exp_main等文件

exp_main 文件会记录发生重启时候的 log 打印信息。

部分重启异常 Log信息如下:

$** *** *** *** *** *** *** *** Fatal *** *** *** *** *** *** *** **$
Build Info: 'alps-mp-o1.mp7:alps-mp-o1.mp7:mt6765:S01,ACE/AS0618/AS0618:8.1.0/O11019/1548123508:user/release-keys'
Flavor Info: 'None'
Exception Log Time:[Thu Mar 14 14:00:03 CST 2019] [38684.729626]Exception Class: SWT
Exception Type: system_server_watchdogCurrent Executing Process: 
system_serverTrigger time:[2019-03-14 14:00:03.711844] pid:1029Backtrace: 
Process: system_server
Subject: Blocked in handler on ActivityManager (ActivityManager)
Build: ACE/AS0618/AS0618:8.1.0/O11019/1548123508:user/release-keys

3.exp_main 文件解析

从开头的Log总体信息概览,我们可以看到 发生重启的时间类型触发重启的进程以及PID系统Blocked 的地方

结合exp_main以及 trace分析重启 Log
Log分析如下:

// 1.重启触发时间,以及PID 
Trigger time:[2019-03-14 14:00:03.711844] pid:1029
// 2.Blocked 的进程
Backtrace: 
Process: system_server
Subject: Blocked in handler on ActivityManager (ActivityManager)
// 3.根据PID 查看Trace信息
----- pid 1029 at 2019-03-14 13:59:58 -----
Cmd line: system_server... ...
// 4.根据Backtrace 查看Blocked的信息
"ActivityManager" prio=5 tid=11 Blocked... ...
// 5.tid=11 等待 tid=106的线程释放资源锁- waiting to lock <0x090691f3> (a android.util.ArrayMap) held by thread 106  
... ...// 6.查看tid = 106 持锁情况
"backup" prio=5 tid=106 Waiting
... ... at java.lang.Object.wait(Native method)- waiting on <0x06a44c62> (a com.android.server.am.ContentProviderRecord)
// 7.死锁卡住的地方at com.android.server.am.ActivityManagerService.getContentProviderImpl(ActivityManagerService.java:12127)- locked <0x06a44c62> (a com.android.server.am.ContentProviderRecord)...  ..."Binder:1029_8" prio=5 tid=107 Blocked
// 8.log中  tid=107 被 106 Blocked 进一步问题的加重at com.android.server.notification.RankingHelper.getRecord(RankingHelper.java:258)- waiting to lock <0x090691f3> (a android.util.ArrayMap) held by thread 106$** *** *** *** *** *** *** *** Fatal *** *** *** *** *** *** *** **$

6ff7d66b8c8ab5044555ace387ae42a7.jpeg

Log 分析大致过程截图

完整 log 请在公众号上获取

三、system_server 卡死案例分析及解决

通过 Log 找到卡死原因后,解决此问题。
需要修改ActivityManagerService类。

1.修改代码路径如下:alps/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

2.解决思路

避免 provider 长时间持锁触发MTK 60s 的SWT 重启机制,设置超时时间,超过时间就要释放资源锁,避免发生此问题。

3.diff 修改方案如下:

--- a/[alps/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java](http://192.168.11.104/gitweb/?p=alps-mp-o1.mp1-V1.git;a=blob;f=alps/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java;h=d5e2e1411f3698a829e997d402c7482ec277fa8c;hb=d5e2e1411f3698a829e997d402c7482ec277fa8c)+++ b/[alps/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java](http://192.168.11.104/gitweb/?p=alps-mp-o1.mp1-V1.git;a=blob;f=alps/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java;h=03208f78a2bf3167b4f0790019326e3939cc5444;hb=03208f78a2bf3167b4f0790019326e3939cc5444)@@ [-545,7](http://192.168.11.104/gitweb/?p=alps-mp-o1.mp1-V1.git;a=blob;f=alps/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java;h=d5e2e1411f3698a829e997d402c7482ec277fa8c;hb=d5e2e1411f3698a829e997d402c7482ec277fa8c#l545) [+545,9](http://192.168.11.104/gitweb/?p=alps-mp-o1.mp1-V1.git;a=blob;f=alps/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java;h=03208f78a2bf3167b4f0790019326e3939cc5444;hb=03208f78a2bf3167b4f0790019326e3939cc5444#l545) @@ public class ActivityManagerService extends IActivityManager.Stub// How long we wait for an attached process to publish its content providers// before we decide it must be hung.static final int CONTENT_PROVIDER_PUBLISH_TIMEOUT = 10*1000;-+    // How long we wait for provider to be notify before we decide it may be hung.+    static final int CONTENT_PROVIDER_WAIT_TIMEOUT = 20*1000;+       // How long we wait for a launched process to attach to the activity manager// before we decide it's never going to come up for real, when the process was// started with a wrapper for instrumentation (such as Valgrind) because it@@ [-1745,6](http://192.168.11.104/gitweb/?p=alps-mp-o1.mp1-V1.git;a=blob;f=alps/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java;h=d5e2e1411f3698a829e997d402c7482ec277fa8c;hb=d5e2e1411f3698a829e997d402c7482ec277fa8c#l1745) [+1747,7](http://192.168.11.104/gitweb/?p=alps-mp-o1.mp1-V1.git;a=blob;f=alps/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java;h=03208f78a2bf3167b4f0790019326e3939cc5444;hb=03208f78a2bf3167b4f0790019326e3939cc5444#l1747) @@ public class ActivityManagerService extends IActivityManager.Stubstatic final int PUSH_TEMP_WHITELIST_UI_MSG = 68;static final int SERVICE_FOREGROUND_CRASH_MSG = 69;static final int DISPATCH_OOM_ADJ_OBSERVER_MSG = 70;+        static final int CONTENT_PROVIDER_WAIT_TIMEOUT_MSG = 71;static final int START_USER_SWITCH_FG_MSG = 712;static final int NOTIFY_VR_KEYGUARD_MSG = 74;@@ [-2108,6](http://192.168.11.104/gitweb/?p=alps-mp-o1.mp1-V1.git;a=blob;f=alps/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java;h=d5e2e1411f3698a829e997d402c7482ec277fa8c;hb=d5e2e1411f3698a829e997d402c7482ec277fa8c#l2108) [+2111,12](http://192.168.11.104/gitweb/?p=alps-mp-o1.mp1-V1.git;a=blob;f=alps/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java;h=03208f78a2bf3167b4f0790019326e3939cc5444;hb=03208f78a2bf3167b4f0790019326e3939cc5444#l2111) @@ public class ActivityManagerService extends IActivityManager.Stubsynchronized (ActivityManagerService.this) {mActivityStarter.doPendingActivityLaunchesLocked(true);}+            } break;+                       case CONTENT_PROVIDER_WAIT_TIMEOUT_MSG: {+                ContentProviderRecord cpr = (ContentProviderRecord)msg.obj;+                synchronized (ActivityManagerService.this) {+                    processContentProviderWaitTimedOutLocked(cpr);+                }} break;case KILL_APPLICATION_MSG: {synchronized (ActivityManagerService.this) {@@ [-7029,7](http://192.168.11.104/gitweb/?p=alps-mp-o1.mp1-V1.git;a=blob;f=alps/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java;h=d5e2e1411f3698a829e997d402c7482ec277fa8c;hb=d5e2e1411f3698a829e997d402c7482ec277fa8c#l7029) [+7038,31](http://192.168.11.104/gitweb/?p=alps-mp-o1.mp1-V1.git;a=blob;f=alps/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java;h=03208f78a2bf3167b4f0790019326e3939cc5444;hb=03208f78a2bf3167b4f0790019326e3939cc5444#l7038) @@ public class ActivityManagerService extends IActivityManager.StubcleanupAppInLaunchingProvidersLocked(app, true);removeProcessLocked(app, false, true, "timeout publishing content providers");}+       +    @GuardedBy("this")+    private final void processContentProviderWaitTimedOutLocked(ContentProviderRecord cpr) {+        try {+            if (mLaunchingProviders.contains(cpr)) {+                if (DEBUG_MU) Slog.v(TAG_MU,+                    "Remove from mLaunchingProviders, " + cpr+                    + " launchingApp=" + cpr.launchingApp);+                mLaunchingProviders.remove(cpr);+            }+            if (DEBUG_MU) Slog.v(TAG_MU,+                "RemoveMessages CONTENT_PROVIDER_WAIT_TIMEOUT_MSG, " + cpr+                + " launchingApp=" + cpr.launchingApp);+            mHandler.removeMessages(CONTENT_PROVIDER_WAIT_TIMEOUT_MSG, cpr);+            synchronized (cpr) {+                cpr.notifyAll();+                cpr.launchingApp = null;+            }+        } catch (Exception e) {+            if (DEBUG_MU) Slog.v(TAG_MU,+                "processContentProviderWaitTimedOutLocked exception, " + e);+        }+    }+       private final void processStartTimedOutLocked(ProcessRecord app) {final int pid = app.pid;boolean gone = false;@@ [-12124,11](http://192.168.11.104/gitweb/?p=alps-mp-o1.mp1-V1.git;a=blob;f=alps/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java;h=d5e2e1411f3698a829e997d402c7482ec277fa8c;hb=d5e2e1411f3698a829e997d402c7482ec277fa8c#l12124) [+12157,33](http://192.168.11.104/gitweb/?p=alps-mp-o1.mp1-V1.git;a=blob;f=alps/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java;h=03208f78a2bf3167b4f0790019326e3939cc5444;hb=03208f78a2bf3167b4f0790019326e3939cc5444#l12157) @@ public class ActivityManagerService extends IActivityManager.Stubif (conn != null) {conn.waiting = true;}+                                       // add 20s wait timeout,avoid +                    if (!mHandler.hasMessages(CONTENT_PROVIDER_WAIT_TIMEOUT_MSG, cpr)) {+                        if (DEBUG_MU) Slog.v(TAG_MU,+                            "SendMessageDelayed CONTENT_PROVIDER_WAIT_TIMEOUT_MSG, " + cpr+                            + " launchingApp=" + cpr.launchingApp);+                        Message msg = mHandler.obtainMessage(CONTENT_PROVIDER_WAIT_TIMEOUT_MSG);+                        msg.obj = cpr;+                        mHandler.sendMessageDelayed(msg, CONTENT_PROVIDER_WAIT_TIMEOUT);+                    } else {+                        if (DEBUG_MU) Slog.v(TAG_MU,+                            "There is another waiting to start provider " + cpr+                            + " launchingApp=" + cpr.launchingApp+                            + ", not send CONTENT_PROVIDER_WAIT_TIMEOUT_MSG again");+                    }+                                       cpr.wait();} catch (InterruptedException ex) {} finally {if (conn != null) {conn.waiting = false;+                    }+                                       // remove wait time out message+                    if (mHandler.hasMessages(CONTENT_PROVIDER_WAIT_TIMEOUT_MSG, cpr)) {+                        if (DEBUG_MU) Slog.v(TAG_MU,+                            "After wait removeMessages CONTENT_PROVIDER_WAIT_TIMEOUT_MSG, "+                            + cpr + " launchingApp=" + cpr.launchingApp);+                            mHandler.removeMessages(CONTENT_PROVIDER_WAIT_TIMEOUT_MSG, cpr);}}}

参考文献:

【腾讯文档】Android Framework 知识库
https://docs.qq.com/doc/DSXBmSG9VbEROUXF5

友情推荐:

Android 开发干货集锦

至此,本篇已结束。转载网络的文章,小编觉得很优秀,欢迎点击阅读原文,支持原创作者,如有侵权,恳请联系小编删除,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!

f80dbf8b93884caa64fac37931f4cf35.jpeg

点击阅读原文,为大佬点赞!

相关文章:

MTK system_server 卡死导致手机重启案例分析

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: 一、MTK AEE Log分析工具二、AEE Log分析流程三、system_server 卡死案例分析及解决 本文主要针对 Exception Type: system_server_watchdog , system_…...

加强 Kubernetes 能力:利用 CRD 定义多版本资源的实现方式

姚灿武&#xff0c;Rancher 中国研发工程师&#xff0c;拥有 7 年云计算领域经验&#xff0c;热衷开源技术&#xff0c;在云原生相关技术领域拥有丰富的开发和实践经验。 CRD&#xff0c;即自定义资源定义&#xff08;Custom Resource Definition&#xff09;&#xff0c;是 Ku…...

区块链应用 DApp 开发需要掌握的技能

文章目录 前言为什么要开发 DAppDApp 的优势DApp 应用范围DApp 开发者技能 前言 前面区块链系列的文章中介绍了区块链技术、智能合约、web3js&#xff0c;Solidity 编程语言&#xff0c;在开发者的角度就是要基于这些知识在Web3时代去开发一个 DApp&#xff08;去中心化应用程…...

关于新版本selenium定位元素报错:‘WebDriver‘ object has no attribute ‘find_element_by_id‘等问题

由于一段时间没有使用Selenium&#xff0c;当再次使用时发现之前写的Selenium元素定位的代码运行之后会报错&#xff0c;发现是Selenium更新到新版本&#xff08;4.x版本&#xff09;后&#xff0c;以前的一些常用的代码的语法发生了改变&#xff0c;当然如果没有更新过或是下载…...

c++通过自然语言处理技术分析语音信号音高

对于语音信号的音高分析&#xff0c;可以使用基频提取技术。基频是指一个声音周期的重复率&#xff0c;也就是一个声音波形中最长的周期。 通常情况下&#xff0c;人的声音基频范围是85Hz到255Hz。根据语音信号的基频可以推断出其音高。 C中可以使用数字信号处理库或语音处理库…...

[pymc3][python]pymc3安装后测试代码2

测试环境&#xff1a; pymc33.11.2 代码&#xff1a; import numpy as np import pymc3 as pm import matplotlib.pyplot as pltif __name__ __main__:# 生成随机数据np.random.seed(123)x np.linspace(0, 1, 100)y 0.5 * x np.random.normal(0, 0.1, size100)# 定义概率…...

Go语言time库,时间和日期相关的操作方法

time库 用于处理时间、日期和时区的核心库。在实际开发中&#xff0c;常常需要与时间打交道&#xff0c;例如记录日志、处理时间差、计算时间间隔等等。因此&#xff0c;掌握time库的使用方法对于Go开发者来说非常重要。 在Go语言中&#xff0c;时间表示为time.Time类型&…...

JVM总结笔记

JVM JVM是什么?JVM 的主要组成部分JVM工作流程JVM内存模型直接内存与堆内存的区别&#xff1a;堆栈的区别Java会存在内存泄漏吗&#xff1f;简述Java垃圾回收机制垃圾收集算法轻GC(Minor GC)和重GC(Full GC)新生代gc流程JVM优化与JVM调优 JVM是什么? JVM是Java Virtual Mach…...

C++ 缓存再排序,解决多线程处理后的乱序问题,不知道思路对不对[挠下巴]

C 缓存再排序&#xff0c;解决多线程处理后的乱序问题&#xff0c;不知道思路对不对[挠下巴] 使用map默认会根据key排序的原理作缓存&#xff0c;队列满了依次推出&#xff0c;抛弃掉过时的数据 #include <functional> #include <iostream> #include <map> #…...

华为数通HCIA-地址分类及子网划分

ip地址&#xff08;逻辑地址&#xff09; 作用&#xff1a;唯一标识一张网卡 特点&#xff1a;设备天生没有&#xff0c;需要人为配置&#xff0c;可以随时修改 格式&#xff1a;点分十进制 大小&#xff1a;32bit 组成&#xff1a;网络位主机位 网络位&#xff1a;用于标…...

Linux第七章之gdb与makefile使用

一、Linux调试器-gdb使用 1.1背景 程序的发布方式有两种&#xff0c;debug模式和release模式Linux gcc/g出来的二进制程序&#xff0c;默认是release模式要使用gdb调试&#xff0c;必须在源代码生成二进制程序的时候, 加上-g 选项&#xff3b;重要&#xff3d; 1.2开始使用 …...

Mycat-Balance使用指南

MyCAT Balance是一个Java NIO的高性能负载均衡器&#xff0c;可以替代普通的硬件的交换机或其LVS类似的复杂机制&#xff0c;实现MyCAT集群的负载均衡。 MyCAT Balance的配置文件在conf目录下&#xff0c;frontend-conf.为前端配置&#xff0c;包括绑定的端口等&#xff0c;js…...

玩转顺序表——【数据结构】

在C语言学习中&#xff0c;我们经常会遇见增删查改等一系列操作&#xff0c;而这些操作全都与线性表关联&#xff0c;没有线性表将会对这些操作完成的十分艰难&#xff01;那今天就让我们来了解一下顺序表如何增删查改&#xff01;&#xff01;&#xff01; 目录 1.线性表 2…...

SSE(Server-Sent Events,服务器推送事件)和sockets(套接字)通信区别

SSE&#xff08;Server-Sent Events&#xff0c;服务器推送事件&#xff09;和sockets&#xff08;套接字&#xff09;都是用于实现实时通信的技术&#xff0c;但它们具有不同的特点和应用场景。 SSE 的优点&#xff1a; 简单易用&#xff1a;SSE 是基于HTTP协议的一种实时通…...

【设计模式——学习笔记】23种设计模式——代理模式Proxy(原理讲解+应用场景介绍+案例介绍+Java代码实现)

介绍 基础介绍 代理模式为一个对象提供一个代理对象&#xff0c;以控制对这个对象的访问。即通过代理对象访问目标对象&#xff0c;这样做的好处是&#xff1a;可以在不修改目标对象代码的基础上&#xff0c;增强额外的功能操作&#xff0c;即扩展目标对象的功能被代理的对象…...

大学英语四新视野 课后习题+答案翻译 Unit1~Unit8

Unit 1 Text A: Words in use 2022年6月16日 20:57 1 As the gender barriers crumbled, the number of women working as lawyers, doctors, or bankers began to increase significantly from the mid-20th century. 随着性别障碍的消除&#xff0c;从20世纪中期开始&am…...

Java入门指南:Java语言优势及其特点

目录 1. Java语言简介及发展概述 2. Java语言的优势 2.1 可移植性 2.2 面向对象 2.3 安全性 2.4 大量类库 3. Java语言与C/C的区别 4. 初识Java程序入口之main方法 5. 注释、标识符、关键字 5.1 注释 5.2 标识符 5.3 关键字 1. Java语言简介及发展概述 Java是一种面…...

Jenkins 节点该如何管理?

Jenkins 拥有分布式构建(在 Jenkins 的配置中叫做节点)&#xff0c;分布式构建能够让同一套代码在不同的环境(如&#xff1a;Windows 和 Linux 系统)中编译、测试等 Jenkins 的任务可以分布在不同的节点上运行 节点上需要配置 Java 运行时环境&#xff0c;JDK 版本大于 1.5 节…...

hugging face下载数据集

开始直接执行这个&#xff0c;下载下来的图片打不开 git clone https://huggingface.co/datasets/diffusers/dog-example 解决办法&#xff1a; 安装git lfs 1. curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash 2. sudo apt…...

解决Django报错 : No module named ‘MySQLdb‘

Django的版本是2.0&#xff0c;Python的版本号是3.6.4 在models.py创建好了模型类之后使用命令&#xff1a;python manage.py makemigrations 进行迁移&#xff0c;但是突然报错&#xff1a;ImportError:No module named MySQLdb 查询了相关资料发现python2.x版本是支持mysql…...

从DC到DCG:手把手教你搭建物理感知综合流程(含DEF文件处理避坑指南)

从DC到DCG&#xff1a;物理感知综合全流程实战指南 在28nm以下工艺节点&#xff0c;传统逻辑综合工具已难以应对复杂的物理效应。我们团队在最近一次5nm芯片项目中&#xff0c;由于初期忽视物理感知综合的约束设置&#xff0c;导致时序收敛多耗费三周时间。本文将分享从Design …...

如何在Zotero内部一站式管理所有插件:终极指南

如何在Zotero内部一站式管理所有插件&#xff1a;终极指南 【免费下载链接】zotero-addons Zotero Add-on Market | Zotero插件市场 | Browsing, installing, and reviewing plugins within Zotero 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-addons 还在为Zo…...

别让电源拖后腿!手把手教你用Sigrity PowerDC搞定PCB直流压降仿真(附HyperLynx SPD转换指南)

电源完整性实战&#xff1a;从零掌握Sigrity PowerDC直流压降仿真全流程 在高速PCB设计中&#xff0c;电源网络的稳定性往往决定了整个系统的可靠性。想象一下这样的场景&#xff1a;一款精心设计的硬件产品在实验室测试时频繁出现异常重启&#xff0c;经过两周的排查最终定位到…...

STM32多任务处理实战:从裸机调度到FreeRTOS应用详解

1. 项目概述与核心需求解析在嵌入式开发领域&#xff0c;尤其是基于STM32这类资源受限但功能强大的微控制器时&#xff0c;我们常常会遇到一个核心矛盾&#xff1a;硬件只有一个CPU核心&#xff0c;但软件功能却要求它“同时”处理多个任务。比如&#xff0c;一个智能温控器需要…...

【审计专栏-监督监管】【信息科学与工程学】计算机科学与自动化——第一百五十篇 招投标领域中的应用数学02

编号 033 维度 内容 编号​ 033 领域​ 招投标数学分析 类型​ 餐饮工程“食材价格虚高”与“供应链绑定”式合谋识别 招投标领域​ 团餐服务、食材集中采购、厨房设备采购 子领域​ 学校食堂承包、机关单位食堂外包、大型活动供餐、中央厨房建设 招投标的行业​ …...

手把手教你用eNSP模拟医院网络:从门诊到住院部的完整配置流程(含OSPF、VRRP、MSTP)

手把手教你用eNSP模拟医院网络&#xff1a;从门诊到住院部的完整配置流程&#xff08;含OSPF、VRRP、MSTP&#xff09; 医院网络作为医疗信息化的核心基础设施&#xff0c;其稳定性和高效性直接关系到医疗服务的质量。对于网络工程师而言&#xff0c;掌握医院网络的规划与配置技…...

LSTM时间序列预测实战:从数据预处理到模型调优全解析

1. 项目概述&#xff1a;当时间序列遇上LSTM在数据分析与预测的领域里&#xff0c;时间序列预测一直是个既经典又充满挑战的课题。无论是金融市场的股价波动、电商平台的销量起伏&#xff0c;还是工业设备的传感器读数、城市交通的流量变化&#xff0c;这些按时间顺序排列的数据…...

COMET终极指南:5个实用技巧掌握神经机器翻译质量评估框架 [特殊字符]

COMET终极指南&#xff1a;5个实用技巧掌握神经机器翻译质量评估框架 &#x1f680; 【免费下载链接】COMET A Neural Framework for MT Evaluation 项目地址: https://gitcode.com/gh_mirrors/com/COMET COMET&#xff08;A Neural Framework for MT Evaluation&#…...

HalloWing M0开发板:从Arduino到CircuitPython的嵌入式创意实践

1. 项目概述&#xff1a;为什么选择HalloWing M0作为你的创意引擎如果你和我一样&#xff0c;喜欢捣鼓些能发光、发声甚至能感知互动的电子小玩意儿&#xff0c;但又对那些密密麻麻的接线和复杂的底层寄存器配置感到头疼&#xff0c;那么Adafruit HalloWing M0开发板很可能就是…...

给娃规划信奥路?先看懂CSP-J/S初赛分数线背后的“地域密码”(2019-2024年数据解读)

解码CSP-J/S初赛分数线&#xff1a;家长必知的地域竞争策略&#xff08;2019-2024实战指南&#xff09; 当孩子第一次接触信息学奥赛时&#xff0c;大多数家长都会面临相似的困惑&#xff1a;为什么同样的分数在A省能轻松晋级&#xff0c;在B省却可能止步初赛&#xff1f;过去…...