Android uevent

Android的uevent通信机制及编程实现 当设备的状态发生变化时,例如设备的插拔、属性改变等,内核会生成一个uevent事件,并通过uevent通信机制将这个事件发送给用户空间。用户空间的应用程序可以通过监听uevent事件来获取设备的状态变化,并做出相应的处理。当设备的状态发生变化时,例如设备的插拔,应用程序将收到相应的uevent事件,并可以根据需要进行处理。在实际开发中,建议进行必要的错误处理和异常处理,以确保应用程序的稳定性和可靠性。其中,"ACTION"表示事件的类型,"add"表示设备被添加;方法中,可以处理收到的uevent事件。 阅读详情

http://www.cnblogs.com/qclzdh/archive/2011/06/13/2080166.html

 

一、Android uevent架构
 
    Android很多事件都是通过uevent跟kernel来异步通信的。其中类UEventObserver是核心。
    UEventObserver接收kernel的uevent信息的抽象类。
  
    1、server层代码
      1)battery server:
      frameworks/frameworks/base/services/java/com/android/server/SystemServer.java
    frameworks/frameworks/base/services/java/com/android/server/BatteryService.java
      
    2、java层代码
       frameworks/base/core/java/android/os/UEventObserver.java
   
    3、JNI层代码
       frameworks/base/core/jni/android_os_UEventObserver.cpp
   
    4、底层代码
       hardware/libhardware_legacy/uevent/uevent.c
       读写kernel的接口socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);
   
二、UEventObserver的使用

    类UEventObserver提供了三个接口给子类来调用:
    1、onUEvent(UEvent event)
       子类必须重写这个onUEvent来处理uevent。
    2、startObserving(String match)
       启动进程,要提供一个字符串参数。
    3、stopObserving()
       停止进程。
    
    例子:
     //在BatteryService.java中
     mUEventObserver.startObserving("SUBSYSTEM=power_supply");
     private UEventObserver mUEventObserver = new UEventObserver() {
        @Override
        public void onUEvent(UEventObserver.UEvent event) {
            update();
        }
     };
     在UEvent thread中会不停调用 update()方法,来更新电池的信息数据。
 
三、vold server分析
  
    1、在system/vold/NetlinkManager.cpp中:
    if ((mSock = socket(PF_NETLINK,SOCK_DGRAM,NETLINK_KOBJECT_UEVENT)) < 0) {
        SLOGE("Unable to create uevent socket: %s", strerror(errno));
        return -1;
    }
    if (setsockopt(mSock, SOL_SOCKET, SO_RCVBUFFORCE, &sz, sizeof(sz)) < 0) {
        SLOGE("Unable to set uevent socket options: %s", strerror(errno));
        return -1;
    }
    if (bind(mSock, (struct sockaddr *) &nladdr, sizeof(nladdr)) < 0) {
        SLOGE("Unable to bind uevent socket: %s", strerror(errno));
        return -1;
    }
  
    2、然后在system/vold/NetlinkHandler.cpp的NetlinkHandler::onEvent中处理 
       void NetlinkHandler::onEvent(NetlinkEvent *evt) {
           VolumeManager *vm = VolumeManager::Instance();
           const char *subsys = evt->getSubsystem();
           if (!subsys) {
              SLOGW("No subsystem found in netlink event");
              return;
           }
           if (!strcmp(subsys, "block")) {
              vm->handleBlockEvent(evt);
           } else if (!strcmp(subsys, "switch")) {
              vm->handleSwitchEvent(evt);
           } else if (!strcmp(subsys, "battery")) {
           } else if (!strcmp(subsys, "power_supply")) {
           }
       }

    3、在system/core/libsysutils/src/NetlinkListener.cpp中监听。
   
    
