第十八节 多核异构核间通信–ipcc

2023-11-18

由于MP157 是一款多核异构的芯片,其中既包含的高性能的A7 核及实时性强的M4 内核,那么这两种处理器在工作时,怎么互相协调配合呢?这就涉及到了核间通信的概念了。

IPCC (inter-processor communication controller) 用于处理器间的数据交换的通知。它提供了一种非阻塞的信号机制,并提供原子的方式进行信号发布和信息检索。注意,核间通信的共享内存缓冲区是在MCU 的SRAM 中分配的,它不是IPCC 外设的一部分。

外设简述

IPCC 外设提供了硬件支持,来管理两个处理器实例之间的处理器间通信。每个处理器拥有特定的寄存器区域和中断。有点像硬件信号量的功能。

IPCC 提供了六个双向通道信号。每个通道分为两个子通道,每个子通道提供从“发送方”处理器到“接收方”处理器的单向信号:

  • P1_TO_P2 子通道(从P1 发到P2)
  • P2_TO_P1 子通道(从P2 发到P1)

子通道中包括如下功能:

  • 一个标志位,用于标识通道正在被占用和空闲的两种状态,这个标志被“发送方”处理器设置为被占用,并被“接收方”处理器清除。
  • 两个相关的中断(所有通道都共享):
    – RXO: RX 通道被占用,连接到“接收器”处理器。
    – TXF: TX 通道空闲,连接到“发送”处理器。
  • 带多路复用的中断掩码功能。

IPCC 支持以下信道的操作模式:
- 单工通信方式:
– 仅使用一个子信道。
– 单向消息:“发送者”处理器将通信数据发布到内存中后,它将通道状态标志设置为已占用。当消息被处理时,“接收者”处理器清除该标志。

  • 半双工通讯方式:
    – 仅使用一个子信道。
    – 双向消息:“发送者”处理器将通信数据发布到内存中后,它将通道状态标志设置为已占用。当消息被处理并且响应在共享内存中可用时,“接收器”处理器将清除该标志。
  • 全双工通讯方式:
    – 子通道用于异步模式。
    – 通过将子通道状态标志设置为占用,任何处理器都可以异步发布消息。当消息被处理时,“接收者”处理器清除该标志。可以将这种模式视为给定通道上两个单工模式的组合。

核间通信的模型如下:

在这里插入图片描述

框架简述

IPCC 作为核间通信的桥梁,它仅承担着通知的角色,负责消息的分发、中断的处理等。

实际上,IPCC 外设这个角色只是多核异构核间通信中的一块,在我们使用多核异构核间通信时,往往不仅希望使用到核间的消息通知,还希望能在不同的核心中进行数据的交互(比如M4 核进行实时的AD 数据采集处理,完成后,M4 核可通过异构的框架将数据呈递给A7 核,A7 核再进行更复杂的应用)。那么在这个需求的驱动下,就出现了一些框架相互配合使用的情况了,下面我们就给大家介绍这些内核框架。

RemoteProc framework

远程处理器框架(RPROC、RemoteProc)允许不同的平台/体系结构控制(打开电源,加载固件,关闭电源)远程处理器,同时抽象出硬件差异。此外,它还提供监视和调试远程协处理器的服务。

以MP157 为例,其RemoteProc 可分为两块,分别是A7 核端、M4 核端:

remoteproc:这是远程处理器框架的通用部分(在MP157 中为A7 核端)。

它的作用是:

- 将ELF 固件加载到远程处理器内存中。
- 解析固件资源表以设置关联的资源(例如IPC,内存分割和跟踪)。
- 控制远程处理器的执行(启动,停止⋯)。
- 提供监视和调试远程固件的服务。

stm32_rproc:这是远程处理器平台驱动程序(在MP157 中为M4 核端)。

它的作用是:

- 将stm32 特定的功能(回调)注册到RPROC 框架。
- 处理与远程处理器关联的平台资源(例如寄存器,看门狗,复位,时钟和存储器)。
- 通过邮箱框架将通知(通知)转发到远程处理器。

ST 官方参考资料:
https://wiki.stmicroelectronics.cn/stm32mpu/wiki/Linux_RPMsg_framework_overview

