OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【内核通信机制】上

往期知识点记录:

  • 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总
  • 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~
  • 子系统开发内核
  • 轻量系统内核(LiteOS-M)
  • 轻量系统内核(LiteOS-M)【中断管理】
  • 轻量系统内核(LiteOS-M)【任务管理】
  • 轻量系统内核(LiteOS-M)【内存管理】
  • 轻量系统内核(LiteOS-M)【内核通信机制】
  • 轻量系统内核(LiteOS-M)【时间管理】
  • 轻量系统内核(LiteOS-M)【扩展组件】
  • 轻量系统内核(LiteOS-M)【内存调测】
  • 轻量系统内核(LiteOS-M)【异常调测】
  • 轻量系统内核(LiteOS-M)【Trace调测】
  • 轻量系统内核(LiteOS-M)【LMS调测】
  • 轻量系统内核(LiteOS-M)【SHELL】
  • 小型系统内核(LiteOS-A)【概述】
  • 小型系统内核(LiteOS-A)【内核启动】
  • 小型系统内核(LiteOS-A)【中断及异常处理】
  • 标准系统内核(Linux)【New IP内核协议栈】
  • 标准系统内核(Linux)【内核增强特性 > 任务调度】
  • 持续更新中……

事件

基本概念

事件(Event)是一种任务间通信的机制,可用于任务间的同步。

多任务环境下,任务之间往往需要同步操作,一个等待即是一个同步。事件可以提供一对多、多对多的同步操作。

  • 一对多同步模型:一个任务等待多个事件的触发。可以是任意一个事件发生时唤醒任务处理事件,也可以是几个事件都发生后才唤醒任务处理事件。

  • 多对多同步模型:多个任务等待多个事件的触发。

OpenHarmony LiteOS-A的事件模块提供的事件,具有如下特点:

  • 任务通过创建事件控制块来触发事件或等待事件。

  • 事件间相互独立,内部实现为一个32位无符号整型,每一位标识一种事件类型。(0表示该时间类型未发生,1表示该事件类型已经发生,一共31种事件类型,第25bit位(0x02U << 24)系统保留)

  • 事件仅用于任务间的同步,不提供数据传输功能。

  • 多次向事件控制块写入同一事件类型,在被清零前等效于只写入一次。

  • 多个任务可以对同一事件进行读写操作。

  • 支持事件读写超时机制。

运行机制

事件控制块

/*** 事件控制块数据结构*/
typedef struct tagEvent {UINT32 uwEventID;        /* 事件集合,表示已经处理(写入和清零)的事件集合 */LOS_DL_LIST stEventList; /* 等待特定事件的任务链表 */
} EVENT_CB_S, *PEVENT_CB_S;

事件运作原理

事件初始化:会创建一个事件控制块,该控制块维护一个已处理的事件集合,以及等待特定事件的任务链表。

写事件:会向事件控制块写入指定的事件,事件控制块更新事件集合,并遍历任务链表,根据任务等待具体条件满足情况决定是否唤醒相关任务。

读事件:如果读取的事件已存在时,会直接同步返回。其他情况会根据超时时间以及事件触发情况,来决定返回时机:等待的事件条件在超时时间耗尽之前到达,阻塞任务会被直接唤醒,否则超时时间耗尽该任务才会被唤醒。

读事件条件满足与否取决于入参eventMask和mode,eventMask即需要关注的事件类型掩码。mode是具体处理方式,分以下三种情况:

  • LOS_WAITMODE_AND:逻辑与,基于接口传入的事件类型掩码eventMask,只有这些事件都已经发生才能读取成功,否则该任务将阻塞等待或者返回错误码。

  • LOS_WAITMODE_OR:逻辑或,基于接口传入的事件类型掩码eventMask,只要这些事件中有任一种事件发生就可以读取成功,否则该任务将阻塞等待或者返回错误码。

  • LOS_WAITMODE_CLR:这是一种附加读取模式,需要与所有事件模式或任一事件模式结合使用(LOS_WAITMODE_AND | LOS_WAITMODE_CLR或 LOS_WAITMODE_OR | LOS_WAITMODE_CLR)。在这种模式下,当设置的所有事件模式或任一事件模式读取成功后,会自动清除事件控制块中对应的事件类型位。