四、battery server分析
 
  java代码:
   frameworks/frameworks/base/services/java/com/android/server/BatteryService.java
  
  JNI代码:
   frameworks/base/services/jni/com_android_server_BatteryService.cpp
 
  1、BatteryService是跑在system_process当中,在系统初始化的时候启动,如下
    在BatteryService.java中:
    Log.i(TAG, “Starting Battery Service.”);
    BatteryService battery = new BatteryService(context);
    ServiceManager.addService(“battery”, battery);
  
  2、数据来源
    BatteryService通过JNI(com_android_server_BatteryService.cpp)读取数据。
    BatteryService通过JNI注册的不仅有函数,还有变量。 如下:
    //##############在BatteryService.java中声明的变量################
    private boolean mAcOnline;
    private boolean mUsbOnline;
    private int mBatteryStatus;
    private int mBatteryHealth;
    private boolean mBatteryPresent;
    private int mBatteryLevel;
    private int mBatteryVoltage;
    private int mBatteryTemperature;
    private String mBatteryTechnology;
   //在BatteryService.java中声明的变量,在com_android_server_BatteryService.cpp中共
   用,即在com_android_server_BatteryService.cpp中其实操作的也是BatteryService.java中声
   明的变量。
   gFieldIds.mAcOnline = env->GetFieldID(clazz, “mAcOnline”, “Z”);
   gFieldIds.mUsbOnline = env->GetFieldID(clazz, “mUsbOnline”, “Z”);
   gFieldIds.mBatteryStatus = env->GetFieldID(clazz, “mBatteryStatus”, “I”);
   gFieldIds.mBatteryHealth = env->GetFieldID(clazz, “mBatteryHealth”, “I”);
   gFieldIds.mBatteryPresent = env->GetFieldID(clazz, “mBatteryPresent”, “Z”);
   gFieldIds.mBatteryLevel = env->GetFieldID(clazz, “mBatteryLevel”, “I”);
   gFieldIds.mBatteryTechnology = env->GetFieldID(clazz, “mBatteryTechnology”,
                                                     “Ljava/lang/String;”);
   gFieldIds.mBatteryVoltage = env->GetFieldID(clazz, “mBatteryVoltage”, “I”);
   gFieldIds.mBatteryTemperature = env->GetFieldID(clazz, “mBatteryTemperature”,
                                                                        “I”);
   //上面这些变量的值,对应是从下面的文件中读取的,一只文件存储一个数值。
   #define AC_ONLINE_PATH “/sys/class/power_supply/ac/online”
   #define USB_ONLINE_PATH “/sys/class/power_supply/usb/online”
   #define BATTERY_STATUS_PATH “/sys/class/power_supply/battery/status”
   #define BATTERY_HEALTH_PATH “/sys/class/power_supply/battery/health”
   #define BATTERY_PRESENT_PATH “/sys/class/power_supply/battery/present”
   #define BATTERY_CAPACITY_PATH “/sys/class/power_supply/battery/capacity”
   #define BATTERY_VOLTAGE_PATH “/sys/class/power_supply/battery/batt_vol”
   #define BATTERY_TEMPERATURE_PATH “/sys/class/power_supply/battery/batt_temp”
   #define BATTERY_TECHNOLOGY_PATH “/sys/class/power_supply/battery/technology”
  
  3、数据传送

    BatteryService主动把数据传送给所关心的应用程序,所有的电池的信息数据是通过Intent传送出去
    的。
    在BatteryService.java中,Code如下:
    Intent intent = new Intent(Intent.ACTION_BATTERY_CHANGED);
    intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
    intent.putExtra(“status”, mBatteryStatus);
    intent.putExtra(“health”, mBatteryHealth);
    intent.putExtra(“present”, mBatteryPresent);
    intent.putExtra(“level”, mBatteryLevel);
    intent.putExtra(“scale”, BATTERY_SCALE);
    intent.putExtra(“icon-small”, icon);
    intent.putExtra(“plugged”, mPlugType);
    intent.putExtra(“voltage”, mBatteryVoltage);
    intent.putExtra(“temperature”, mBatteryTemperature);
    intent.putExtra(“technology”, mBatteryTechnology);
    ActivityManagerNative.broadcastStickyIntent(intent, null);
 
  4、数据接收

    应用如果想要接收到BatteryService发送出来的电池信息,
    则需要注册一个Intent为Intent.ACTION_BATTERY_CHANGED的BroadcastReceiver。
    注册方法如下:
    IntentFilter mIntentFilter = new IntentFilter();
    mIntentFilter.addAction(Intent.ACTION_BATTERY_CHANGED);
    registerReceiver(mIntentReceiver, mIntentFilter);
    private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
      @Override
      public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        String action = intent.getAction();
        if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {
          int nVoltage = intent.getIntExtra(“voltage”, 0);
          if(nVoltage!=0){
            mVoltage.setText(“V: ” + nVoltage + “mV – Success…”);
          }
          else{
            mVoltage.setText(“V: ” + nVoltage + “mV – fail…”);
          }
        }
      }
    };
 
  5、数据更新

    电池的信息会随着时间不停变化,自然地,就需要考虑如何实时的更新电池的数据信息。在
    BatteryService启动的时候,会同时通过UEventObserver启动一个onUEvent Thread。每一个
    Process最多只能有一个onUEvent Thread,即使这个Process中有多个UEventObserver的实例。
    当在一个Process中,第一次Call startObserving()方法后,这个UEvent thread就启动了。
    而一旦这个UEvent thread启动之后,就不会停止。
 
    //在BatteryService.java中
    mUEventObserver.startObserving(“SUBSYSTEM=power_supply”);
    private UEventObserver mUEventObserver = new UEventObserver() {
      @Override
      public void onUEvent(UEventObserver.UEvent event) {
        update();
      }
    };

    在UEvent thread中会不停调用 update()方法,来更新电池的信息数据。
 
