【linux kernel】linux media子系统分析之media控制器设备
文章目录
- 一、抽象媒体设备模型
- 二、媒体设备
- 三、Entity
- 四、Interfaces
- 五、Pad
- 六、Link
- 七、Media图遍历
- 八、使用计数和电源处理
- 九、link设置
- 十、Pipeline和Media流
- 十一、链接验证
- 十二、媒体控制器设备的分配器API
本文基于linux内核
4.19.4
,抽象媒体设备模型框架的相关源码文件如下:
(1)include/media/media-device.h
(2)include/media/media-entity.h
(3)/drivers/media/media-device.c
(4)/drivers/media/media-devnode.c
(5)/drivers/media/media-entity.c
在linux内核6.2.7
版本中,抽象媒体设备框架描述文件放在了/drivers/media/mc
目录中(也就是单独开了一个目录存放),且文件命名也发生了变化:
-
mc-dev-allocator.c - 媒体控制器设备分配器API
-
mc-device.c:该文件中的代码包含了媒体设备子系统的核心逻辑和数据结构的定义,以及与之相关的函数实现。它提供了用于媒体设备的注册、初始化、配置和控制的接口。
-
mc-devnode.c:文件中的代码包含了媒体设备子系统中设备节点相关的逻辑和函数实现。它负责创建和管理媒体设备子系统中的设备节点,以便应用程序可以通过设备节点与媒体设备进行通信。
-
mc-entry.c:文件中的代码包含了媒体设备子系统中媒体实体相关的逻辑和函数实现。它定义了媒体实体的数据结构以及用于管理和操作媒体实体的接口函数。
-
mc-request.c:该文件为新添文件,该文件中为Media控制器和V4L2接口提供了Request API。目前一些无状态编解码器驱动程序需要使用该文件中实现的函数。
一、抽象媒体设备模型
media控制器设备本文简称为媒体框架,该框架的一个设计目标是:发现设备内部拓扑并在运行时对其进行配置,为了实现这一目标,硬件设备被建模为定向图,由pad连接的实体共同组成。即媒体设备被抽象成包含entity
、pad
、link
的对象。
Linux内核的Media Controller是一个通用的多媒体框架,它提供了一种标准化的方法来处理多种媒体类型,包括音频、视频、图像等。Media Controller主要用于描述媒体设备的拓扑结构,即描述多个媒体设备之间的连接关系。
在Media Controller中,每个媒体设备都被描述为一个媒体实体(Media Entity),每个媒体实体都有一个或多个媒体端口(Media Pad),每个媒体端口都可以连接到另一个媒体设备的媒体端口上,从而形成一个媒体设备的拓扑结构。
Media Controller还提供了一组API,使得用户可以方便地访问媒体设备的拓扑结构,并且可以使用相同的API来访问不同类型的媒体设备。
Media Controller的主要设备包括:
-
Media Controller设备:Media Controller设备是一个虚拟的设备,它代表了整个媒体设备的拓扑结构,包括所有的媒体实体、媒体端口、连接关系等。在开发中可以通过Media Controller设备来访问整个媒体设备的拓扑结构。
-
Media Entity设备:Media Entity设备是一个实际的媒体设备,它可以是一个摄像头、一个麦克风、一个视频采集卡等。每个Media Entity设备都被描述为一个媒体实体,它包括一个或多个媒体端口和一些属性信息。
-
Media Pad设备:Media Pad设备是一个媒体端口,它描述了一个Media Entity设备的输入或输出端口。每个Media Pad设备包括一些属性信息,如媒体类型、格式、方向等。
-
Media Link设备:Media Link设备描述了两个媒体端口之间的连接关系。每个Media Link设备包括一些属性信息,如连接的源端口、目标端口、媒体类型、格式等。
二、媒体设备
一个媒体设备由struct media_device
实例表示,定义在include/media/media-device.h中。该结构的分配由媒体设备驱动程序完成,通常将media_device实例嵌入到一个更大的特定驱动程序的结构中。
struct media_device {struct device *dev; //父设备struct media_devnode *devnode; //媒体设备节点char model[32]; //设备模型的名称char driver_name[32]; //设备驱动名称(可选)。如果没有设置,调用MEDIA_IOC_DEVICE_INFO将返回dev->driver->name。char serial[40]; // 设备序列号 (可选)char bus_info[32]; //唯一和稳定的设备位置标识符u32 hw_revision; //硬件设备修订u64 topology_version; //单调计数器用于存储图形拓扑的版本,u32 id; //在最后注册的图对象上使用的唯一IDstruct ida entity_internal_idx; //图遍历算法使用的唯一内部实体IDint entity_internal_idx_max; //分配的内部实体索引struct list_head entities; //用于存储已注册的entity的链表struct list_head interfaces; //用于存储已注册的接口的链表struct list_head pads; //用于存储已注册的pad的链表struct list_head links; //用于存储已注册的link的链表struct list_head entity_notify; //用于存储已注册的entity_notify回调的链表struct mutex graph_mutex; //用于保护对struct media_device数据的访问struct media_graph pm_count_walk;void *source_priv; //驱动程序用于启用/禁用源处理程序的私有数据int (*enable_source)(struct media_entity *entity, struct media_pipeline *pipe);//启用源处理程序函数指针void (*disable_source)(struct media_entity *entity); //禁用源处理程序函数指针const struct media_device_ops *ops; //media设备的操作回调集合struct mutex req_queue_mutex; //互斥锁atomic_t request_id; //用于生成唯一的请求ID
};
驱动程序通过调用media_device_init()
来初始化媒体设备实例,在初始化媒体设备实例后,通过media_device_register()
宏函数调用__media_device_register()
向linux内核注册媒体设备。
通过调用media_device_unregister()
来取消注册的媒体设备实例,初始化的媒体设备最后必须通过调用media_device_cleanup()
来进行清理操作。
注意,不允许取消未注册的媒体设备实例的注册,也不允许清除未初始化的媒体设备实例。
三、Entity
实体由struct media_entity
实例表示,定义在include/media/media-entity.h中:
struct media_entity {struct media_gobj graph_obj; //包含媒体对象通用数据的嵌入结构。const char *name; //实体的名称。enum media_entity_type obj_type; //实现media_entity的对象类型。u32 function; //实体主函数,定义在include/uapi/linux/media.h (命名类似于MEDIA_ENT_F_*)。unsigned long flags;//实体标志,在include/uapi/linux/media.h定义(命名类似于MEDIA_ENT_FL_*)。u16 num_pads; //sink和source pad的数量。u16 num_links; //link的总数,转发和返回,启用和禁用。u16 num_backlinks; //反向的backlink的数量。int internal_idx; //唯一的内部实体特定编号,如果实体未注册或重新注册,这些号码将被重用。struct media_pad *pads; //数组的大小由num_pads定义。struct list_head links; //用于存储数据link的链表。const struct media_entity_operations *ops; //实体操作。int use_count; //对实体使用count。union {struct {u32 major;u32 minor;} dev; /包含设备major和minor信息。} info;
};
在驱动程序中可以直接分配entity,但该结构通常会嵌入到更大的结构中,例如v4l2_subdev
或video_device
实例中。
驱动程序通过调用media_entity_pads_init()
初始化entity pad,在初始化pad后,驱动程序通过调用media_device_register_entity()
向媒体设备注册实体。
如果想要注销已注册的media_entity,可调用media_device_unregister_entity()
取消注册。
四、Interfaces
接口由struct media_interface
实例表示,定义在include/media/media-entity.h中。目前只定义了一种类型的接口:设备节点,该接口由struct media_intf_devnode
表示。
struct media_interface {struct media_gobj graph_obj; //嵌入式的图对象struct list_head links; //指向图实体的link列表u32 type; //在include/uapi/linux/media.h中定义的接口类型u32 flags; //在include/uapi/linux/media.h中定义的接口标志。(以MEDIA_INTF_FL_*进行命名)
};
驱动程序通过调用media_devnode_create()
初始化和创建设备节点接口。
通过调用media_devnode_remove()
来删除设备节点。
五、Pad
Pad由struct media_pad
实例表示,定义在include/media/media-entity.h中。
struct media_pad {struct media_gobj graph_obj; //包含媒体对象通用数据的嵌入式结构。struct media_entity *entity; //本pad所属的Entity。u16 index; //Pad在实体Pad数组中的索引,编号从0到n。enum media_pad_signal_type sig_type; //media pad的信号类型。unsigned long flags; //在include/uapi/linux/media.h中定义的Pad标志。struct media_pipeline *pipe; //该pad属于的Pipeline。可以使用media_entity_pipeline()访问该字段。
};
每个entity将其Pad存储在由entity驱动程序管理的Pad数组中,驱动程序通常将Pad数组嵌入到特定驱动程序的结构中。Pads由它们的entity和它们在Pads数组中基于0的索引来标识,这两个信息都存储在struct media_pad
中,使得struct media_pad
指针成为存储和传递链接引用的规范方法。Pad具有描述pad功能和状态的标志:MEDIA_PAD_FL_SINK
表示pad支持sink数据,MEDIA_PAD_FL_SOURCE
表示pad支持源数据。
每个pad必须设置
MEDIA_PAD_FL_SINK
或MEDIA_PAD_FL_SOURCE
中的一个且只能设置一个标志。
六、Link
Link由struct media_link
实例表示,定义在include/media/media-entity.h中:
struct media_link {struct media_gobj graph_obj; //包含媒体对象通用数据的嵌入式结构。struct list_head list; //与拥有该链路的实体或接口相关联的链表。union {struct media_gobj *gobj0; //用于获取链接的第一个graph_object的指针。struct media_pad *source; //仅当第一个对象(gobj0)是pad时使用。在这种情况下,它表示源pad。struct media_interface *intf; //仅当第一个对象(gobj0)是pad时使用。在这种情况下,它表示源pad。};union {struct media_gobj *gobj1; //用于获取链接的第二个graph_object的指针。struct media_pad *sink; //仅在第二个对象(gobj1)是pad时使用。在这种情况下,它表示sink pad。struct media_entity *entity; //仅在第二个对象(gobj1)是实体时使用。};struct media_link *reverse; //指向pad到pad link的反向链接的指针。unsigned long flags; //link标志,在uapi/media.h中定义。bool is_backlink; //表示link是否是反向链路。
};
Link有两种类型:
-
(1)Pad到Pad的链接
通过它们的pad关联两个实体,每个实体都有一个指向所有链接的列表,这些链接来自或指向其任何一个pad。因此,给定的链接存储两次,一次在源实体中,一次在目标实体中。 -
(2)接口到实体的链接
该种链接用于将一个接口关联到Link。在驱动程序中通过调用media_create_intf_link()
创建接口到实体的链接,并使用media_remove_intf_links()
删除已创建的链接。
驱动程序通过调用media_create_pad_link()
创建pad到pad的链接,并使用media_entity_remove_links()
删除已创建的链接。
Link必须在两端都已创建的情况下才能创建。
链接具有描述其功能和状态的标志:有效值在media_create_pad_link()
和media_create_intf_link()
中描述。
七、Media图遍历
在媒体框架中,提供了API来迭代图中的entity。要遍历属于媒体设备的所有entity,驱动程序可以使用media_device_for_each_entity
宏,该宏定义在include/media/media-device.h中:
#define media_device_for_each_entity(entity, mdev) \list_for_each_entry(entity, &(mdev)->entities, graph_obj.list)
例如下列使用代码:
struct media_entity *entity;media_device_for_each_entity(entity, mdev) {
//entity will point to each entity in turn
...
}
在驱动程序中可能还需要遍历图中的所有entity,这些entity只能通过从给定entity开始的链接访问,因此媒体框架为此提供了一个深度优化的图遍历API。
注意:图遍历API不支持带有循环的图(无论是有向的还是无向的)。为了防止出现无限循环,图遍历代码将最大深度限制为
MEDIA_ENTITY_ENUM_MAX_DEPTH
,当前值定义为16。
在驱动程序中,通过调用media_graph_walk_start()
来开始一个图遍历。驱动程序可以通过调用media_graph_walk_next()
来检索下一个entity,当图遍历完成时,函数将返回NULL。
图遍历操作可以在任何时刻中断,不需要调用清理函数,可以正常释放图结构。
以下助手函数可用于查找两个给定pad之间的link,或者通过link查找连接到另一个pad的pad:
media_entity_find_link() //用于查找两个pad之间的连接。media_pad_remote_pad_first() //在连接的远端查找第一个pad。media_entity_remote_source_pad_unique() //查找一个连接到实体的远程 source pad。media_pad_remote_pad_unique() //查找一个连接到pad的远程pad。
八、使用计数和电源处理
由于在驱动程序之间关于电源管理需求存在巨大的差异,所以媒体控制器框架中不实现电源管理。但是,struct media_entity
结构中包括一个use_count
字段,媒体驱动程序可以使用该字段来跟踪每个实体的用户数量,以满足电源管理需求。
media_entity.use_count
字段由媒体驱动程序拥有,entity驱动程序不能使用它,除此之外,对该字段的访问必须受到media_device.graph_mutex
锁的保护。
九、link设置
可以通过调用media_entity_setup_link()
在运行时修改链接(struct media_link
)的属性。该函数原型如下:
int media_entity_setup_link(struct media_link *link, u32 flags)
-
link : 指向struct media_link的指针。
-
flags :标志。
十、Pipeline和Media流
媒体流是源自一个或多个源设备(如传感器)的像素或元数据流,流经媒体实体pad,流向最终接收器。媒体流可以在路由上被设备修改(例如:缩放或像素格式转换),也可以被分割成多个分支,或者进行多分支合并。
媒体管道是一组相互依赖的媒体流,这种相互依赖可能是由硬件引起的(例如,如果第一个流已启用,则无法更改第二个流的配置),也可能是由驱动程序引起的。最常见的是:媒体管道由一个没有分支的流组成。
当开始流时,驱动程序必须通知管道中的所有entity,以防止在流期间调用media_pipeline_start()
进而修改链接状态,在该函数中会将所有作为管道的pad标记为流。
pipe参数所指向的struct media_pipeline
实例将存储在管道中的每个pad中。驱动程序应该在更高级的管道结构中嵌入struct media_pipeline
,然后可以通过struct media_pad pipe
字段访问管道。
media_pipeline_start()
的调用可以嵌套。对于函数的所有嵌套调用,管道指针必须相同。
media_pipeline_start()
可能返回错误,在这种情况下,它将清除自己所做的所有更改。
当停止流时,驱动程序必须用media_pipeline_stop()
通知entity。如果多次调用media_pipeline_start()
,则需要调用相同次数的media_pipeline_stop()
来停止流。media_entity.pipe
字段将在最后一个嵌套调用停止时重置为NULL。
默认情况下,如果link的任何一端是流实体,则使用-EBUSY
配置链路将失败。
可以在流式传输时修改的链接必须使用
MEDIA_LNK_FL_DYNAMIC
标志进行标记。
如果需要禁止流实体上的其他操作(例如:更改实体配置参数),驱动程序可以显式检查media_entity stream_count
字段,以确定entity是否正在进行流操作,该操作必须在持有media_device graph_mutex
的情况下完成。
十一、链接验证
在media_pipeline_start()
函数中对pipeline中有sink pad的实体执行链接验证。media_entity.link_validate()
回调用于实现验证操作,在link_validate()
回调中,实体的驱动程序应该检查被连接实体的source pad和它自己的sink pad的属性是否匹配。匹配的实际含义取决于实体的类型(最终取决于硬件的属性)。
子系统应该通过提供特定子系统的辅助函数来访问通常需要的信息,并最终提供一种使用特定于驱动程序的回调的方法,从而促进链接验证。
十二、媒体控制器设备的分配器API
当媒体设备属于多个驱动程序时,共享媒体设备被分配为共享的struct device
以作为查找的键,共享媒体设备应该保持注册状态,直到最后一个驱动程序注销它。此外,媒体设备应在所有引用都释放时释放,在probe
期间,当分配媒体设备时,每个驱动程序都获得对媒体设备的引用,如果媒体设备已经被分配,那么allocate API会增加refcount并返回现有的媒体设备。
调用media_device_delete()
函数,媒体设备将被取消注册并从kref put处理程序中清除,以确保媒体设备保持在已注册状态,直到最后一个驱动程序取消对媒体设备的注册。
在驱动程序中的使用方法
驱动程序应该使用适当的媒体核心来管理共享媒体设备的生命周期,处理以下两种状态:
-
1、 allocate -> register -> delete
-
2、 获取已注册设备的引用 -> delete
调用media_device_delete()
函数确保能正确处理共享媒体设备的删除操作。
对于驱动.probe
操作:如果media devnode没有注册,需调用media_device_usb_allocate()
来分配或获取一个对媒体设备的引用。
对于驱动disconnect
的操作:调用media_device_delete()
释放media_device,释放由kref put处理程序完成。
【参考链接】
https://docs.kernel.org/driver-api/media/mc-core.html#c.media_device
相关文章:
【linux kernel】linux media子系统分析之media控制器设备
文章目录 一、抽象媒体设备模型二、媒体设备三、Entity四、Interfaces五、Pad六、Link七、Media图遍历八、使用计数和电源处理九、link设置十、Pipeline和Media流十一、链接验证十二、媒体控制器设备的分配器API 本文基于linux内核 4.19.4,抽象媒体设备模型框架的相…...
Scala--03
第6章 面向对象 Scala 的面向对象思想和Java 的面向对象思想和概念是一致的。 Scala 中语法和 Java 不同,补充了更多的功能。 6.1类和对象详解 6.1.1组成结构 构造函数: 在创建对象的时候给属性赋值 成员变量: 成员方法(函数) 局部变量 代码块 6.1.2构造器…...
【MongoDB】--MongoDB高级功能
目录 一、前言二、聚合管道aggregate1、示例说明2、具体代码实现一、前言 这里主要记录mongodb一些高级功能使用,如聚合。 二、聚合管道aggregate 聚合操作将来自多个文档的值组合在一起,并且可以对分组数据执行各种操作以返回单个结果,主要用于处理数据(诸如统计平均值,…...
C# new与malloc
目录 C# new与malloc C# new与malloc的区别 C# new关键字底层做的操作 C# new与malloc new关键字: new关键字在C#中用于实例化对象,并为其分配内存。它是面向对象编程的基本操作之一。使用new关键字可以在托管堆上分配内存,同时调用对象的构…...
微软MFC技术简明介绍
我是荔园微风,作为一名在IT界整整25年的老兵,今天来看一下微软MFC技术简明介绍 Visual C 与 MFC 微软公司于1992年上半年推出了C/C 7.0 产品时初次向世人介绍了MFC 1.0,这个产品包含了20,000行C原始代码,60个以上的Windows相关类…...
汽车电子Autosar之车载以太网
前言 近些年来,随着为了让汽车更加安全、智能、环保等,一系列的高级辅助驾驶功能喷涌而出。未来满足这些需求,就对传统的电子电器架构带来了严峻的考验,需要越来越多的电子部件参与信息交互,导致对网络传输速率&#x…...
MSP430_C语言例程注释详
本章选择了一些简单的C语言程序例题,这些程序的结构简单,编程技巧不多,题目虽然 简单,但是非常适合入门单片机的学习者学习MSP430单片机的C 语言编程。 如下列出了C语言例题运行的MSP430F149实验板硬件资源环境,熟悉…...
Vb+access库存管理系统(论文+开题报告+源代码+目录)
库存信息管理系统的基本问题1.1 库存信息管理系统的简介 本系统是为了提高腾达公司自动化办公的水平、经过详细的调查分析初步制定了腾达公司库存信息管理系统。基于WINDOWS 98 平台,使用Microsoft Access97, 在Visual Basic 6.0编程环境下开发的库存信息管理系统。该系统采用…...
Java 数组
在 Java 语言中,数组是一种基本的数据结构,可以存储一组相同类型的数据。本篇技术博客将详细介绍 Java 语言中的数组,包括一维数组和多维数组,以及数组的使用方法和注意事项。 一维数组 一维数组是指只有一行的数组,…...
CSDN 编程竞赛五十八期题解
竞赛总览 CSDN 编程竞赛五十八期:比赛详情 (csdn.net) 竞赛题解 题目1、打家劫舍 有一个小偷计划偷窃沿街的房屋,每间房内都藏有一定的现金,影响偷窃行为的唯一制约因素就是相邻的房屋装有相互连通的防盗系统。如果两间相邻的房屋在同一晚…...
Unity入门6——光源组件
一、参数面板 二、参数介绍 Type:光源类型 Spot:聚光灯 Range:发光距离Spot Angle:光锥角度Directional:方向光Point:点光源Area(Baked Only):面光源 仅烘焙。预先算好&…...
C语言之动态内存分配(1)
目录 本章重点 为什么存在动态内存分配 动态内存函数的介绍 malloc free calloc realloc 常见的动态内存错误 几个经典的笔试题 柔性数组 动态内存管理—自己维护自己的内存空间的大小 首先我们申请一个变量,再申请一个数组 这是我们目前知道的向内存申请…...
AIGC新时代,注意政策走向,产业方向,拥抱可信AI。需要了解基本理论,基础模型,前沿进展,产品应用,以及小小的项目复现
AIGC(AI-Generated Content,AI生成内容)是指基于生成对抗网络(GAN)、大型预训练模型等人工智能技术的方法,通过对已有数据进行学习和模式识别,以适当的泛化能力生成相关内容的技术。类似的概念还…...
如何白嫖一年CSDN会员?618活动!亲测有效!!!
活动详情 CSDN会员免费送一年,仅剩3天! 下载权益延长一年! 一年一次的机会,错过了就要再等明年! 博主已经领取到了! 会员权益 1、修改专属域名,别人都是https://blog.csdn.net/qq_xxxxxxxx&a…...
微服务: 00-rabbitmq出现的异常以及解决方案
目录 前言: 问题概述: 1. rabbitmq初始安装配置异常 -> 1.1 rabbitmq报您与此网站连接不是私密连接 --->1.1.1 上述问题解决方案 ---> 1.1.2 依次执行下面代码 -> 1.2 解决用户的No access情况 -> 1.2.1 使用设置的账号密码进行登录 -> 1.2.2 点击 Ad…...
Vue3与Vue2比较
Vue.js 3相对于Vue.js 2带来了一些重大变化,其中包括一些语法变化。 下面是Vue.js 2和Vue.js 3的一些语法差异比较: 一、语法差异比较 1.组件的注册方式不同 在Vue.js 2中,我们使用Vue.component()或者Vue.extend()方式创建一个组件。但是…...
如何对待工作中的失误?
在日复一日的工作中,我们免不了会产生一些失误,会因此感到沮丧和失望。但如何正确地对待和处理这些失误才是最重要的,它直接影响到我们的工作表现和个人成长。一起来谈谈作为职场人的你时如何处理工作中的失误的吧! 一、在面对失…...
使用css3如何实现一个文字打印效果
前言 在很多网站首页介绍页里,为了吸引用户,暂留更长时间,使用了一些css3动画的 示例效果 文字打印.gif 实现这个动画原理 想要实现这个动画,改变元素的宽度,结合动画css3关键帧实现 具体代码如下所示 <!DOCTYPE html> <html lang"en"><head><m…...
【雕爷学编程】Arduino动手做(115)---HB100多普勒雷达模块
37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&am…...
深度学习笔记之Transformer(一)注意力机制基本介绍
深度学习笔记之Transformer——注意力机制基本介绍 引言回顾: Seq2seq \text{Seq2seq} Seq2seq模型中的注意力机制注意力机制的简单描述注意力机制的机器学习范例: Nadaraya-Watson \text{Nadaraya-Watson} Nadaraya-Watson核回归 Nadaraya-Watson \text…...
基于SpringBoot的SSM整合案例 -- SpringBoot快速入门保姆级教程(四)
文章目录 前言1.设计创建数据库表tbl_book2.创建新的SpringBoot模块,勾选相关依赖3. 添加SpringBoot创建项目时没有提供的相关坐标4.根据数据库表创建实体类Book5.编写dao层操作BookDao6.编写Service服务层接口BookService7.编写服务层实现类BookServiceImpl8.编写B…...
占据80%中国企业出海市场,亚马逊云科技如何为出海客户提供更多资源和附加值
亚马逊云科技就可以做到,作为占据80%中国企业出海市场的亚马逊云科技,其覆盖全球的业务体系,从亚马逊海外购、亚马逊全球开店、亚马逊智能硬件与服务,Amazon Alexa,Amazon Music都是属于亚马逊云科技“梦之队”的一员。…...
系统架构设计师笔记第11期:信息安全的抗攻击技术
拒绝服务攻击 拒绝服务攻击(Denial of Service,DoS)是一种旨在使目标系统无法提供正常服务的攻击方式。攻击者通过向目标系统发送大量的请求或占用系统资源,超过系统的承载能力,导致系统过载或崩溃,从而使…...
TLD7002学习笔记(二)-使用S32K144驱动TLD7002
文章目录 1. 前言2. 评估板简介3. 官方驱动3.1 官网驱动的介绍3.2 官方驱动的移植3.3 官方驱动的使用 4. 参考资料 1. 前言 本篇文章是TLD7002学习笔记的第二篇,主要是介绍如何使用S32K144驱动TLD7002-16ES。为此,笔者做了一套基于TLD7002-16ES的评估板…...
[元带你学: eMMC协议详解 14] 数据擦除(Erase) 详解
依JEDEC eMMC 5.1及经验辛苦整理,付费内容,禁止转载。 所在专栏 《元带你学: eMMC协议详解》 内容摘要 全文 4200字, 主要内容介绍了各种擦除操作概念以记用法,总结了不同擦除操作的区别, 根据不同安全级别和应用场景…...
【程序人生-Hello‘s P2P】哈尔滨工业大学深入理解计算机系统大作业
计算机系统 大作业 题 目 程序人生-Hello’s P2P 专 业 xxxx 学 号 2021xxxx 班 级 210xxxx 学 生 xx 指 导 教 师 xxx 计算机科学与技术学院 2023年5月 摘 要 HelloWorld是每个程序员接触的第一个程序,表面上平平无奇的它背后却是由操作系统许多设计精巧的机制支撑…...
Android Studio入门
首先确保系统已经安装好JDK和Android SDK Android SDK的安装有两种方案 方案一:直接下载包安装 官网下载 国内下载 方案二:使用命令行工具进行安装 在Android Studio官网下载Command line tools 最新:如果使用 Android Studio,…...
r2pm -ci r2ghidra 时报错:checking pkg-config flags for r_core... no
参考网址: sys/python.sh fails with checking pkg-config flags for r_core... no Issue #1943 radareorg/radare2 GitHub 进入目录/root/.local/share/radare2/r2pm/git/r2ghidra查看configure文件,查找报错位置 执行指令 : # pkg-co…...
【宿舍管理系统】注册登录页面的实现(前端)
目录 一.创建一个jsp文件,命名为login.jsp 代码: 1. 2. 3. 4. 5. 6. 编辑 二. 创建一个css文件,并命名为style.css 1. 编辑效果如下: 编辑 代码解析: 2. 效果如下: 代码解析࿱…...
python写入excel,(二) 言简意赅傻瓜式写法
xlrd限制条数,openpyxl 上限较高,所以推荐这种写法 import openpyxl # openpyxl引入模块 def write_to_excel(path: str, sheetStr, info, data): # 实例化一个workbook对象 workbook openpyxl.Workbook() # 激活一个sheet …...
家具定制东莞网站建设/seo博客教程
1.介绍Kaldi语音识别工具将HTK比较零碎的各种各样的指令和功能进行整理集合,使用perl脚本调用。同时也加入了深度神经网络的分类器(DNN),本身由原来做HTK开发的人员制作而成,可以说是HTK的升级加强版。kaldi官方网站请见:http://k…...
wordpress默认页面设置/网页制作工具
2013年,天文学家发现了一个小型椭圆星系,然而这个椭圆星系一直是个谜。该星系没有任何特征、没有其他星系的螺旋结构,看起来像是一个被孤立的星系,仿佛与宇宙中所有的外层恒星没有任何关联。为解开离群星系之谜,天文学…...
快速建站属于saas吗/app推广拉新平台
概述 线段树就是用一棵二叉树维护某一区间内的某一值(最值,和,乘积......),主要有区间查询和区间修改两种操作,区间修改又有自上而下修改和自下而上修改两种,本人更习惯于自上而下修改。 下面是百度百科对线…...
国内可访问的海外网站和应用/百度网盘怎么找片
我们直接看代码: <meta http-equiv"refresh" content"跳转时间(秒数);urlhttps://blog.csdn.net/PanDaoxi2020(跳转链接)">...
wordpress前台登陆插件/搜索指数查询
语义分割网络对图像中的每个像素进行分类,从而对图像进行分割。语义分割的应用包括用于自动驾驶的道路分割和用于医疗诊断的癌细胞分割。本文展示了如何使用 MATLAB 训练语义分割网络 Deeplab v3,实现了自动驾驶场景下的全景分割。 本例使用剑桥大学的C…...
网站图片上传不上去是什么情况/百度电脑端网页版入口
做惯了2D的平面web设计,我突然对3D技术产生了浓厚的技术,不仅仅是因为那炫酷的效果,更是因为它用途的广泛性,随着软件编程的社会分工越来越细化,以后3D开发也有可能会从前端的大范畴里独立出来,作为一个很吃香的职业.这也不是不可能的.诚然,3D必然比web设计复杂,很多,多了一个维…...