事件清零:根据指定掩码,去对事件控制块的事件集合进行清零操作。当掩码为0时,表示将事件集合全部清零。当掩码为0xffff时,表示不清除任何事件,保持事件集合原状。

事件销毁:销毁指定的事件控制块。

图1 小型系统事件运作原理图

开发指导

接口说明

OpenHarmony LiteOS-A内核的事件模块提供下面几种功能。

表1 事件模块接口

功能分类接口描述
初始化事件LOS_EventInit:初始化一个事件控制块
读/写事件- LOS_EventRead:读取指定事件类型,超时时间为相对时间:单位为Tick
- LOS_EventWrite:写指定的事件类型
清除事件LOS_EventClear:清除指定的事件类型
校验事件掩码- LOS_EventPoll:根据用户传入的事件ID、事件掩码及读取模式,返回用户传入的事件是否符合预期
- LOS_EventDestroy:销毁指定的事件控制块
销毁事件LOS_EventDestroy:销毁指定的事件控制块

开发流程

事件的典型开发流程:

  1. 初始化事件控制块

  2. 阻塞读事件控制块

  3. 写入相关事件

  4. 阻塞任务被唤醒,读取事件并检查是否满足要求

  5. 处理事件控制块

  6. 事件控制块销毁

说明:

  • 进行事件读写操作时,事件的第25bit(0x02U << 24)为保留bit位,不可以进行位设置。

  • 对同一事件反复写入,算作一次写入。

编程实例

实例描述

示例中,任务Example_TaskEntry创建一个任务Example_Event,Example_Event读事件阻塞,Example_TaskEntry向该任务写事件。可以通过示例日志中打印的先后顺序理解事件操作时伴随的任务切换。

  1. 在任务Example_TaskEntry创建任务Example_Event,其中任务Example_Event优先级高于Example_TaskEntry。

  2. 在任务Example_Event中读事件0x00000001,阻塞,发生任务切换,执行任务Example_TaskEntry。

  3. 在任务Example_TaskEntry向任务Example_Event写事件0x00000001,发生任务切换,执行任务Example_Event。

  4. Example_Event得以执行,直到任务结束。

  5. Example_TaskEntry得以执行,直到任务结束。

编程示例

本演示代码在./kernel/liteos_a/testsuites/kernel/src/osTest.c中编译验证,在TestTaskEntry中调用验证入口函数Example_EventEntry。

示例代码如下:

#include "los_event.h"
#include "los_task.h"
#include "securec.h"/* 任务ID */
UINT32 g_testTaskId;/* 事件控制结构体 */
EVENT_CB_S g_exampleEvent;/* 等待的事件类型 */
#define EVENT_WAIT      0x00000001
#define EVENT_TIMEOUT   500
/* 用例任务入口函数 */
VOID Example_Event(VOID)
{UINT32 event;/* 超时等待方式读事件,超时时间为100 ticks, 若100 ticks后未读取到指定事件,读事件超时,任务直接唤醒 */dprintf("Example_Event wait event 0x%x \n", EVENT_WAIT);event = LOS_EventRead(&g_exampleEvent, EVENT_WAIT, LOS_WAITMODE_AND, EVENT_TIMEOUT);if (event == EVENT_WAIT) {dprintf("Example_Event,read event :0x%x\n", event);} else {dprintf("Example_Event,read event timeout\n");}
}UINT32 Example_EventEntry(VOID)
{UINT32 ret;TSK_INIT_PARAM_S task1;/* 事件初始化 */ret = LOS_EventInit(&g_exampleEvent);if (ret != LOS_OK) {dprintf("init event failed .\n");return -1;}/* 创建任务 */(VOID)memset_s(&task1, sizeof(TSK_INIT_PARAM_S), 0, sizeof(TSK_INIT_PARAM_S));task1.pfnTaskEntry = (TSK_ENTRY_FUNC)Example_Event;task1.pcName       = "EventTsk1";task1.uwStackSize  = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE;task1.usTaskPrio   = 5;ret = LOS_TaskCreate(&g_testTaskId, &task1);if (ret != LOS_OK) {dprintf("task create failed.\n");return LOS_NOK;}/* 写g_testTaskId 等待事件 */dprintf("Example_TaskEntry write event.\n");ret = LOS_EventWrite(&g_exampleEvent, EVENT_WAIT);if (ret != LOS_OK) {dprintf("event write failed.\n");return LOS_NOK;}/* 清标志位 */dprintf("EventMask:%d\n", g_exampleEvent.uwEventID);LOS_EventClear(&g_exampleEvent, ~g_exampleEvent.uwEventID);dprintf("EventMask:%d\n", g_exampleEvent.uwEventID);return LOS_OK;
}