RPMsg framework

此小节为大家简述有关Linux RPMsg 框架的内容。RPMsg 框架是一个基于virtio 的消息总线,它允许本地处理器与系统上可用的远程处理器通信。

此框架在多核异构中承担的角色如下图:

在这里插入图片描述

Linux RPMsg 框架是在virtio 框架顶层上实现的消息传送框架,其用于主机和远程处理器进行通信。它基于virtio vring,可通过共享内存向远程CPU 发送消息或从远程CPU 接收消息。

这些vring 是单向的,一个vring 专用于发送到远程处理器的消息,另一个vring 用于从远程处理器接收的消息。此外,共享缓冲区需要在两个处理器都可见的内存空间中创建。

当新消息在共享缓冲区中等待时,会使用到另一个框架Linux Mailbox framework ,该框架将用于通知对应的Core。

依靠这些框架,RPMsg 框架实现了基于不同通道的通信。通道可被文本名称标识,并有一个本地(“源”) 的RPMsg 地址和一个远程(“目的”) 的RPMsg 地址。

在远程处理器端(MP157 则为M4 核),也必须使用RPMSG 框架。RPMSG 框架的实现存在几种解决方案,ST 建议使用OpenAMP 方案,并在SDK 中给出了示例。

Github OpenAMP 框架.

简单来说,MP157 的A7 核与M4 核,通过一个标准的RPMsg 框架来建立起联系,完成数据传递。

在这里插入图片描述

具体原理可以参考:

RPMsg-Messaging-Protocol .
RPMsg-Communication-Flow .

Linux 内核源码目录给出的rpmsg client 的示例代码位置如下:

samples/rpmsg/rpmsg_client_sample.c

rpmsg 框架Linux 内核驱动源码位于:

drivers/rpmsg

ST 官方参考资料:

https://wiki.stmicroelectronics.cn/stm32mpu/wiki/Linux_remoteproc_framework_overview

Mailbox framework

此小节为大家简述有关Linux 邮箱框架的内容。邮箱框架涉及异构多核系统的处理器间通信。

此框架的结构如下图:

在这里插入图片描述

邮箱框架被用于内核间进行消息或信号的交换,常用于主机和协处理器间。邮箱由以下模块组成:

  • 一个邮箱控制器(mailbox controller),依赖于硬件平台实现,比如MP157 的IPCC 外设:
    – 它负责配置和处理来自IPCC 外围设备的IRQ。
    – 它为邮箱客户端提供了通用API。

  • 一个邮箱客户端(mailbox client),负责发送或接收消息。

关于此框架的权威描述,在内核文档中的如下目录:

Documentation/mailbox.txt

一般而言mailbox controller 和client 都由芯片厂商来负责实现,因为这依赖于外设。我们更常关注的,则是mailbox client 的创建和使用。

ST 实现的mailbox client 代码位置如下:

drivers/remoteproc/stm32_rproc.c

在内核中还给出了一份mailbox client 的示例驱动代码,代码通过debugfs 子系统,将mailbox 的操作暴露给了用户空间,用户可以直接通过debugfs 来使用mailbox,进行消息在不同内核中的传递。

mailbox 框架的设备树描述可参考内核源码文档:

Documentation/devicetree/bindings/mailbox/mailbox.txt

一个简单的mailbox client 设备树节点,可以参考内核源码目录:

Documentation/devicetree/bindings/mailbox/sti-mailbox.txt

内核源码目录给出的mailbox client 的示例代码位置如下:

drivers/mailbox/mailbox-test.c

ST 官方参考资料:

https://wiki.stmicroelectronics.cn/stm32mpu/wiki/Linux_Mailbox_framework_overview

框架小结

前面介绍了三个框架,它们并不是独立工作的,而是相互协调的,彼此关联。我们可以通过两张图来查看它们之间的关系。

以RemoteProc 框架为主视角出发:

在这里插入图片描述

可以理清三个框架的关系,RemoteProc 可以说是骨架,关联到了RPMsg 框架、Mailbox 框架。

设备树插件描述

IPCC 设备树节点

设备树节点位于arch/arm/boot/dts/stm32mp157c.dtsi

列表1: IPCC 设备树节点

