Android uevent

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

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


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()方法,来更新电池的信息数据。


MedicalNet实战:3D医疗影像分割从零到部署(PyTorch+ResNet50) 本文详细介绍了基于PyTorch和MedicalNet预训练模型进行3D医疗影像分割的完整实战流程。通过加载ResNet50预训练权重进行迁移学习,大幅降低了对标注数据量的需求,并提升了模型性能。文章涵盖了从数据准备、模型微调、训练优化到最终部署的每一步,为医疗AI开发者提供了从零到部署的清晰指南。 阅读详情

相关推荐

深入理解HanLP1.x,填平可能遇到的坑

提取指定数量的摘要。自定义词典为什么要单独领出来讲呢?因为在我们的业务开发中,可能分词的效果并不理想,需要定制自己的词库,索引更加常用。例如:小米su7特斯拉modelY比亚042025款6575767670908我们需要分出小米su72025款等词。我们分别看看用字典和不用字典的效果。

static_coder的博客 977

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

黏菌算法(Slime Mould Algorithm,SMA)

这是一篇关于黏菌算法的总结博客,包含算法思想,算法步骤,求函数最值(Python实现),算法改进等,持续更新ing

weixin_46838605的博客 1万+

android uevent

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

☆ 默默地牛逼着 2400

新手工程师必看:搞定EMI传导干扰,从理解差模和共模开始(附实战案例)

本文深入解析EMI传导干扰中的差模与共模问题,为新手工程师提供从诊断到治理的完整方法论。通过实战案例展示如何通过频谱分析、近场探头扫描等技术精准定位干扰源,并分享PCB布局、滤波器设计等系统级解决方案,帮助工程师高效解决传导干扰问题,提升EMC设计能力。

weixin_26757925的博客 469

英雄联盟(MOBA)完整制作教程

这是一份从零到上线、可落地的 LOL 风格 MOBA 游戏开发全流程教程,覆盖策划、美术、程序、测试、运营全环节,适合独立团队或学习参考。

qq_35779316的博客 536

android-uevent 简记

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

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

Kali Linux实战:5种局域网DoS攻击手法全解析(附防御方案)

本文以Kali Linux为平台,深入解析了局域网内五种典型的DoS攻击手法,包括TCP SYN Flood、ICMP Flood、MAC地址泛洪、DHCP耗尽以及应用层CC攻击模拟。通过实战演示结合Wireshark抓包分析,清晰揭示了攻击原理与流量特征,并提供了从主机加固、防火墙规则到交换机安全配置(如端口安全、DHCP Snooping)等企业级防御方案,旨在帮助安全人员构建纵深防御体系。

weixin_29313423的博客 396

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

金三银四!风控建模岗面试题库大全:从理论到实战避坑指南

风控建模面试大全

阿黎逸阳的博客 767

RT-DETR改进有效系列目录 | 包含卷积、主干、RepC3、注意力机制、Neck上百种创新机制

Hello,各位读者们好Hello,各位读者,距离第一天发RT-DETR的博客已经过去了接近两个月,这段时间里我深入的研究了一下RT-DETR在ultralytics仓库的使用,旨在为大家解决为什么用v8的仓库训练的时候模型不收敛,精度差的离谱的问题,我也是成功的找到了解决方案,对于ultralytics仓库进行多处改进从而让其还原RT-DETR官方的实验环境从而达到一比一的效果。同时本人一些讲解视频和包含我所有创新的RT-DETR文档。

Snu77的博客 3万+

Android P Uevent机制分析

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

Sunxiaolin2016的博客 3090

AutoSAR配置视频讲解:简介

AutoSAR实验视频讲解:闪烁一颗LED实验【简介】 大家好,欢迎来到雪云飞星的《AutoSAR实验课的视频讲解》专栏。看过《AutoSAR入门到精通系列讲解》的朋友们应该对博主不陌生,有很多朋友加了博主的微信成为了好友,还有朋友约过线下见面,博主很高兴大家能从我的博客中获得一些收获。在专栏里博主挖了很多坑,当时也说过想要录制一个AutoSAR的配置视频教程,素材在20年初就已经录好,中间各种原因足足鸽了一年。当时因为一些技术原因只能通过博客的图文形式展示出来,现在我们剪辑了视频,请了专业的配音,希望以视

雪云飞星的博客 9652

Android UEvent事件分析

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

Jimmy的专栏 1547

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

深度学习工具包 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

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

android UEvent剖析

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

成长的味道 1183

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

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_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 分析,从kernel到framework

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

小贼哥的技术花园 2万+

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在源码目录: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 uevent二

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

Fybon的专栏 1051
上一篇: Android Battery 在framework相关介绍
下一篇: ubuntu中如何去除鼠标
learnerz
博客等级 码龄16年 51粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值