结果验证

编译运行得到的结果为:

Example_Event wait event 0x1 
Example_TaskEntry write event.
Example_Event,read event :0x1
EventMask:1
EventMask:0

信号量

基本概念

信号量(Semaphore)是一种实现任务间通信的机制,可以实现任务间同步或共享资源的互斥访问。

一个信号量的数据结构中,通常有一个计数值,用于对有效资源数的计数,表示剩下的可被使用的共享资源数,其值的含义分两种情况:

  • 0,表示该信号量当前不可获取,因此可能存在正在等待该信号量的任务。

  • 正值,表示该信号量当前可被获取。

以同步为目的的信号量和以互斥为目的的信号量在使用上有如下不同:

  • 用作互斥时,初始信号量计数值不为0,表示可用的共享资源个数。在需要使用共享资源前,先获取信号量,然后使用一个共享资源,使用完毕后释放信号量。这样在共享资源被取完,即信号量计数减至0时,其他需要获取信号量的任务将被阻塞,从而保证了共享资源的互斥访问。另外,当共享资源数为1时,建议使用二值信号量,一种类似于互斥锁的机制。

  • 用作同步时,初始信号量计数值为0。任务1因获取不到信号量而阻塞,直到任务2或者某中断释放信号量,任务1才得以进入Ready或Running态,从而达到了任务间的同步。

运行机制

信号量控制块

/*** 信号量控制块数据结构*/
typedef struct {UINT16            semStat;          /* 信号量状态 */UINT16            semType;          /* 信号量类型 */UINT16            semCount;         /* 信号量计数 */UINT16            semId;            /* 信号量索引号 */LOS_DL_LIST       semList;          /* 用于插入阻塞于信号量的任务 */
} LosSemCB;

信号量运作原理

信号量允许多个任务在同一时刻访问共享资源,但会限制同一时刻访问此资源的最大任务数目。当访问资源的任务数达到该资源允许的最大数量时,会阻塞其他试图获取该资源的任务,直到有任务释放该信号量。

  • 信号量初始化 初始化时为配置的N个信号量申请内存(N值可以由用户自行配置,通过LOSCFG_BASE_IPC_SEM_LIMIT宏实现),并把所有信号量初始化成未使用,加入到未使用链表中供系统使用

  • 信号量创建 从未使用的信号量链表中获取一个信号量,并设定初值。

  • 信号量申请 若其计数器值大于0,则直接减1返回成功。否则任务阻塞,等待其它任务释放该信号量,等待的超时时间可设定。当任务被一个信号量阻塞时,将该任务挂到信号量等待任务队列的队尾。

  • 信号量释放 若没有任务等待该信号量,则直接将计数器加1返回。否则唤醒该信号量等待任务队列上的第一个任务。

  • 信号量删除 将正在使用的信号量置为未使用信号量,并挂回到未使用链表。

运行示意图如下图所示:

图1 小型系统信号量运作示意图

开发指导

接口说明

表1 创建/删除信号量

接口名称描述
LOS_SemCreate创建信号量,返回信号量ID
LOS_BinarySemCreate创建二值信号量,其计数值最大为1
LOS_SemDelete删除指定的信号量

