hw_get_module详解

Android Camera--hw_get_module获取camx模块接口_hw_module_exists dlopen camera.qcom.so,dlsym获取HAL_MODULE_INFO_SYM符号的地址,即camx模块的入口。:rawModule类型为camera_module_t,被强制转换为hw_module_t类型去获取结构体。是camera_module_t的第一个成员变量即为hw_module_t类型,所以地址相同,获取到该成员变量。问题来了,Android中的HAL是比较具有通用性的,需要上层的函数对其进行加载调用,Android的。cameraserver 进程启动,注册,初始化; 阅读详情
hw_get_module是jni层获取HAL层module的接口函数,原型为:int hw_get_module(const char *id, const struct hw_module_t **module)
这个id是hal层注册时加入的,例如sensor的hal的定义
struct sensors_module_t HAL_MODULE_INFO_SYM = {
    .common = {
        .tag = HARDWARE_MODULE_TAG,
        .version_major = 1,
        .version_minor = 0,
        .id = SENSORS_HARDWARE_MODULE_ID,
        .name = "MTK SENSORS Module",
        .author = "The Android Open Source Project",
        .methods = &sensors_module_methods,
    },
    .get_sensors_list = sensors__get_sensors_list,
};
#define SENSORS_HARDWARE_MODULE_ID "sensors"
hw_module_t是硬件模块结构,是HAL层的灵魂


下面来看hw_get_module是怎么去抓相应的HAL层硬件模块的
    for (i=0 ; i<HAL_VARIANT_KEYS_COUNT+1 ; i++) {
        if (i < HAL_VARIANT_KEYS_COUNT) {
            if (property_get(variant_keys[i], prop, NULL) == 0) {
                continue;
            }/*获取ro.hardware/ro.product.board/ro.board.platform/ro.arch等key的值*/
            snprintf(path, sizeof(path), "%s/%s.%s.so",
                     HAL_LIBRARY_PATH2, name, prop);/*这个name是之前传进来的id,在我们这里就是"sensor",prop为之前抓取到的key信息,这里为mt6575*/
            if (access(path, R_OK) == 0) break;     /*下面的这几个函数在给定的几个目录中搜索我们要加载的库sensors.mt6575.so*/


            snprintf(path, sizeof(path), "%s/%s.%s.so",
                     HAL_LIBRARY_PATH1, name, prop);
            if (access(path, R_OK) == 0) break;


            snprintf(path, sizeof(path), "%s/%s.%s.so",
                     HAL_LIBRARY_PATH3, name, prop);
            if (access(path, R_OK) == 0) break;
        } else { /*如果上面没有收到,则用默认库*/
            snprintf(path, sizeof(path), "%s/%s.default.so",
                     HAL_LIBRARY_PATH1, name);
            if (access(path, R_OK) == 0) break;


            snprintf(path, sizeof(path), "%s/%s.default.so",
                     HAL_LIBRARY_PATH3, name);
            if (access(path, R_OK) == 0) break;
        }
    }
    status = -ENOENT;
    if (i < HAL_VARIANT_KEYS_COUNT+1) {
        /* load the module, if this fails, we're doomed, and we should not try
         * to load a different variant. */
        status = load(class_id, path, module);
    }
找到这次需要加载的库后,即调用load函数
static int load(const char *id,
        const char *path,
        const struct hw_module_t **pHmi)
{
    int status;
    void *handle;
    struct hw_module_t *hmi;


    /*
     * load the symbols resolving undefined symbols before
     * dlopen returns. Since RTLD_GLOBAL is not or'd in with
     * RTLD_NOW the external symbols will not be global
     */
    handle = dlopen(path, RTLD_NOW);/*打开动态库*/
    if (handle == NULL) {
        char const *err_str = dlerror();
        LOGE("load: module=%s\n%s", path, err_str?err_str:"unknown");
        status = -EINVAL;
        goto done;
    }
    /* Get the address of the struct hal_module_info. */
    const char *sym = HAL_MODULE_INFO_SYM_AS_STR;/*被定义为"HMI"*/
    hmi = (struct hw_module_t *)dlsym(handle, sym);/*获取hw_module_t 结构体*/
    if (hmi == NULL) {
        LOGE("load: couldn't find symbol %s", sym);
        status = -EINVAL;
        goto done;
    }
    /* Check that the id matches */
    if (strcmp(id, hmi->id) != 0) {/*对比hw_module_t结构体总的id和我们传进来的id是否一致,不一致的话直接退出*/
        LOGE("load: id=%s != hmi->id=%s", id, hmi->id);
        status = -EINVAL;
        goto done;
    }
    hmi->dso = handle;
    /* success */
    status = 0;
    *pHmi = hmi;/*返回结果*/
    return status;
}