ipcc: mailbox@4c001000 {
	compatible = "st,stm32mp1-ipcc";
	#mbox-cells = <1>;
	reg = <0x4c001000 0x400>;
	st,proc-id = <0>;
	interrupts-extended =
		<&intc GIC_SPI 100 IRQ_TYPE_LEVEL_HIGH>,
		<&intc GIC_SPI 101 IRQ_TYPE_LEVEL_HIGH>,
		<&exti 61 1>;
	interrupt-names = "rx", "tx", "wakeup";
	clocks = <&rcc IPCC>;
	wakeup-source;
	power-domains = <&pd_core>;
	status = "disabled";
};

使用节点位于arch/arm/boot/dts/stm32mp157a-basic.dts

列表2: 使用IPCC 设备树节点

&ipcc {
	status = "okay";
};

设备树中的compatible =“st,stm32mp1-ipcc”属性,会匹配到drivers/mailbox/stm32-ipcc.c 驱动程序,驱动程序中会创建一个mbox controller。

A7<–>M4 rproc 设备树节点

设备树节点位于arch/arm/boot/dts/stm32mp157c.dtsi

列表3: rproc 设备树节点

m4_rproc: m4@0 {
	compatible = "st,stm32mp1-rproc";
	#address-cells = <1>;
	#size-cells = <1>;

	ranges = <0x00000000 0x38000000 0x10000>,
			<0x30000000 0x30000000 0x60000>,
			<0x10000000 0x10000000 0x60000>;
	resets = <&rcc MCU_R>;
	reset-names = "mcu_rst";
	st,syscfg-pdds = <&pwr 0x014 0x1>;
	st,syscfg-holdboot = <&rcc 0x10C 0x1>;
	st,syscfg-tz = <&rcc 0x000 0x1>;
	st,syscfg-rsc-tbl = <&tamp 0x144 0xFFFFFFFF>;
	status = "disabled";

	m4_system_resources {
		compatible = "rproc-srm-core";
		status = "disabled";
	};
};

使用节点位于arch/arm/boot/dts/stm32mp157a-basic.dts

列表4: 使用rproc 设备树节点

&m4_rproc {
	memory-region = <&retram>, <&mcuram>, <&mcuram2>, <&vdev0vring0>,
				<&vdev0vring1>, <&vdev0buffer>;
	mboxes = <&ipcc 0>, <&ipcc 1>, <&ipcc 2>;
	mbox-names = "vq0", "vq1", "shutdown";
	interrupt-parent = <&exti>;
	interrupts = <68 1>;
	interrupt-names = "wdg";
	wakeup-source;
	recovery;
	status = "okay";
};

设备树中的compatible = “st,stm32mp1-rproc” 属性, 会匹配到drivers/remoteproc/stm32_rproc.c 驱动程序,驱动程序中会创建一个mbox client,并基于RemoteProc、RPMsg框架与mbox client 进行关联。

实验代码简述

这里我们就简单讲解一下M4 核端的代码和一些概念,更详细的内容则需大家自己研究了。

rpmsg 框架下有通信端点的概念,数据在两个端点间传输。端点间的数据传输是rpmsg 框架下数据传输最原始的形式,我们可以在原始的数据传输形式上再做一层封装,抽象出一些特定类型的设备。

每个端点注册的底层实现,就是一个内核设备的注册(使用的是平台总线模型),故注册的端点设备,可以利用到驱动的Probe 功能(具体实现详见drivers/rpmsg/rpmsg_core.c 300 行后内容)。

在M4 端,通过调用openamp 库中的OPENAMP_create_endpoint 函数,并在调用时指定参数name(即为设备名称),即可在内核中注册一个对应的rpmsg 框架平台设备,该设备最终可以通过name(设备名称)来匹配到相应的A7 端内核驱动:

在这里插入图片描述

所以Linux rpmsg 框架下使用平台总线模型与端点通讯的方式结合,给一些需要有特殊操作的自定设备,提供了支持的可能。比如异构间的通讯,可以封装成串口通讯模型。