表2 申请/释放信号量

接口名称描述
LOS_SemPend申请指定的信号量,并设置超时时间
LOS_SemPost释放指定的信号量

开发流程

  1. 创建信号量LOS_SemCreate,若要创建二值信号量则调用LOS_BinarySemCreate。

  2. 申请信号量LOS_SemPend。

  3. 释放信号量LOS_SemPost。

  4. 删除信号量LOS_SemDelete。

说明: 由于中断不能被阻塞,因此不能在中断中使用阻塞模式申请信号量。

编程实例

实例描述

本实例实现如下功能:

  1. 测试任务ExampleSem创建一个信号量,锁任务调度,创建两个任务ExampleSemTask1、ExampleSemTask2, ExampleSemTask2优先级高于ExampleSemTask1,两个任务中申请同一信号量,解锁任务调度后两任务阻塞,测试任务ExampleSem释放信号量。

  2. ExampleSemTask2得到信号量,被调度,然后任务休眠20Ticks,ExampleSemTask2延迟,ExampleSemTask1被唤醒。

  3. ExampleSemTask1定时阻塞模式申请信号量,等待时间为10Ticks,因信号量仍被ExampleSemTask2持有,ExampleSemTask1挂起,10Ticks后仍未得到信号量,ExampleSemTask1被唤醒,试图以永久阻塞模式申请信号量,ExampleSemTask1挂起。

  4. 20Tick后ExampleSemTask2唤醒, 释放信号量后,ExampleSemTask1得到信号量被调度运行,最后释放信号量。

  5. ExampleSemTask1执行完,400Ticks后任务ExampleSem被唤醒,执行删除信号量。

编程示例

本演示代码在./kernel/liteos_a/testsuites/kernel/src/osTest.c中编译验证,在TestTaskEntry中调用验证入口函数ExampleSem。

示例代码如下:

#include "los_sem.h"
#include "securec.h"/* 任务ID */
static UINT32 g_testTaskId01;
static UINT32 g_testTaskId02;/* 测试任务优先级 */
#define TASK_PRIO_LOW   5
#define TASK_PRIO_HI    4/* 信号量结构体id */
static UINT32 g_semId;VOID ExampleSemTask1(VOID)
{UINT32 ret;dprintf("ExampleSemTask1 try get sem g_semId, timeout 10 ticks.\n");/* 定时阻塞模式申请信号量,定时时间为10ticks */ret = LOS_SemPend(g_semId, 10);/* 申请到信号量 */if (ret == LOS_OK) {LOS_SemPost(g_semId);return;}/* 定时时间到,未申请到信号量 */if (ret == LOS_ERRNO_SEM_TIMEOUT) {dprintf("ExampleSemTask1 timeout and try get sem g_semId wait forever.\n");/*永久阻塞模式申请信号量*/ret = LOS_SemPend(g_semId, LOS_WAIT_FOREVER);dprintf("ExampleSemTask1 wait_forever and get sem g_semId.\n");if (ret == LOS_OK) {dprintf("ExampleSemTask1 post sem g_semId.\n");LOS_SemPost(g_semId);return;}}
}VOID ExampleSemTask2(VOID)
{UINT32 ret;dprintf("ExampleSemTask2 try get sem g_semId wait forever.\n");/* 永久阻塞模式申请信号量 */ret = LOS_SemPend(g_semId, LOS_WAIT_FOREVER);if (ret == LOS_OK) {dprintf("ExampleSemTask2 get sem g_semId and then delay 20 ticks.\n");}/* 任务休眠20 ticks */LOS_TaskDelay(20);dprintf("ExampleSemTask2 post sem g_semId.\n");/* 释放信号量 */LOS_SemPost(g_semId);return;
}UINT32 ExampleSem(VOID)
{UINT32 ret;TSK_INIT_PARAM_S task1;TSK_INIT_PARAM_S task2;/* 创建信号量 */LOS_SemCreate(0, &g_semId);/* 锁任务调度 */LOS_TaskLock();/* 创建任务1 */(VOID)memset_s(&task1, sizeof(TSK_INIT_PARAM_S), 0, sizeof(TSK_INIT_PARAM_S));task1.pfnTaskEntry = (TSK_ENTRY_FUNC)ExampleSemTask1;task1.pcName       = "TestTask1";task1.uwStackSize  = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE;task1.usTaskPrio   = TASK_PRIO_LOW;ret = LOS_TaskCreate(&g_testTaskId01, &task1);if (ret != LOS_OK) {dprintf("task1 create failed .\n");return LOS_NOK;}/* 创建任务2 */(VOID)memset_s(&task2, sizeof(TSK_INIT_PARAM_S), 0, sizeof(TSK_INIT_PARAM_S));task2.pfnTaskEntry = (TSK_ENTRY_FUNC)ExampleSemTask2;task2.pcName       = "TestTask2";task2.uwStackSize  = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE;task2.usTaskPrio   = TASK_PRIO_HI;ret = LOS_TaskCreate(&g_testTaskId02, &task2);if (ret != LOS_OK) {dprintf("task2 create failed.\n");return LOS_NOK;}/* 解锁任务调度 */LOS_TaskUnlock();/* 任务休眠400 ticks */LOS_TaskDelay(400);ret = LOS_SemPost(g_semId);/* 任务休眠400 ticks */LOS_TaskDelay(400);/* 删除信号量 */LOS_SemDelete(g_semId);return LOS_OK;
}