《YOLO26/YOLO11/YOLOv8改进与系统实战》,改进与系统实战专栏目录和介绍 YOLOv8 是目前比较火和比较成熟的深度学习框架,是2023年1月发布的,由 Ultralytics 团队开发。Ultralytics自YOLOv5 开始一直积极维护和更新 YOLO 框架,因此 YOLOv8 也享有持续的维护与升级支持。因此我写下《手把手教你YOLOv8实战》专栏,专门为那些对计算机视觉、深度学习、以及目标检测技术感兴趣的读者设计。通过本专栏,你将深入理解 YOLOv8 的核心原理与实际应用,从0 开始学习并掌握如何使用 YOLOv8 完成各类目标检测任务,帮助你快速上手并掌握 YOLO 阅读详情

相关推荐

grpc安装与简单demo测试

grpc安装: 由于工作需要,最近在学google的rpc开源框架;由于本人菜鸟一枚,而且是从Windows开发转到Linux;由于之前版本控制使用的是svn,没有使用过git,所以从GitHub上下载代码是通过浏览器下载zip格式的压缩文件,折腾了好几天了,发现了各种坑,各种缺少库,各种不知道怎么把这个库给装机器上。对于一个不熟悉Linux的人来说,这个体验简直糟糕透了。没办法了又在机器上装了...

old__captain的博客 4833

android uevent机制,android & Linux uevent机制