在我们提供的M4 内核固件的代码中,注册了两种Linux 内核自带的rpmsg 框架下,原生支持的设备模型,这两种设备类型是rpmsg-tty-channel、rpmsg-client-sample:

  • rpmsg-tty-channel:tty 终端设备,对应内核驱动源码drivers/rpmsg/rpmsg_tty.c,此
    驱动模块默认被编译进内核。
  • rpmsg-client-sample:框架原生的通讯方式测试设备(放在内核里作为演示该框架的Demo提供的),对应内核驱动源码samples/rpmsg/rpmsg_client_sample.c,此驱动默认被编译成模块,并放置在文件系统/lib/modules/4.19.94-stm-r1/kernel/samples/rpmsg/rpmsg_client_sample.ko 中,当设备与驱动发生匹配时,系统会
    自动insmod 该驱动模块。
  • 还有一种字符设备模型,rpmsg_chrdev,源码位于drivers/rpmsg/rpmsg_char.c ,我
    们的代码中未实验,可自行研究。

在M4 核的代码中,还初始化了usart3 作为M4 内核的Log 输出串口,我们可以通过串口模块接入开发板上的usart3,来查看M4 内核输出的Log。最终工程代码会被用于生成ELF 固件,ELF固件即为程序,会运行在MP157 的M4 内核上。

综上,通过原生的rpmsg 框架设备、/dev/ttyRPMSGx 节点以及M4 内核使用的usart3 资源,我们就可以进行简单的实验了。本实验的代码也比较简单,这里就讲解这么多。

实验准备

由于多核异构的框架是与处理器的架构紧密联系在一起的,所以一般这些框架驱动会由芯片厂商为我们提供好。野火MP157 开发板默认开启了这些驱动支持,并且开启了对应的设备树,我们直接进行使用就可以了。

在前面我们提到了,M4 内核要与A7 内核通讯需要共用一个框架,那么M4 内核的运行的程序里,就需要有对应的框架代码,这个为大家提供的工程中已经包含。最终我们将代码生成的ELF固件,通过A7 内核的remoteproc 子系统加载到M4 内核上,即可做好前期的准备工作。

生成ELF 固件的工程代码位于\linux_driver\framework_ipcc\STM32Cube_FW_MP1_V1.2.0\Projects\STM32MP157C-EV1\Applications\OpenAMP\OpenAMP_raw 目录下,感兴趣可自行研究,工程可用MDK 或CubeIDE 打开(在工程目录中由对应文件夹)。


重要: 在M4 核的代码中,还初始化了usart3,实验前请务必将usart3 的设备树插件关闭。


实验操作

M4 核的固件我们已经成功编译并放在了/linux_driver/framework_ipcc 目录下,我们将M4 核的固件OpenAMP_raw_CM4.elf 上传至Linux 文件系统的/lib/firmware/ 目录。此目录存放着Linux 系统中会使用到的各种固件。

执行如下命令指定M4 内核加载的固件,默认在root 用户下操作:

# 进入remoteproc 子系统目录
cd /sys/class/remoteproc/remoteproc0
# 导入M4 内核固件名称
echo OpenAMP_raw_CM4.elf > firmware

在同一目录下,执行如下命令可启动停止M4 内核:

# 启动M4 内核
echo start > state
# 停止M4 内核
echo stop > state

启动M4 内核后信息如下:

在这里插入图片描述

M4 内核加载固件并启动后,在串口终端中打印出了一些信息,我们通过串口模块接入usart3引脚,再打开串口调试助手设置波特率为115200,可以看到M4 固件初始化的usart3 作为串口printf 出来的信息,为[INFO ]M4 send to A7 : hello world! ,并且A7 端的驱动也打印出了rpmsg_client_sample virtio0.rpmsg-client-sample.-1.0: incomingmsg 1 (src: 0x0) 说明M4 核及A7 核驱动正常工作了。

此外, 输入lsmod, 我们还可以看到演示设备创建后, 对应被动态加载的驱动模块,rpmsg_client_sample :

在这里插入图片描述

下面,我们进行第二个设备测试,通过前面现象中的LOG,我们可以看到被枚举出的tty 设备节点/dev/ttyRPMSG0 节点,我们就通过该节点测试tty 设备的功能,输入如下命令:

echo "hello M4 core , i'm A7!" > /dev/ttyRPMSG0