结果验证

编译运行得到的结果为:

ExampleSemTask2 try get sem g_semId wait forever.
ExampleSemTask1 try get sem g_semId, timeout 10 ticks.
ExampleSemTask1 timeout and try get sem g_semId wait forever.
ExampleSemTask2 get sem g_semId and then delay 20 ticks.
ExampleSemTask2 post sem g_semId.
ExampleSemTask1 wait_forever and get sem g_semId.
ExampleSemTask1 post sem g_semId.

经常有很多小伙伴抱怨说:不知道学习鸿蒙开发哪些技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?

为了能够帮助到大家能够有规划的学习,这里特别整理了一套纯血版鸿蒙(HarmonyOS Next)全栈开发技术的学习路线,包含了鸿蒙开发必掌握的核心知识要点,内容有(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、WebGL、元服务、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、OpenHarmony驱动开发、系统定制移植等等)鸿蒙(HarmonyOS NEXT)技术知识点。

在这里插入图片描述

《鸿蒙 (Harmony OS)开发学习手册》(共计892页):https://gitcode.com/HarmonyOS_MN/733GH/overview

如何快速入门?

1.基本概念
2.构建第一个ArkTS应用
3.……

开发基础知识:

1.应用基础知识
2.配置文件
3.应用数据管理
4.应用安全管理
5.应用隐私保护
6.三方应用调用管控机制
7.资源分类与访问
8.学习ArkTS语言
9.……

在这里插入图片描述

基于ArkTS 开发

1.Ability开发
2.UI开发
3.公共事件与通知
4.窗口管理
5.媒体
6.安全
7.网络与链接
8.电话服务
9.数据管理
10.后台任务(Background Task)管理
11.设备管理
12.设备使用信息统计
13.DFX
14.国际化开发
15.折叠屏系列
16.……

在这里插入图片描述

鸿蒙开发面试真题(含参考答案):https://gitcode.com/HarmonyOS_MN/733GH/overview

在这里插入图片描述

OpenHarmony 开发环境搭建

图片

《OpenHarmony源码解析》:https://gitcode.com/HarmonyOS_MN/733GH/overview

  • 搭建开发环境
  • Windows 开发环境的搭建
  • Ubuntu 开发环境搭建
  • Linux 与 Windows 之间的文件共享
  • ……
  • 系统架构分析
  • 构建子系统
  • 启动流程
  • 子系统
  • 分布式任务调度子系统
  • 分布式通信子系统
  • 驱动子系统
  • ……

图片

OpenHarmony 设备开发学习手册:https://gitcode.com/HarmonyOS_MN/733GH/overview

图片
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1540245.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

