深入解析设备树(Device Tree)中的属性(Properties)

嵌入式Linux设备树:从硬件描述到驱动匹配的完整指南 在嵌入式Linux系统中,硬件描述是驱动开发的基础环节。传统的内核硬编码方式将板级信息与内核源码强耦合,导致移植和维护困难。设备树(Device Tree)作为一种硬件描述语言,通过结构化的数据格式(.dts/.dtsi)独立描述CPU、内存、外设等硬件资源,实现了硬件配置与内核代码的解耦。其技术价值在于提供统一的硬件抽象层,使同一内核镜像能适配不同硬件平台,极大提升了系统的可移植性和可维护性。在应用场景上,设备树广泛应用于基于ARM、PowerPC等架构的嵌入式Linux系统,特别是在瑞芯微(Rockch 阅读详情

1. 引言

在嵌入式 Linux 设备开发中,设备树(Device Tree, DT) 是用来描述硬件的关键数据结构。它允许操作系统无需修改内核代码即可适配不同的硬件平台。

设备树采用 层次化结构 组织硬件信息,每个节点(Node) 代表一个设备,每个属性(Property) 记录设备的详细信息。本篇文章将准确、清晰、符合官方定义地介绍设备树中的属性,并提供易于理解的示例。


在这里插入图片描述

2. 什么是设备树属性(Property)?

在 Device Tree Specification(设备树规范) 中,属性(Properties) 是 键值对(key-value pair),用于存储与设备相关的信息。每个设备树节点都可以包含多个属性。

官方定义:
“A property is a name-value pair associated with a node.”
(属性是与节点关联的键值对。)

属性的基本格式

<属性名> = <属性值>;

示例:

model = "NXP i.MX8MM Board";
status = "okay";
reg = <0x30200000 0x10000>;

解析:

  • model 是一个字符串属性,用于描述设备名称。
  • status 是一个设备状态属性,okay 表示启用,disabled 表示禁用。
  • reg 是一个数组属性,存储设备的寄存器地址(0x30200000)和大小(0x10000)。

3. 设备树的标准属性(Standard Properties)

标准属性由 Device Tree Specification 定义,适用于所有设备。

3.1 compatible(驱动匹配)

compatible 属性用于设备与驱动的匹配。

uart4: serial@30200000 {
    compatible = "fsl,imx8mm-uart", "ns16550";
    reg = <0x30200000 0x10000>;
    status = "okay";
};

解释:

  • compatible = "fsl,imx8mm-uart" 告诉内核,这个设备是 NXP i.MX8MM 的 UART 设备。
  • ns16550 是通用 UART 设备的兼容名称。

3.2 reg(寄存器地址)

reg 定义设备的寄存器映射。

reg = <0x30200000 0x10000>;

解释:

  • 0x30200000 是设备的起始地址。
  • 0x10000 是设备占用的地址范围(64 KB)。

3.3 interrupts(中断配置)

interrupts 指定设备的中断号。

interrupts = <GIC_SPI 65 IRQ_TYPE_LEVEL_HIGH>;

解释:

  • GIC_SPI 代表使用全局中断控制器。
  • 65 是中断号。
  • IRQ_TYPE_LEVEL_HIGH 说明此中断为高电平触发。

3.4 clocks(时钟管理)

clocks 和 clock-names 设定设备的时钟源。

clocks = <&clk IMX8MM_CLK_UART4>;
clock-names = "uart";

解释:

  • clocks 指向外部时钟 IMX8MM_CLK_UART4。
  • clock-names 赋予该时钟一个名称 uart。

3.5 gpios(GPIO 配置)

设备树中可以使用 gpios 连接外部 GPIO 设备,如 LED。

led0: led {
    gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>;
};

解析:

  • LED 连接到 GPIO1 的第 10 号引脚。
  • GPIO_ACTIVE_HIGH 说明高电平点亮 LED。

4. 设备树的非标准属性(Vendor-Specific Properties)

厂商(Vendor)可以定义自己的属性,必须使用唯一的前缀(如 fsl,、qcom,、ti,)。

示例:

fsl,channel-fifo-len = <64>;
qcom,pmic-voltage = <3300000>;
ti,am335x-gpio-rising-edge;

解析:

  • fsl,channel-fifo-len → NXP 自定义 FIFO 长度。
  • qcom,pmic-voltage → Qualcomm PMIC 供电电压(单位 µV)。
  • ti,am335x-gpio-rising-edge → TI 定义的 GPIO 触发模式(布尔值,仅存在即为 true)。

5. 布尔类型属性(Boolean Properties)

布尔值属性没有值,仅存在即为 true。

cache-coherent;

解释:

  • cache-coherent 存在,表示设备支持缓存一致性。
  • 如果该属性缺失,则默认为 false。

6. 设备树属性总结

类别示例说明
标准属性compatible, reg, status适用于所有设备
电源管理power-supply, voltage-min-microvolt适用于电源管理
时钟管理clocks, clock-names适用于需要时钟的设备
GPIO 配置gpios, gpio-controller适用于 GPIO 设备
厂商属性fsl,channel-fifo-len适用于特定厂商
布尔值属性cache-coherent仅存在即为 true

7. 结论

  • 标准属性 适用于所有设备,由设备树规范定义。
  • 非标准属性 需使用 厂商前缀,避免冲突。
  • 布尔类型属性 没有值,仅存在即为 true。

这样组织的设备树属性清晰、符合官方规范,并且易于理解。希望这篇文章能帮助你更好地掌握设备树属性的使用!

设备树基本语法及属性分析 设备树在2011年被引入到ARM Linux内核中,也就是在Linux内核3.x以后引入的,在内核3.x之前都是没有设备树的概念的,都是使用平台文件来描述硬件的。比如:父节点的#interrupt-cells的值是3,则子节点的interrupts一个cell有三个32bits整型值,名字的命名是由字符、数字、“-”等组成,长是31个字符,一般是设备类型命名,unit-address一般的是设备地址。有时候一个硬件设备的部分信息内容可能会有变化,这里可能会出现节点内容合并的概念。 阅读详情

相关推荐

Zephyr-设备树原理和使用

1 介绍 zephyr的设备树管理和linux类似,需要提前了解一些linux设备树的知识。设备树简单理解就是将硬件相关数据例如几个I2C,每个I2C控制器的寄存器地址等等,统一按设备树的结构独立于内核进行配置和修改,这里需要了解的就是设备树语法知识。有了设备树文件后,如何让内核代码读取这些信息,进行板级初始化了?linux的做法是编译成DTB文件,然后在内核启动时进行解析,逐一获取硬件数据。Zephyr系统设计的前提是资源受限的小型系统,这里将大量解析工作放到构建编译阶段,通过脚本将...

只想.静静的博客 7878

设备树属性解读

设备树属性

u013021855的博客 3925

Zephyr RTOS设备树实战:STM32F103C8T6 GPIO控制LED详解

这次我们来看一个基于 Zephyr RTOS 的 STM32F103C8T6 GPIO 控制 LED 的实战案例。对于很多从传统单片机开发(如 STM32 HAL/标准库)转向 Zephyr 的开发者来说,最大的困惑可能就是“设备树(Device Tree)”。以前配个 LED 灯,无非就是改改宏定义、初始化一下 GPIO 端口,现在怎么变得这么复杂? 这篇文章的目的就是帮你彻底搞懂 Zephyr 的设备树。我们会用一个最经典的“点灯”实验作为切入点,手把手带你完成从环境搭建、设备树配置、驱动编写到最终烧录

weixin_34008933的博客 380

设备树的reg属性

reg`属性通常包含一系列的地址和长度对,它们指定了设备在物理或虚拟地址空间中的位置和大小。在这个上下文中,`reg`属性告诉操作系统UART(通用异步接收/发送器)设备从物理地址`0x101f0000`开始,占用4096字节的地址空间。- `reg`属性指定了设备的基地址`0x101f0000`和映射的地址范围大小`0x1000`(4096字节)。- `uart0`是节点的标签,`serial@101f0000`是节点的名称和它的基地址。- `interrupts`属性指定了设备使用的中断号。

symsyq的博客 1810

图解Linux设备树:手把手带你拆解of_property_read_bool的‘糖葫芦’链表

本文通过生动的‘糖葫芦’比喻,深入解析Linux设备树中of_property_read_bool函数的工作原理。详细拆解device_node结构,揭示属性链表的组织方式,并演示如何高效查找dma-coherent等属性。文章还提供实用的调试技巧,帮助开发者更好地理解和调试设备树相关问题。

weixin_33738578的博客 641

设备树的使用

在前面的章节中有提到过设备树,那么到底什么是设备树,有什么做用?

qq_24093081的博客 5180

Device Tree/ACPI 与 fwnode 内核基础设施

设备树 ACPI 表 的基础知识

mapleay的博客 230

利用HFSS仿真优化圆极化微带天线的耦合馈电设计

本文深入探讨了利用HFSS仿真软件优化圆极化微带天线性能的关键方法。通过对比传统直接馈电与耦合馈电方式,详细阐述了耦合馈电在提升阻抗匹配、改善轴比带宽及增强设计鲁棒性方面的显著优势。文章结合FR4板材的实战案例,逐步演示了在HFSS中建立模型、进行参数扫描与圆极化性能优化的完整流程,为设计高性能、高纯度的圆极化天线提供了实用指南。

weixin_29233333的博客 547

Linux 设备树(Device Tree)概览

本文是一份系统化的 Linux 设备树(Device Tree)学习与实践指南,覆盖从硬件描述思想、语法规范、内核解析机制到驱动开发实战的完整知识体系。

smallerxuan的博客 6955

Golang实现企业级AI智能体安全合规自动化检测系统

需求:自动化解析欧盟AI法案、中国网络安全法、美国NIST框架等多国法规,提取具体合规要求并映射到企业技术实现。技术挑战法规文本非结构化,语义复杂,存在大量法律术语与技术术语交叉多语言支持(中文、英文、欧盟24种官方语言)法规动态更新(平均每季度更新2-3次)架构创新性:提出了"规则引擎+AI模型+实时监控"的混合架构,兼顾了合规要求的明确性与智能体行为的动态性。性能突破:通过Golang协程、多级缓存、数据库优化等技术,实现了12,800 req/s的高吞吐量和38ms的低延迟。准确性提升。

shao.bing的专栏 723

电商客服效率翻倍!手把手教你用影刀RPA+AI搭建智能回复系统(附实战配置)

本文详细介绍了如何利用影刀RPA+AI技术搭建电商智能客服系统,实现24小时在线回复,大幅提升客服效率。通过零代码配置、Excel词库管理和AI语义理解,系统能处理80%常规咨询,响应速度稳定在3秒内,特别适合中小电商降低成本并提升服务质量。

weixin_42520661的博客 550

Linux 内核底层机制:设备树(Device Tree)的数据结构与内存组织

Linux内核中的设备树(Device Tree)采用分层数据结构组织硬件信息。设备树节点(Device Node)通过左孩子-右兄弟表示法构建多叉树,每个节点包含父节点、首子节点和兄弟节点指针。节点属性(Property)则使用单向链表存储,包含名称、值和长度等信息。这种设计既节省内存,又便于查询。现代内核(5.x/6.x)主要通过树形结构遍历节点,而早期版本(4.x及以前)曾使用全局链表。设备树结构简单高效,满足硬件描述和驱动匹配的需求。

qq_51384120的博客 367

FOC实战笔记:RC吸收电路的设计考量与参数调优

本文深入探讨了FOC驱动器中RC吸收电路的设计与调优。针对MOS管开关过程中的电压尖峰问题,详细阐述了RC电路的钳位与能量吸收原理,并提供了从参数计算、实验调试到布局布线的完整实战指南,旨在帮助工程师有效提升系统可靠性与稳定性。

weixin_29219539的博客 275

Android设备属性Build.DEVICE源码解析与应用实践

Android属性系统是设备配置管理的核心机制,通过键值对形式存储全局共享信息。其实现原理基于init进程管理的共享内存区域,支持只读(ro.)、持久化(persist.)等多种属性类型。在系统启动过程中,属性会经历内核参数、设备树解析、多层级属性文件加载等初始化阶段。以Build.DEVICE为代表的设备标识属性,在系统功能适配、应用兼容性处理、OTA升级验证等场景发挥关键作用。深入理解ro.product.device等属性的生成机制,能有效解决设备识别异常、属性覆盖失效等典型问题。通过属性追踪工具和内

weixin_30617695的博客 345

2024银行科技岗笔试通关秘籍:从资料准备到实战技巧

本文系统解析了2024年银行科技岗笔试的考察内容与备考策略。文章指出,笔试是一场涵盖通用能力测试、计算机专业基础、金融科技知识和英语性格测试的复合型考试,并重点提供了数据结构与算法、计算机网络、数据库等高频考点的深度解析与实战突破技巧,帮助考生高效准备,顺利通关。

weixin_29243279的博客 121

Easy3D&CGAL文章目录汇总

Easy3D&CGAL文章目录汇总

dayuhaitang1的博客 2863

Linux系统-设备树介绍(四)

dtsnode-name:节点名称,通常反映设备功能(如 serial, i2c)。@address:可选,表示该设备在父总线上的基地址。{ … }:花括号内包含属性和子节点。

qq_40067649的博客 247

基于matlab的LFM脉冲压缩仿真

传统雷达测距是通过发射点频脉冲串实现的,通过发射脉冲与回波的时延确定目标的距离。此类方法易于实现,对接收机的要求较低。一般要获取更好的距离分辨力,需要增加发射信号的带宽,对于点频脉冲信号即需要减小发射脉冲宽度;而为获取更大的探测距离,提升雷达威力,则需要发射更大占空比的脉冲串。由于点频信号的时宽带宽积约等于1,因此不能同时增加信号的时宽和带宽。若要保持距离分辨力,增大占空比就需要减少雷达的脉冲重复周期(PRT)。这样会减小雷达的无模糊探测距离,也会造成目标回波频繁被遮挡,损失雷达威力。

平时工作较为繁忙,私信消息一般晚上回复,谢谢大家~~ 1770

设备树学习1

这里就描述这个设备的硬件信息,其中compatible 就是这个设备的硬件名称,用来在驱动中做匹配的。后面linux内核就把这些做成公共库抽象出来,后面设备只需要传入“我是什么设备”,那么linux就可以从内核中公共库找到需要的驱动,避免了很多质量不一的冗余代码,而且也方便了管理。基本流程是编译前编写DTS(有一个DTSi,可以视为厂商的DTS头文件,可以提取一些共性数据),之后会通过DTC编译成DTB,通过Bootloader传给kernel。在设备树中,涉及到的文件主要是DTS,DTSI,还有DTB。

fanged的专栏 573

32位快速加法器设计

32位快速加法器设计

好好学习,天天向上 3290

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

如何正确添加设备树节点

怎么做? 第 166 行指定了 of_match_table,它是用来跟设备树节点匹配的,如果设备树节点中有 compatile 属 性,并且其值等于第 157 行的“ 100as,leddrv”,就会导致第 162 行的 probe 函数被调用。 156 static const struct of_device_id ask100_leds[] = { 157 { .compatible = "100as,leddrv" }, 158 { }, 159 }; 160 161 static struct

weixin_43209963的博客 4508

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Linux设备树与platform_driver驱动开发实战:从硬件解耦到可移植设计

在嵌入式Linux开发中,硬件与软件的解耦是提升驱动可移植性和维护性的核心挑战。传统驱动开发常将GPIO编号、中断号等硬件信息硬编码在代码中,导致每更换硬件平台就需修改驱动,效率低下且容易出错。设备树(Device Tree)作为一种硬件描述机制,通过将硬件配置信息从内核代码中剥离,以结构化数据形式在启动时传递给内核,实现了硬件描述的标准化和动态化。结合platform_driver框架,驱动可通过compatible属性与设备树节点自动匹配,并在probe函数中动态解析GPIO等资源,从而构建出与具体硬件

weixin_30642869的博客 490

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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

Kata Containers 中的 Cloud Hypervisor DeviceNode 模型解析:设备树数据结构与 Go API 实战

Cloud Hypervisor 是 Kata Containers([src/runtime](https://link.gitcode.com/i/967a3375ad2acd87fcd20b5dd9a7930f))默认支持的轻量级 VMM 之一,其本地 HTTP API 会在返回虚拟机信息(`vm.info`)时附带一张完整的**设备树(device tree)**,树中的每一个节点就是一个

gitblog_00915的博客 160

R9操作系统设备树解析:从DTB到硬件抽象层的终极指南

R9操作系统作为基于Rust语言实现的Plan 9操作系统,其**设备树解析**功能是连接硬件与软件的关键桥梁。本文深入探讨R9操作系统中设备树(Device Tree)的完整实现机制,从DTB二进制格式解析到硬件抽象层的构建,为您提供完整的设备树工作原理解析。 ## 什么是设备树?为什么R9操作系统需要它? 设备树(Device Tree)是描述硬件配置的数据结构,在现代操作系统中扮演着至关

gitblog_00036的博客 868

设备树of函数详解:从节点查找到属性读取的驱动实战指南

设备树(Device Tree)是嵌入式Linux中描述硬件资源的标准方式,它将板级信息从驱动源码中解耦,由bootloader加载的DTB文件动态传递给内核。驱动程序通过Open Firmware(OF)系列API与设备树交互,实现对节点查找、属性解析和资源映射等操作。在驱动开发中,正确使用of_find_node_by_path、of_property_read_u32、of_property_read_string等接口,并合理管理节点引用计数,是确保模块稳定性的关键。这些接口广泛应用于平台驱动pro

weixin_33997389的博客 354

linux root节点解析

首先来看看root节点解析大体调用流程这里只关注具体的解析函数的实现,中间的调用流程可以看上图自行跟踪。

bruk_spp的博客 926
上一篇: i.MX 平台上的浮点运算解析:从原理到 Yocto 项目实现
下一篇: 深入解析 Linux 内核如何解析和获取设备树属性
嵌入式孙老师
博客等级 码龄7年 5687粉丝 902原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值