通过readelf x.so来看看这个库的地址布局
Symbol table '.dynsym' contains 40 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     1: 000021d8   340 OBJECT  GLOBAL DEFAULT   15 sSensorList
     2: 00000000     0 FUNC    GLOBAL DEFAULT  UND __aeabi_unwind_cpp_pr0
     3: 00000000     0 FUNC    GLOBAL DEFAULT  UND __android_log_print
     4: 00000000     0 FUNC    GLOBAL DEFAULT  UND ioctl
     5: 00000000     0 FUNC    GLOBAL DEFAULT  UND __aeabi_ldivmod
     6: 00000000     0 FUNC    GLOBAL DEFAULT  UND __errno
     7: 00000000     0 FUNC    GLOBAL DEFAULT  UND __aeabi_unwind_cpp_pr1
     8: 00000000     0 FUNC    GLOBAL DEFAULT  UND malloc
     9: 00000000     0 FUNC    GLOBAL DEFAULT  UND memset
    10: 00000000     0 FUNC    GLOBAL DEFAULT  UND opendir
    11: 00000000     0 FUNC    GLOBAL DEFAULT  UND strcpy
    12: 00000000     0 FUNC    GLOBAL DEFAULT  UND strlen
    13: 00000000     0 FUNC    GLOBAL DEFAULT  UND open
    14: 00000000     0 FUNC    GLOBAL DEFAULT  UND strcmp
    15: 00000000     0 FUNC    GLOBAL DEFAULT  UND close
    16: 00000000     0 FUNC    GLOBAL DEFAULT  UND readdir
    17: 00000000     0 FUNC    GLOBAL DEFAULT  UND closedir
    18: 00000000     0 FUNC    GLOBAL DEFAULT  UND strerror
    19: 00000000     0 FUNC    GLOBAL DEFAULT  UND __stack_chk_fail
    20: 00000000     0 OBJECT  GLOBAL DEFAULT  UND __stack_chk_guard
    21: 00000000     0 FUNC    GLOBAL DEFAULT  UND free
    22: 00000000     0 FUNC    GLOBAL DEFAULT  UND memcpy
    23: 00000000     0 FUNC    GLOBAL DEFAULT  UND read
    24: 00002150   132 OBJECT  GLOBAL DEFAULT   15 HMI
    25: 00000000     0 FUNC    GLOBAL DEFAULT  UND __cxa_finalize
    26: 00002330     0 NOTYPE  GLOBAL DEFAULT   16 __dso_handle
    27: 00002000     0 NOTYPE  GLOBAL DEFAULT   11 __INIT_ARRAY__
    28: 00002008     0 NOTYPE  GLOBAL DEFAULT   12 __FINI_ARRAY__
    29: 000013d0     0 NOTYPE  GLOBAL DEFAULT  ABS __exidx_end
    30: 00001388     0 NOTYPE  GLOBAL DEFAULT  ABS __exidx_start
    31: 00002150     0 NOTYPE  GLOBAL DEFAULT   15 __data_start
    32: 0000232c     0 NOTYPE  GLOBAL DEFAULT  ABS _edata
    33: 0000232c     0 NOTYPE  GLOBAL DEFAULT  ABS __bss_start
    34: 0000232c     0 NOTYPE  GLOBAL DEFAULT  ABS __bss_start__
    35: 00002340     0 NOTYPE  GLOBAL DEFAULT  ABS _bss_end__
    36: 00002340     0 NOTYPE  GLOBAL DEFAULT  ABS __bss_end__
    37: 00002340     0 NOTYPE  GLOBAL DEFAULT  ABS __end__
    38: 00002340     0 NOTYPE  GLOBAL DEFAULT  ABS _end
    39: 00080000     0 NOTYPE  GLOBAL DEFAULT  ABS _stack
上面的"HMI"段就是我们之前定义的,即是hw_module_t结构体,每个hw_module_t的定义中名字都叫HAL_MODULE_INFO_SYM
实际上他还是由宏定义为"HMI"的