力扣 18.四数之和

文章目录 题目介绍解法 题目介绍 解法 思路和 15. 三数之和 一样&#xff0c;排序后&#xff0c;枚举 nums[a] 作为第一个数&#xff0c;枚举 nums[b] 作为第二个数&#xff0c;那么问题变成找到另外两个数&#xff0c;使得这四个数的和等于 target&#xff0c;这可以用双指针…

《线性代数》常用公式定理总结

文章目录 1 行列式1.1 克拉默法则1.2 基本性质1.3 余子式 M i j M_{ij} Mij​1.4 代数余子式 A i j ( − 1 ) i j ⋅ M i j A_{ij} (-1)^{ij} \cdot M_{ij} Aij​(−1)ij⋅Mij​1.5 具体型行列式计算&#xff08;化为基本型&#xff09;1.5.1 主对角线行列式&#xff1a;主…

git 本地分支误删,怎么恢复?误删本地已提交未推送的分支!

误删本地已提交未推送的分支&#xff01; 前提&#xff1a; 已提交&#xff01; 重点&#xff1a;未推送&#xff01; 要是推送了&#xff0c;再拉一下代码就行了。你也不会来搜这个帖子了。 如果你删除的分支里有你未提交的代码&#xff0c;不用往下看了&#xff0c;帮不到你…

树莓派4B+UBUNTU20.04+静态ip+ssh配置

树莓派4B+UBUNTU20.04+静态ip+ssh配置 1.烧录Ubuntu镜像1.1选择pi 4b1.2选择ubuntu server (服务器版,无桌面)20.041.3选择sd卡1.4 点击右下角 NEXT ,编辑设置,输入密码,wifi选CN, 开启ssh1.5 烧录,依次点击“是”,等待完成2 烧录完成后装入树莓派,上电,等待系统完成配…

电竞显示器哪个牌子好

电竞显示器哪个好&#xff1f;你想成为电竞选手吗&#xff1f;显示器很关键&#xff0c;下面我就列举7款市面流行的电竞显示器给大家看看&#xff0c;总有一款适合你。 1.电竞显示器哪个好 - 蚂蚁电竞 ANT255VF电竞显示器 一、产品概述 蚂蚁电竞 ANT255VF电竞显示器是一款专为…

鱼哥好书分享活动第31期:如何构建出更好的大模型RAG系统?《大模型RAG实战》

鱼哥好书分享活动第31期&#xff1a;如何构建出更好的大模型RAG系统&#xff1f;《大模型RAG实战》 S1 初级RAGS2 高级RAG模型测策略测模型微调测 S3 超级RAG购买链接&#xff1a;内容简介&#xff1a;赠书抽奖规则: ChatGPT爆火之后&#xff0c;以ChatPDF为首的产品组合掀起了…

Node-red 某一时间范围内满足条件的数据只返回一次

厂子里有个业务需求增加一段逻辑&#xff0c;根据点位数值&#xff0c;判断是否让mes执行之后的逻辑。 网关采集周期5s/次&#xff0c;及数据上报周期5s/次; iot通过网关写入时间为8s左右&#xff1b; 同类设备共用一条规则链&#xff1b; 想当触发条件时修改”完成上传“不…

简单题67.二进制求和 (java)20240919

题目描述&#xff1a; Java&#xff1a; class Solution {public String addBinary(String a, String b) {StringBuilder result new StringBuilder();int i a.length()-1;int j b.length()-1;int carry 0; //记录进位信息while(i>0 || j>0 || carry!0){int sum ca…