Linux uevent机制Uevent是内核通知android有状态变化的一种方法,比如USB线插入、拔出,电池电量变化等等。其本质是内核发送(可以通过socket)一个字符串,应用层(android)接收并解释该字符串,获取相应信息。一、Kernel侧:UEVENT的发起在Kernel端,主要是通过函数int kobject_uevent_env(struct kobject *kobj, e...

weixin_39858298的博客 1023

超详细YOLOv8姿态检测全程概述:环境、训练、验证与预测详解

本篇博客详细介绍了使用YOLOv8-pose进行姿态估计的全过程,包括不同版本模型的性能比较、训练与验证步骤,以及预测代码的实现。它对模型参数、训练过程和输出结果进行了解释,同时提供了详细的配置文件示例和标签数据格式说明。此外,还演示了如何使用预训练模型进行图像预测,并如何处理和理解预测结果。最后,它还讨论了如何评估和比较不同模型的性能。如果有哪里写的不够清晰,小伙伴本可以给评论或者留言,我这边会尽快的优化博文内容,另外如有需要,我这边可支持技术答疑与支持。

CDBmax的博客 3万+

android uevent

Uevent是内核通知android有状态变化的一种方法,比如USB线插入、拔出,电池电量变化等等。其本质是内核发送(可以通过socket)一个字符串,应用层(android)接收并解释该字符串,获取相应信息。一、Kernel侧UEVENT的发起在Kernel端,主要是通过函数 int kobject_uevent_env(struct kobject *kobj, enum kobject_ac

☆ 默默地牛逼着 2400

winget安装提示:执行此命令时发生意外错误: InternetOpenUrl() failed. 0x80072efd

当我们使用Winget包管理器安装应用,提示错误:执行此命令时发生意外错误: InternetOpenUrl() failed. 0x80072efd 该怎么处理呢?请听我娓娓道来。

Linux I Tell U 8136

CUBEMX ADC 单/多通道+DMA

本文使用的是STM3F103C8T6 Cubemx进行单/多通道DMA配置。

记录学习 1403

android-uevent 简记

简述 sysfs 是 Linux userspace 和 kernel 进行交互的一个媒介。通过 sysfs,userspace 可以主动去读写 kernel 的一些数据,同样的, kernel 也可以主动将一些“变化”告知给 userspace。也就是说,通过sysfs,userspace 和 kernel 的交互,本质上是双向的。 userspace 通过 sysfs 访问 ker

颇锐克(公众号:颇锐克科技共享) 6234

2.1 amdgpu BO的类型和用途

AMDGPU驱动中,amdgpu_bo_create_user和amdgpu_bo_create_kernel分别用于创建用户空间和内核空间的buffer对象(BO)。用户空间BO支持元数据、tiling flags等属性,由GEM handle管理生命周期;内核BO则用于驱动内部资源如ringbuffer,自动pin并可选CPU映射。二者在返回类型、生命周期管理和使用场景上存在根本差异,前者面向图形渲染/AI等应用,后者服务于驱动内部任务。

图形/计算GPU的驱动与虚拟化技术分享园地 2201

android uevent机制,安卓linux uevent内核上报机制实例

uevent可以实现内核通知上层的一种机制,最常见的电池状态的变化就是kernel uevent通知的,每次百分比或者其他的变化通过power_supply_changed通知上层update;每个device下面都有kobj,找到device就可以通过kobject_uevent_env 通知android了;以拔出T卡为例,内核通知上层。这里的T卡是一种sdio设备,普通TF卡是块设备,安卓通...

weixin_29189363的博客 766

YOLOv11改进 | Conv改进篇 | 含2种改进,引入DynamicConv替换普通Conv卷积下采样和C3k2_DynamicConv替换C3k2(来自CVPR2024)

本文提出了一种基于DynamicConv动态卷积优化的YOLOv11轻量化模型改进方案。通过引入多专家机制的动态卷积模块,在增加模型参数量的同时保持较低的计算复杂度(FLOPs),有效解决了低FLOPs模型在大规模预训练中的性能瓶颈问题。文章详细介绍了动态卷积的工作原理、核心代码实现,并提供了在YOLOv11中集成DynamicConv和C3k2_GhostModule_DynamicConv模块的完整教程,包括模块添加、配置文件修改和模型训练验证过程。实验结果表明,该方案在保持高效推理速度的同时显著提升了

Ai缝合怪、助力小伙伴高效发论文 537

机器学习项目实战案例数据集

本专栏整理了《机器学习项目实战案例》,内包含了各种不同的机器学习项目,包含项目原理以及源码,每一个项目实例都附带有完整的代码+数据集。

优快云 精品推荐 3635

Android P Uevent机制分析

Uevent是Android内核与用户进程进行通信的一种方式,其本质是通过netlink(通过socket)发送消息给用户进程。 本文讲一个大概的流程,只分析通信的一个过程,不深入解析具体的数据结构和传递的参数。 关于netlink socket的通信,请参考: https://mp.youkuaiyun.com/mdeditor/89635302# 一、Kernel发送 Uevent是在kernel中发送出...

Sunxiaolin2016的博客 3090

22、狭义相对论与曲线坐标空间相关知识解析

本文深入解析了狭义相对论与曲线坐标空间的核心概念,涵盖能量-动量张量的定义与守恒、曲线坐标系下的度量张量与基向量性质、协变与逆变张量的变换规则,并介绍了克里斯托费尔符号与协变导数的计算方法。进一步探讨了在弯曲空间中进行微积分运算的基础理论及其在广义相对论中的关键应用,如爱因斯坦场方程如何描述物质-能量对时空曲率的影响,为理解黑洞等引力现象提供了理论框架。

lambda的博客 115

Android UEvent事件分析

众所周知,在安卓系统中有状态栏,在插入外设的时候,会在顶部状态栏显示小图标。比如,camera设备,耳机设备,U盘,以及电池等等。这些都需要在状态栏动态显示。从上面这张图片可以看出这些设备都有自己的服务一直在跑,并且都是继承了UEventObserver.java这个类去获取kernel的Event事件。下面将着重分析UEventObserver是如何去监听kernel的Event事件。

Jimmy的专栏 1547

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

android 关于 netlink uevent

用户空间 system/core/libcutils/uevent.c int uevent_open_socket(int buf_sz, bool passcred) {     struct sockaddr_nl addr;     int on = passcred;     int s;     memset(&addr, 0, sizeof(addr));

xiayu98020214的专栏 2999

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

android UEvent剖析

Uevent是内核通知android有状态变化的一种方法,比如USB线插入、拔出,电池电量变化等等。其本质是内核发送(可以通过socket)一个字符串,应用层(android)接收并解释该字符串,获取相应信息。 一、Kernel 部分: UEVENT的发起在Kernel端,主要是通过函数 int kobject_uevent_env(struct kobject *k

成长的味道 1183

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Android UEvent事件分析之adb调试UEvent事件

该程序没有自动编译到系统中,需要单独编译。详见:https://blog.youkuaiyun.com/u014135607/article/details/78545319。从Android.mk中,会生成名为”uevents”的应用程序。当然也可以将事件打印到log中。需要添加服务启动、服务上下文、权限和log打印等内容。编译完成后,可以编译成system/bin/uevents的可执行程序。我们就可以查看uevent事件上报了。3,执行uevents应用程序。

Jimmy的专栏 1431

Android Uevent 分析,从kernel到framework

Uevent是内核通知android有状态变化的一种方法,比如USB线插入、拔出,电池电量变化等等。其本质是内核发送(可以通过socket)一个字符串,应用层(android)接收并解释该字符串,获取相应信息。 一、Kernel侧: UEVENT的发起在Kernel端,主要是通过函数 int kobject_uevent_env(struct kobject *kobj, enum kobj

小贼哥的技术花园 2万+

android uevent_open_socket,android 6.0 healthd vold接收uevent

之前我们分析过了ueventd处理uevent事件,这篇博客我们看下healthd和vold是如何接受相关的uevent事件的。一、healthd接受uevent下面是heathd的主函数int main(int argc, char **argv) {int ch;int ret;klog_set_level(KLOG_LEVEL);healthd_mode_ops = &android...

weixin_39625468的博客 431

Android 监听UEvent事件

Android在源码目录:system/extras/tests/uevents/中,可以监听底层UEvent事件上报的程序,可以通过adb shell,输入uenvets可以查看上报事件,其实现如下:  一、源码实现  uevent.c /* * Copyright (C) 2012 The Android Open Source Project * * Licensed under th...

Jimmy的专栏 1959

Android uevent 一

Android Uevent 分析,从kernel到framework Uevent是内核通知android有状态变化的一种方法,比如USB线插入、拔出,电池电量变化等等。其本质是内核发送(可以通过socket)一个字符串,应用层(android)接收并解释该字符串,获取相应信息。 一、Kernel侧: UEVENT的发起在Kernel端,主要是通过函数

Fybon的专栏 892

Android uevent二

一、Android uevent架构       Android很多事件都是通过uevent跟kernel来异步通信的。其中类UEventObserver是核心。     UEventObserver接收kernel的uevent信息的抽象类。        1、server层代码       1)battery server:       frameworks/framew

Fybon的专栏 1051

Android监听UEvent事件的测试程序

Android在源码目录:system/extras/tests/uevents/中,可以监听底层UEvent事件上报的程序,其实现如下: 一、源码实现 uevent.c/* * Copyright (C) 2012 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the ...

编程菜鸟进阶之路 3637
上一篇: 中断和异常
下一篇: Android应用程序键盘(Keyboard)消息处理机制分析
gracioushe
博客等级 码龄25年 62粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值