实验现象如下所示:

在这里插入图片描述

上图为A7 通过虚拟的tty 终端设备,转发到M4 内核的消息内容,最终通过M4 核固件的串口Log 功能打印出来对应信息。

自此,所有实验结束。


参考资料:嵌入式Linux 驱动开发实战指南-基于STM32MP1 系列

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第十八节 多核异构核间通信–ipcc 的相关文章

  • 如何使用 bash 锁定文件

    我有一个任务从远程服务器同步目录 rsync av email protected cdn cgi l email protection srv data srv data 为了使其定期运行并避免脚本 reEnter 问题 我使用 rsyn
  • 如何使用 xterm.js 创建基于 Web 的终端以 ssh 进入本地网络上的系统

    我偶然发现了这个很棒的图书馆xterm js https xtermjs org 这也是 Visual Studio Code 终端的基础 我有一个非常普遍的问题 我想通过基于网络的终端 不在网络中 可能位于 aws 服务器上 访问本地网络
  • 如何在 shell 脚本中并行运行多个实例以提高时间效率[重复]

    这个问题在这里已经有答案了 我正在使用 shell 脚本 它读取 16000 行的输入文件 运行该脚本需要8个多小时 我需要减少它 所以我将其划分为 8 个实例并读取数据 其中我使用 for 循环迭代 8 个文件 并在其中使用 while
  • stm32l0: 执行MI命令失败。使用 vFlashErase 数据包擦除闪存时出错

    我正在使用 Nucleo STM32L031 和 AC6 STM32 工作台 eclipse 我编写应用程序并进入调试模式 一切正常 直到我在应用程序中添加另一个功能 我注意到当我删除 评论 新函数 软件可以再次进入调试模式 但是当我添加
  • ubuntu中R的igraph包的安装

    我使用以下命令在 ubuntu 中安装 R 的 igraph 包 install packages igraph 但我收到一条错误消息 警告 无法访问存储库的索引 http ftp iitm ac in cran src contrib h
  • 大多数 Linux 系统头文件与 C++ 兼容吗?

    大多数 Linux 系统头文件 API C 兼容吗 今天我试图做这样的事情 include
  • 我可以从命令行打印 html 文件(带有图像、css)吗?

    我想从脚本中打印带有图像的样式化 html 页面 谁能建议一个开源解决方案 我使用的是 Linux Ubuntu 8 04 但也对其他操作系统的解决方案感兴趣 你可以给html2ps http user it uu se jan html2
  • 从 Python 调用 PARI/GP

    我想打电话PARI GP http pari math u bordeaux fr dochtml gpman html仅从Python计算函数nextprime n 对于不同的n是我定义的 不幸的是我无法得到帕里蟒蛇 http code
  • pip:需要将包名称tensorflow-gpu更改为tensorflow

    我正在尝试将具有 GPU 支持的张量流安装到 conda 环境中 我使用命令 pip install ignore installed upgrade https storage googleapis com tensorflow linu
  • 如何有效截断文件头?

    大家都知道truncate file size 函数 通过截断文件尾部将文件大小更改为给定大小 但是如何做同样的事情 只截断文件的尾部和头部呢 通常 您必须重写整个文件 最简单的方法是跳过前几个字节 将其他所有内容复制到临时文件中 并在完成
  • arm64和armhf有什么区别?

    Raspberry Pi Type 3 具有 64 位 CPU 但其架构不是arm64 but armhf 有什么区别arm64 and armhf armhf代表 arm hard float 是给定的名称Debian 端口 https
  • 如何在 Linux shell 中将十六进制转换为 ASCII 字符?

    假设我有一个字符串5a 这是 ASCII 字母的十六进制表示Z 我需要找到一个 Linux shell 命令 它将接受一个十六进制字符串并输出该十六进制字符串代表的 ASCII 字符 所以如果我这样做 echo 5a command im
  • 如何在Linux内核源代码中打印IP地址或MAC地址

    我必须通过修改 Linux 内核源代码来稍微改变 TCP 拥塞控制算法 但为了检查结果是否正确 我需要记录 MAC 或 IP 地址信息 我使用 PRINTK 函数来打印内核消息 但我感觉很难打印出主机的MAC IP地址 printk pM
  • 如何将目录及其子目录中的所有 PDF 文件复制到一个位置?

    如何全部复制PDF文件从目录及其子目录到单个目录 实际上还有更多的文件 并且深度有些任意 假设四个目录的最大深度是公平的 我想这些文件需要重命名 如果a pdf例如 位于多个目录中 因为我会adding https ebooks stack
  • Linux:在文件保存时触发 Shell 命令

    我想在修改文件时自动触发 shell 命令 我认为这可以通过注册 inotify 挂钩并调用来在代码中完成system 但是是否有更高级别的 bash 命令可以完成此任务 尝试 inotify 工具 我在复制链接时遇到问题 抱歉 但 Git
  • 如何在apache 2.4.6上安装apxs模块

    我刚刚用过apt get update我的 apache 已更新为2 4 6 我想安装 apxs 来编译模块 但收到此错误 The following packages have unmet dependencies apache2 pre
  • 卷曲选项 -:未知

    我运行此命令在 ubuntu 18 04 上安装更新版本的 nodejs curl sL https deb nodesource com setup 12 x sudo E bash 我收到错误 curl 选项 未知 我在多个系统上尝试过
  • Linux 可执行文件与 OS X“兼容”吗?

    如果您在基于 Linux 的平台上用 C 语言编译一个程序 然后将其移植以使用 MacOS 库 它会工作吗 来自编译器的核心机器代码在 Mac 和 Linux 上兼容吗 我问这个问题的原因是因为两者都是 基于 UNIX 的 所以我认为这是真
  • 如何在shell中输出返回码?

    我正在尝试通过调用自定义 shell 脚本sh bin sh c myscript sh gt log txt 2 gt 1 echo 该命令的输出是创建的后台进程的 PID 我想指导 bin sh保存返回码myscript sh到某个文件
  • 在 Linux 上使用多处理时,TKinter 窗口不会出现

    我想生成另一个进程来异步显示错误消息 同时应用程序的其余部分继续 我正在使用multiprocessingPython 2 6 中的模块来创建进程 我试图用以下命令显示窗口TKinter 这段代码在Windows上运行良好 但在Linux上