所以综上,可以得出,一个HAL模块也有一个入口地址,就是我们这里的hw_module_t结构体,通过它就可以把我们定义的接口给上层使用
Android Camera 流程学习记录(三)—— Camera hw_get_module() 相关逻辑 这一篇笔记,我们将从 hw_get_module() 函数入手,去探究 Libraries 层是如何调用 HAL 层的库中的函数的。 CameraService 是在开机时就会启动的,而当它第一次启动时,就会调用一个名为 onFirstRef() 的成员函数,我们所要探究的内容就是从这里开始的。 阅读详情

相关推荐

Android HAL动态加载机制:从hw_get_module到gps.xxx.so的寻址之旅

本文深入解析了Android HAL的动态加载机制,特别是GPS模块从hw_get_module函数调用到最终定位并加载gps.xxx.so库文件的完整过程。文章详细阐述了系统如何基于ro.hardware等属性,在/vendor、/system等目录中按优先级搜索匹配的HAL实现库,并介绍了其背后的设计思想与实战调试方法。

weixin_29164185的博客 252

Android HAL层模块的加载过程

一、概述 HAL层是Android系统架构里介于Linux内核和系统运行库层之间的一个层,个人认为这个层存在的目的主要是为了避免GPL协议所带来的开源问题。Android系统会统一加载硬件抽象层模块,负责加载硬件抽象层模块的函数是hw_get_module函数。 二、hw_get_module 1、hw_get_module原型 在Android硬件抽象层中,负责加载硬件抽象层模块的函数是hw_get_module,当调用者需要加载这些模块时,只要指定它们的ID值就可以了。它的原型如下: 1 /**

转载和创作优秀的博客 1833

android hw_get_module分析

这个函数的主要功能是根据模块ID寻找硬件模块动态链接库德地址,然后调用load去打开动态链接库并从中获取硬件模块结构体地址。首先得到是根据固定的符号HAL_MODULE_INFO_SYM寻找到hw_module_t结构体,然后又hw_moule_t中hw_module_metho

carltraveler的专栏 6161

Android中hw_get_module函数分析

该函数定义在hardware/libhardware/hardware.c文件中,定义如下:int hw_get_module(const char *id, const struct hw_module_t **module) { return hw_get_module_by_class(id, NULL, module); } hw_get_module()函数利用HAL层注册信息i...

编程菜鸟进阶之路 7817

Android应用程序访问linux驱动第五步:回顾hw_get_module

在《android应用程序访问Linux驱动第二步-实现并测试hardware层》文章中,我们实现了自己的HAL层module,并且写了一个应用程序测试module是否正常工作。在编译的时候,我说过这样一段话: 为什么这么说呢?这还得从hw_get_module函数寻找我们的模块的过程说起。 hw_get_module函数定义在hardware.c函数中:int hw_get_module(

阳光玻璃杯 4118

Android Camera--hw_get_module获取camx模块接口

我们知道,google为了保护硬件厂商的信息,在Android中添加了一层,也就是大名鼎鼎的HAL 层。 在看HAL的编写方法的过程中,会发现整个模块貌似没有一个入口。一般说来模块都要有个入口, 比如应用程序有main函数,可以为加载器进行加载执行,dll文件有dllmain,而对于我们自己写的 动态链接库,我们可以对库中导出的任何符号进行调用。 问题来了,Android中的HAL是比较具有通用性的,需要上层的函数对其进行加载调用,Android的 HAL加载器是如何实现对不同的Hardware

weixin_49303682的博客 874

Android HAL动态加载机制:从GPS模块到通用HAL的so文件寻址逻辑剖析

本文深入剖析了Android HAL动态加载机制,特别是GPS模块(GnssHal)的so文件寻址逻辑。详细解析了hw_get_module函数的加载过程、so文件命名规则与存放路径,以及多分区协作策略,帮助开发者理解并掌握Android HAL的通用设计思想与实现方法。

weixin_30892037的博客 414

NHANES更新数据后,权重计算方式也更新了

官网说明在此:如果你比我还懒,我下载了几个说明文件。2021年8月至2023年8月的总样本量与之前的2年周期相似。然而,。特别是,与之前包括过度抽样的周期相比,非西班牙裔白人的样本量较高,而非西班牙裔黑人的样本量较低。此外,60岁及以上人群的样本量较高,而年轻群体的样本量较低。子组的估计值可能具有较低的精确度,因此,检测组间差异的统计能力可能较低。此外,年龄和种族/西班牙裔亚组(尤其是儿童和青少年年龄组)的估计值可能会显示意想不到的模式。

珏世佳人的博客 2409

Android驱动开发全链路实战:从Linux内核模块到JNI与HAL层

在嵌入式Linux开发中,驱动是连接硬件与操作系统的关键纽带。一个完整的驱动项目不仅涉及内核模块、设备树和字符设备框架,还需要理解平台总线机制、GPIO控制与并发访问保护。从技术价值看,掌握从底层驱动到上层应用的分层架构,能够清晰解释数据在内核态与用户态之间的流转路径,这是嵌入式岗位面试中的核心能力体现。在实际工程里,这样的技能广泛应用于智能座舱、AIoT设备、Android系统定制等场景。本文以ARM开发板为平台,完整梳理一条从Linux字符设备驱动、设备树匹配、HAL硬件抽象层到JNI动态注册,最终在A

weixin_28721917的博客 317

DDR Study - LPDDR5 Power-Up and Initialization Sequence

本文深入解析LPDDR5内存的上电初始化流程,涵盖电源斜坡、复位信号释放和初始化训练等关键阶段。通过实际案例分享,详细探讨了电源轨时序、RESET信号处理、ZQ校准和CA总线训练等核心技术要点,帮助硬件工程师规避常见设计陷阱,确保DDR内存稳定运行。

weixin_42523792的博客 299

空频、空时、空域、时域、频域抗干扰介绍

1、时域抗干扰:对时间域序列进行滤波,滤波系数h(n),采样序列不断进行输入与滤波系数卷积计算,得到响应输出;例如常用的FIR和IIR滤波器。 对于多窄带干扰噪声源和连续波干扰源有较好的处理效果,还可以解决多径问题; 可以通过在接收机前端处理中增加一个嵌入式块实现; 2、频域抗干扰:接收机不容易受到相对于接收机频带以外的强功率干扰; 通常为带通滤波和阻带滤波, 适用于窄带干扰噪声源,连续波干扰源以及较强的频带外干扰噪声源, 3、空域抗干扰:通过多个自适应天线按照特定组合成天线阵列,波束成形,针对

qq_43517907的博客 7299

camera hw_get_module

google为了保护硬件厂商的信息,在Android中添加了一层,也就是大名鼎鼎的HAL层。 HAL的编写方法的过程中,会发现整个模块貌似没有一个入口。一般说来模块都要有个入口,比 如应用程序有main函数,可以为加载器进行加载执行,dll文件有dllmain,而对于我们自己写的动态 链接库,我们可以对库中导出的任何符号进行调用。 问题来了,Android中的HAL是比较具有通用性的,需要上层的函数对其进行加载调用,Android的 HAL加载器是如何实现对不同的Hardware Module进行通用性的

当我荒废时间的时候,会有多少人在拼命 545

20-CUDA规约算法:并行求和优化策略-✨

本文介绍了GPU上高效并行规约(Reduction)算法的优化技巧。规约是将大量数据合并为单个值的基础计算模式,广泛应用于科学计算等领域。文章从基础并行规约实现出发,逐步讲解了三种关键优化策略:1)交错寻址减少共享内存bank冲突;2)循环展开降低分支预测开销;3)多级规约处理大规模数据。性能对比显示,优化策略可带来最高4.5倍的加速效果。最后总结了最佳实践,包括合理使用共享内存、循环展开和warp级优化等技巧。这些优化方法可显著提升GPU计算密集型应用的性能。

2301_79143213的博客 171

【HAL】hw_get_module分析:加载HAL层库,获取camx模块接口

1.HAL module implementation 路径:android\vendor\qcom\proprietary\camx\src\core\hal\camxhal3entry.cpp // Name of the hal_module_info #define HAL_MODULE_INFO_SYM HMI // Name of the hal_module_info as a string #define HAL_MODULE_INFO_SYM_AS_STR "HMI

mrhjlong 1744

31.XAPP1052乱序分析及处理

目录 1.XAPP1052乱序分析 2.XAPP1052乱序处理 2.1乱序处理方法选择 2.2 XAPP1052乱序处理代码详解 3.XAPP1052乱序处理后的波形分析 3.1发送引擎 3.2接收引擎 4.XAPP1052乱序处理后的带宽测试 5.下期内容 1.XAPP1052乱序分析 首先先给大家讲解下什么是PCIe的乱序。在PCIe系统中,乱序就是主机发送的TLP序列ID为1、2、3、4到从机,从机接收到的可能不是1、2、3、4。主机和从机如果都不解决乱序的问题,就会导致从机接

一个早起的程序员 1704

从原理到落地:监控 SAP OData bgRFC 队列的全景实践指南

摘要(150字) 本文系统讲解SAP Gateway/Backend场景中bgRFC队列的监控方法。内容涵盖:1)监控必要性——确保异步可靠传输,及时识别失败消息;2)两种服务质量(EO/EOIO)对监控策略的影响;3)通过事务码SBGRFCMON和SPRO路径访问监控界面;4)关键授权S_BGRFC的配置要求;5)详细操作指南包括筛选条件和动作选项;6)标准巡检脚本;7)三个典型案例(认证错误、顺序阻塞、调度压力)的诊断与修复方案。全文提供完整的监控方法论和实战指导。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 284

Android平台的 hw_get_module 函数的学习

通过hw_get_module_t来找到注册的硬件对象。 @hardware/libhardware/hardware.c static const char *variant_keys[] = { “ro.hardware”, “ro.product.board”, “ro.board.platform”, “ro.arch” }; // 由上面定义的字符串数组可知,HAL_VARIANT_KEYS_COUNT的值为4 struct constint HAL_VARIANT_KEYS_COUNT

weixin_38387929的博客 1135

【PINN物理信息网络】基于PINN物理信息网络求解圆柱坐标中的热方程(python)

【PINN物理信息网络】基于PINN物理信息网络求解圆柱坐标中的热方程(python)

k8291121的博客 2271

Android--hw_get_module解析

作者:苗老师,华清远见嵌入式学院讲师。 我们知道,google为了保护硬件厂商的信息,在Android中添加了一层,也就是大名鼎鼎的HAL层。 在看HAL的编写方法的过程中,会发现整个模块貌似没有一个入口。一般说来模块都要有个入口,比如应用程序有main函数,可以为加载器进行加载执行,dll文件有dllmain,而对于我们自己写的动态链接库,我们可以对库中导出的任何符号进行调用。 问题来了,

farsightliuht的专栏 919

UDS自动化测试-Service 0x27(CAPL调用dll实现key计算)

相信读者基于Diagnostic/ISO TP Confighration中cdd、dll文件的测试并不陌生,本文基于其的基础上,介绍在capl中调用内置的函数diagGenerateKeyFromSeed实现27服务解锁,从而进行诊断自动化测试。本文基于4个byte的Seed、16个byte的Key的安全访问,实现27服务的自动化测试。需要加载项目使用的cdd文件,如果没有的情况下可以使用canoe例程中默认的cdd文件。

诊断协议那些事儿's blog 2052

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Camera1 源码解析系列(三)—— Camera1 hw_get_module() 解析

这一章,我们将从 `hw_get_module()` 函数入手,去探究 `Libraries` 层是如何调用 `HAL` 层的库中的函数的。 `CameraService` 是在开机时就会启动的,而当它第一次启动时,就会调用一个名为 `onFirstRef()` 的成员函数,我们所要探究的内容就是从这里开始的。.........

hello_1995的博客 842

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

hw_get_module 参数

camera_module_t *rawModule; /*** NOTE THIS ***/ int err = hw_get_module(CAMERA_HARDWARE_MODULE_ID,(const hw_module_t **)&rawModule); 首先rawModule是指针,那么&rawModule就是指针的地址,即二级指针 (const hw_module_t **)&rawModule 表示camera_module_t类中的属性hw...

转载和创作优秀的博客 619

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

蓝牙模块HM-10手册

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

android 解析 结构体,Android--hw_get_module解析

我们知道,google为了保护硬件厂商的信息,在Android中添加了一层,也就是大名鼎鼎的HAL层。在看HAL的编写方法的过程中,会发现整个模块貌似没有一个入口。一般说来模块都要有个入口,比如应用程序有main函数,可以为加载器进行加载执行,dll文件有dllmain,而对于我们自己写的动态链接库,我们可以对库中导出的任何符号进行调用。问题来了,Android中的HAL是比较具有通用性的,需要上...

weixin_36155267的博客 435
上一篇: 内核request_mem_region 和 ioremap的理解
下一篇: linux内核及驱动开发中有关__init,__exit和__initdata的用法
计算机与认知
博客等级 码龄14年 31粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值