[Linux#55][网络协议] 序列化与反序列化 | TcpCalculate为例

目录 1. 理解协议 1.1 结构化数据的传输 序列化与反序列化 代码感知&#xff1a; Request 类 1. 构造函数 2. 序列化函数&#xff1a;Serialize() 3. 反序列化函数&#xff1a;DeSerialize() 补充 4. 成员变量 Response 类 1. 构造函数 2. 序列化函数&#xff1a;…

免费下载PDF | 自然语言处理新范式:基于预训练模型的方法

前言 本次给大家推荐阅读的书籍是——《自然语言处理&#xff1a;基于预训练模型的方法》。近些年来&#xff0c;以GPT、BERT为代表的预训练模型在自然语言处理领域掀起了一股浪潮&#xff0c;打开了“预训练精调”的自然语言处理新范式的大门。 由电子工业出版社出版的《自然…

动手学深度学习(pytorch土堆)-06损失函数与反向传播、模型训练、GPU训练

模型保存与读取 完整模型训练套路 import torch import torchvision.datasets from torch import nn from torch.nn import Conv2d, MaxPool2d, Flatten, Linear from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriterfrom model impo…

AV1 Bitstream Decoding Process Specification--[7]: 语法结构语义-3

原文地址&#xff1a;https://aomediacodec.github.io/av1-spec/av1-spec.pdf 没有梯子的下载地址&#xff1a;AV1 Bitstream & Decoding Process Specification摘要&#xff1a;这份文档定义了开放媒体联盟&#xff08;Alliance for Open Media&#xff09;AV1视频编解码…

分发饼干00

题目链接 分发饼干 题目描述 注意点 1 < g[i], s[j] < 2^31 - 1目标是满足尽可能多的孩子&#xff0c;并输出这个最大数值 解答思路 可以先将饼干和孩子的胃口都按升序进行排序&#xff0c;随后根据双指针 贪心&#xff0c;将当前满足孩子胃口的最小饼干分配给该孩…

再次理解UDP协议

一、再谈端口号 在 TCP / IP 协议中&#xff0c;用 "源 IP", "源端口号", "目的 IP", "目的端口号", "协议号" 这样一个五元组来标识一个通信(可以通过 netstat -n 查看) 我们需要端口号到进程的唯一性&#xff0c;所以一个…

Obsidian如何粘贴的图片类似于Typora,图片相对当前路径

添加插件 下载插件&#xff1a; Custom Attachment Location 基础设置 同时需要在下面进行设置 示意效果

大数据多集群数据作业和集群状态监控

目前手里面有四套大数据集群的作业需要维护&#xff0c;分别属于不同的客户&#xff0c;我同岗位的兄弟离职后&#xff0c;所有的数据作业都落到我头上了&#xff0c;公司也不招人了。开发新的数据作业倒没有什么问题&#xff0c;就是客户叫我补数的时候&#xff0c;头比较大&a…

Linux基础权限

Linux基础权限 shell的概念Linux基础权限Linux的两种用户Linux的权限管理权限认知权限设置权限掩码粘滞位 shell的概念 &#xff08;shell&#xff09;命令行解释器 的存在意义&#xff1a; 将用户的命令翻译给操作系统&#xff0c;然后返回OS的结果给用户&#xff1b;保护OS…

YOLOv5图像识别教程包成功-以识别桥墩缺陷详细步骤分享

前置环境资源下载 提示&#xff1a;要开外网才能下载的环境我都放在了网盘里&#xff0c;教程中用到的环境可从这里一并下载&#xff1a; https://pan.quark.cn/s/f0c36aa1ef60 1. 下载YOLOv5源码 官方地址&#xff1a;GitHub - ultralytics/yolov5: YOLOv5 &#x1f680; …

9.4 溪降技术:带包下降

目录 9.4 携包下降概述观看视频课程电子书&#xff1a;携包下降在瀑布中管理背包扔背包滑索传送背包固定到安全带 V7 提示&#xff1a;将背包固定到安全带总结 9.4 携包下降 概述 在水流和悬崖边缘携包下降是最危险的情况&#xff01; 正如我们之前所学&#xff0c;在峡谷探险中…

流程型制造业MES系统的特点及主要功能介绍

流程型MES系统的应用程度较高。特别是石油石化行业原有自动化和信息化的程度较高&#xff0c;一般应用在于生产管控&#xff0c;mes系统的应用主要目的是使得最容易出现产品质量的配料、投料以及乳化加工过程得到管控和追溯。 随着生产工艺发展&#xff0c;石化行业MES系统应用…