随机推荐

  • java之MySQL数据库

    MySQL数据库 1 什么是数据库 答 数据库是以一定方式存储在一起 能予多个用户共享 具有尽可能小的冗余度 与应用程序彼此独立的数据集合 2 数据库的分类 具体含义 常见的数据库 答 关系型数据库和非关系型数据库 关系数据库 是建立在关系
  • springCloud - 第10篇 - 服务间调用追踪 (zipkin 的使用)

    前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住分享一下给大家 点击跳转到教程 一 在微服务系统中 不同应用服务可能会有各种不同的相互调用 springcloud 集成了 zipkin 来实现对于不同服务调用的追踪和统计
  • LIBSVM 使用

    预备 NTU TW Chih Chung Chang and Chih Jen Lin LIBSVM LIBSVM Data Classification Regression and Multi label 正文 a 编译libsvm u
  • 【机器学习】决策树 No.3

    1 决策树之信息论基础 决策树思想来源非常朴素 程序设计中的条件分支结构 if else 最早的决策树就是利用这类结构分割数据的一种分类学习方法 例 银行贷款例子 使用决策树划分是否贷款 此处特征为两个 房子 工作 香农 信息论创始人 19
  • 一文带你了解ES6迭代器(iterator)

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 一 迭代器 iterator 是什么 二 工作原理 总结 一 迭代器 iterator 是什么 迭代器 iterator 是一种接口 为各种不同的数据结构提供统一的
  • SkipList(跳表)

    跳表简介 跳表是基于有序链表实现的搜索结构 是一种动态的搜索结构 即支持动态插入和删除操作 且跳表查找和删除的平均时间复杂度是Olog n 因此跳表是一种时间复杂度相对较小的搜索结构 我们知道对一个数据集合的查找 最差的时间复杂度是O n
  • Switch / Xbox / PS / PSV / PSP 游戏指南

    1 Switch Xbox PS PSV PSP 对比分析 table 1 PSV2000 1000 比较分析 PSV2000 相对 PSV1000 具体变更点 薄了20 轻了15 屏幕改为液晶屏 PS键 开始键和选择键变成球形更方便按 内
  • 2,一个人体姿态识别的项目实现

    学习opencv的例子 1 认识 2 start 直接干货 例子1 例子2 例子3 例子4 例子5 固定阈值 自适应阈值 文档说明 参考链接 http codec wang opencv start 02 basic element ima
  • git仓库创建及上传

    如何创建一个git仓库并上传代码 1 在此之前我们需要安装git和注册gitee账号 1 打开git官网下载安装程序 然后按照指令进行安装即可 2 搜索gitee进行注册和绑定邮箱即可 上传代码时需要登录gitee账号 安装成功之后告诉本地
  • Android apk 反编译解析

    学习android开发 有必要对android的反编译有所了解 当然学习android反编译并不是为了破解别人的软件 完全是一种学习的方法 了解别人写程序的思想是一件很有趣的事情 工具下载地址 http code google com p
  • androidstudio开发!花三分钟看完这篇文章你就懂了!技术详细介绍

    阿里面试 自我介绍 首先要介绍自己的项目经验和个人的擅长点 因为面试官主要考察你的表达能力和语言精简能力 简历的编写其实这里可能需要注意几点 1 标题的直接按照姓名 几年工作经验 应聘岗位格式来填写 例如 黄铭 四年工作经验 Android
  • STP与RSTP区别

    STP 不能快速迁移 即使是在点对点链路或边缘端口 边缘端口指的是该端口直接与用户终端相连 而没有连接到其它设备或共享网段上 也必须等待2 倍的ForwardDelay 的时间延迟 端口才能迁移到转发状态 RSTP Rapid Spanni
  • Python 异步: 异步上下文管理器(17)

    动动发财的小手 点个赞吧 上下文管理器是一种 Python 构造 它提供了一个类似 try finally 的环境 具有一致的接口和方便的语法 例如通过 with 表达 它通常与资源一起使用 确保在我们完成资源后始终关闭或释放资源 无论资源
  • VC++ OpenCV+ZBar二维码识别

    利用OpenCV处理图像的优势 结合ZBar提高二维码识别结果 接口定义 include
  • SpringSecurity配置类--常用配置

    SpringSecurity配置类 在学习这门课的时候 实现各种功能时进行了各种配置 我想将各种配置综合讲述一下 首先自定义配置类 需要继承WebSecurityConfigurerAdapter这个类 在这个类里面做了一些默认配置 Con
  • linux grpc,grpc linux下的编译使用-Go语言中文社区

    1 一些工具安装 apt get install build essential autoconf libtool pkg config apt get install libgflags dev libgtest dev apt get
  • [转]IDEA 撤销 merge 操作(详解)

    目录 一 前言 二 解决方案 通过 Git Bash 命令行解决 1 合并过程中未发生冲突 2 合并过程中发生冲突 三 解决方案 通过 IDEA 解决 附带详细的操作图 1 合并过程中未发生冲突 2 合并过程中发生冲突 四 最后 作为一个开
  • 自己制作的 macOS Mojave 10.15.3 iso 文件,亲测可用(附 VMware15 安装 macOS Catalina 图文教程与 macO Catalina.iso 镜像下载地址)

    注 如果需要分享此资源 请注明原作者 不要把别人的东西当做自己的成果 也不要把别人免费分享出来的东西以有偿的方式去分享 自己制作的 macOS Mojave 10 15 3 iso 文件 亲测可用 已在 VMware 15 5 Player
  • AOSP 预置APP安装 以MicroG GmsCore.apk安装为例

    AOSP 预置APP 以MicroG为例 MicroG 无root安装教程 通过源码修改打开签名欺骗 预置不带源码的APP 其他 AOSP 安装谷歌三件套失败 开始寻找代替方案 尝试使用MicroG项目代替谷歌服务 目前情况 已成功安装 所
  • 第十八节 多核异构核间通信–ipcc

    由于MP157 是一款多核异构的芯片 其中既包含的高性能的A7 核及实时性强的M4 内核 那么这两种处理器在工作时 怎么互相协调配合呢 这就涉及到了核间通信的概念了 IPCC inter processor communication co