当前位置: 首页 > news >正文

【设备树笔记整理7】实践操作

1 使用设备树给DM9000网卡_触摸屏指定中断

1.1 修改方法

        根据设备节点的compatible属性,在驱动程序中构造/注册 platform_driver,在 platform_driver 的 probe 函数中获得中断资源。

1.2 实验方法

以下是修改好的代码:第6课第1节_网卡_触摸屏驱动\001th_dm9000\dm9dev9000c.c

第6课第1节_网卡_触摸屏驱动\002th_touchscreen\s3c_ts.c

分别上传到内核如下目录:

drivers/net/ethernet/davicom
drivers/input/touchscreen

(1)编译内核

(2)使用新的uImage启动

(3)测试网卡

ifconfig eth0 192.168.1.101
ping 192.168.1.1

(4)测试触摸屏

hexdump /dev/evetn0 // 然后点击触摸屏

1.3 图示 

(1)图1

(2)图2

(3)图3

2 在设备树中时钟的简单使用

2.1 笔记

(1)设备树中定义了各种时钟,在文档中称之为"Clock providers",比如:

	clocks: clock-controller@4c000000 {compatible = "samsung,s3c2440-clock";reg = <0x4c000000 0x20>;#clock-cells = <1>;      // 想使用这个clocks时要提供1个u32来指定它, 比如选择这个clocks中发出的LCD时钟、PWM时钟};

(2)设备需要时钟时,它是"Clock consumers",它描述了使用哪一个"Clock providers"中的哪一个时钟(id),比如:

    fb0: fb@4d000000{compatible = "jz2440,lcd";reg = <0x4D000000 0x60>;interrupts = <0 0 16 3>;clocks = <&clocks HCLK_LCD>;  // 使用clocks即clock-controller@4c000000中的HCLK_LCD		};

(3)驱动中获得/使能时钟:

	// 确定时钟个数int nr_pclks = of_count_phandle_with_args(dev->of_node, "clocks","#clock-cells");// 获得时钟for (i = 0; i < nr_pclks; i++) {struct clk *clk = of_clk_get(dev->of_node, i);}// 使能时钟clk_prepare_enable(clk);// 禁止时钟clk_disable_unprepare(clk);

(4)参考文档:

  • 内核 Documentation/devicetree/bindings/clock/clock-bindings.txt
  • 内核 Documentation/devicetree/bindings/clock/samsung,s3c2410-clock.txt

2.2 图示 

3 在设备树中pinctrl的简单使用 

3.1 笔记

3.1.1 几个概念

(1)Bank

        以引脚名为依据, 这些引脚分为若干组, 每组称为一个Bank,比如s3c2440里有GPA、GPB、GPC等Bank,每个Bank中有若干个引脚,比如GPA0,GPA1, ...,GPC0,GPC1,... 等引脚。

(2) Group

        以功能为依据, 具有相同功能的引脚称为一个Group,比如s3c2440中串口0的TxD、RxD引脚使用 GPH2,GPH3,那这2个引脚可以列为一组,比如s3c2440中串口0的流量控制引脚使用GPH0,GPH1,那这2个引脚也可以列为一组。

(3)State

        设备的某种状态,比如内核自己定义的"default","init","idel","sleep"状态;也可以是其他自己定义的状态,比如串口的"flow_ctrl"状态(使用流量控制)。设备处于某种状态时,它可以使用若干个Group引脚。

3.1.2 设备树中 pinctrl 节点

(1)它定义了各种 pin bank,比如s3c2440有GPA,GPB,GPC,...,GPB各种BANK,每个BANK中有若干引脚:

	pinctrl_0: pinctrl@56000000 {reg = <0x56000000 0x1000>;gpa: gpa {gpio-controller;#gpio-cells = <2>;  /* 以后想使用gpa bank中的引脚时, 需要2个u32来指定引脚 */};gpb: gpb {gpio-controller;#gpio-cells = <2>;};gpc: gpc {gpio-controller;#gpio-cells = <2>;};gpd: gpd {gpio-controller;#gpio-cells = <2>;};};

(2)它还定义了各种group(组合),某种功能所涉及的引脚称为group,比如串口0要用到2个引脚:gph0,gph1:

	uart0_data: uart0-data {samsung,pins = "gph-0", "gph-0";samsung,pin-function = <2>;   /* 在GPHCON寄存器中gph0,gph1可以设置以下值:0 --- 输入功能1 --- 输出功能2 --- 串口功能我们要使用串口功能,  samsung,pin-function 设置为2*/};uart0_sleep: uart0_sleep {samsung,pins = "gph-0", "gph-1";samsung,pin-function = <0>;   /* 在GPHCON寄存器中gph0,gph1可以设置以下值:0 --- 输入功能1 --- 输出功能2 --- 串口功能我们要使用输入功能,  samsung,pin-function 设置为0*/};

3.1.3 设备节点中要使用某一个 pin group:

	serial@50000000 {......pinctrl-names = "default", "sleep";  /* 既是名字, 也称为state(状态) */pinctrl-0 = <&uart0_data>;pinctrl-1 = <&uart0_sleep>;};# pinctrl-names中定义了2种state: default 和 sleep,# default 对应的引脚是: pinctrl-0, 它指定了使用哪些pin group: uart0_data# sleep   对应的引脚是: pinctrl-1, 它指定了使用哪些pin group: uart0_sleep

3.1.4 platform_device,platform_driver匹配时:

really_probe:/* If using pinctrl, bind pins now before probing */ret = pinctrl_bind_pins(dev);dev->pins->default_state = pinctrl_lookup_state(dev->pins->p,PINCTRL_STATE_DEFAULT);  /* 获得"default"状态的pinctrl */dev->pins->init_state = pinctrl_lookup_state(dev->pins->p,PINCTRL_STATE_INIT);    /* 获得"init"状态的pinctrl */ret = pinctrl_select_state(dev->pins->p, dev->pins->init_state);    /* 优先设置"init"状态的引脚 */ret = pinctrl_select_state(dev->pins->p, dev->pins->default_state); /* 如果没有init状态, 则设置"default"状态的引脚 */......ret = drv->probe(dev);

所以:如果设备节点中指定了pinctrl,在对应的probe函数被调用之前,先"bind pins",即先绑定、设置引脚。

3.1.5 驱动中想选择、设置某个状态的引脚:

   devm_pinctrl_get_select_default(struct device *dev);      // 使用"default"状态的引脚pinctrl_get_select(struct device *dev, const char *name); // 根据name选择某种状态的引脚pinctrl_put(struct pinctrl *p);   // 不再使用, 退出时调用

3.1.6 参考文档

  • 内核 Documentation/devicetree/bindings/pinctrl/samsung-pinctrl.txt

3.2 图示

(1)Bank

(2)Group

 (3)State

(4)设备结点

4 使用设备树给LCD指定各种参数

4.1 参考文章

讓TQ2440也用上設備樹(1) - 摩斯电码 - 博客园

4.2 参考代码

https://github.com/pengdonglin137/linux-4.9/blob/tq2440_dt/drivers/video/fbdev/s3c2410fb.c

4.3 实验方法 

(1)替换dts文件

把"jz2440_irq.dts" 放入内核 arch/arm/boot/dts目录

(2)替换驱动文件

把"s3c2410fb.c" 放入内核 drivers/video/fbdev/ 目录,修改内核 drivers/video/fbdev/Makefile:

obj-$(CONFIG_FB_S3C2410)          += lcd_4.3.o

改为:

obj-$(CONFIG_FB_S3C2410)          += s3c2410fb.o

(3)编译驱动、编译dtbs

export  PATH=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/work/system/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi/bin
cp config_ok  .config
make uImage   // 生成 arch/arm/boot/uImage
make dtbs     // 生成 arch/arm/boot/dts/jz2440_irq.dtb

(4)使用上述uImage,dtb启动内核即可看到LCD有企鹅出现

4.4 设备树相关

(1)设备树中的描述

    fb0: fb@4d000000{compatible = "jz2440,lcd";reg = <0x4D000000 0x60>;interrupts = <0 0 16 3>;clocks = <&clocks HCLK_LCD>;   /* a. 时钟 */clock-names = "lcd";pinctrl-names = "default";     /* b. pinctrl */pinctrl-0 = <&lcd_pinctrl &lcd_backlight &gpb0_backlight>;status = "okay";/* c. 根据LCD引脚特性设置lcdcon5, 指定lcd时序参数 */lcdcon5 = <0xb09>;type = <0x60>;width = /bits/ 16 <480>;height = /bits/ 16 <272>;pixclock = <100000>;       /* 单位: ps, 10^-12 S,  */xres = /bits/ 16 <480>;yres = /bits/ 16 <272>;bpp = /bits/ 16 <16>;left_margin = /bits/ 16 <2>;right_margin =/bits/ 16  <2>;hsync_len = /bits/ 16 <41>;upper_margin = /bits/ 16 <2>;lower_margin = /bits/ 16 <2>;vsync_len = /bits/ 16 <10>;};&pinctrl_0 {gpb0_backlight: gpb0_backlight {samsung,pins = "gpb-0";samsung,pin-function = <1>;samsung,pin-val = <1>;};
};

4.5 代码中的处理

(1)时钟

info->clk = of_clk_get(dev->of_node, 0);
clk_prepare_enable(info->clk);

(2)pinctrl

代码中无需处理,在platform_device/platform_driver匹配之后就会设置"default"状态对应的pinctrl

(3)根据LCD引脚特性设置lcdcon5,指定lcd时序参数,直接读设备树节点中的各种属性值, 用来设置驱动参数:

	of_property_read_u32(np, "lcdcon5", (u32 *)(&display->lcdcon5));of_property_read_u32(np, "type", &display->type);of_property_read_u16(np, "width", &display->width);of_property_read_u16(np, "height", &display->height);of_property_read_u32(np, "pixclock", &display->pixclock);of_property_read_u16(np, "xres", &display->xres);of_property_read_u16(np, "yres", &display->yres);of_property_read_u16(np, "bpp", &display->bpp);of_property_read_u16(np, "left_margin", &display->left_margin);of_property_read_u16(np, "right_margin", &display->right_margin);of_property_read_u16(np, "hsync_len", &display->hsync_len);of_property_read_u16(np, "upper_margin", &display->upper_margin);of_property_read_u16(np, "lower_margin", &display->lower_margin);of_property_read_u16(np, "vsync_len", &display->vsync_len);

4.6 图示 

5 补充笔记

5.1 确定内核的虚拟地址、物理地址的关键信息 

vmlinux虚拟地址的确定,内核源码:

.config :CONFIG_PAGE_OFFSET=0xC0000000arch/arm/include/asm/memory.h#define PAGE_OFFSET     UL(CONFIG_PAGE_OFFSET)arch/arm/Makefiletextofs-y       := 0x00008000TEXT_OFFSET := $(textofs-y)arch/arm/kernel/vmlinux.lds.S:. = PAGE_OFFSET + TEXT_OFFSET;   // // 即0xC0000000+0x00008000 = 0xC0008000, vmlinux的虚拟地址为0xC0008000arch/arm/kernel/head.S#define KERNEL_RAM_VADDR       (PAGE_OFFSET + TEXT_OFFSET)  // 即0xC0000000+0x00008000 = 0xC0008000vmlinux物理地址的确定:
内核源码: 
arch/arm/mach-s3c24xx/Makefile.boot :zreladdr-y      += 0x30008000   // zImage自解压后得到vmlinux, vmlinux的存放位置params_phys-y   := 0x30000100   // tag参数的存放位置, 使用dtb时不再需要tagarch/arm/boot/Makefile:ZRELADDR    := $(zreladdr-y)arch/arm/boot/Makefile:UIMAGE_LOADADDR=$(ZRELADDR)scripts/Makefile.lib:UIMAGE_ENTRYADDR ?= $(UIMAGE_LOADADDR)  // 制作uImage的命令, uImage = 64字节的头部 + zImage,  头部信息中含有内核的入口地址(就是vmlinux的物理地址)cmd_uimage = $(CONFIG_SHELL) $(MKIMAGE) -A $(UIMAGE_ARCH) -O linux \-C $(UIMAGE_COMPRESSION) $(UIMAGE_OPTS-y) \-T $(UIMAGE_TYPE) \-a $(UIMAGE_LOADADDR) -e $(UIMAGE_ENTRYADDR) \-n $(UIMAGE_NAME) -d $(UIMAGE_IN) $(UIMAGE_OUT)

5.2 参考

00-Linux设备树系列-简介 - 飞翔de刺猬 - CSDN博客.html
https://blog.csdn.net/lhl_blog/article/details/82387486

Linux kernel的中断子系统之(二):IRQ Domain介绍_搜狐科技_搜狐网.html
http://www.sohu.com/a/201793206_467784

基于设备树的TQ2440的中断(1)
https://www.cnblogs.com/pengdonglin137/p/6847685.html

基于设备树的TQ2440的中断(2)
https://www.cnblogs.com/pengdonglin137/p/6848851.html

基於tiny4412的Linux內核移植 --- 实例学习中断背后的知识(1)
http://www.cnblogs.com/pengdonglin137/p/6349209.html

Linux kernel的中断子系统之(一):综述
http://www.wowotech.net/irq_subsystem/interrupt_subsystem_architecture.html

Linux kernel的中断子系统之(二):IRQ Domain介绍

linux kernel的中断子系统之(三):IRQ number和中断描述符

linux kernel的中断子系统之(四):High level irq event handler

Linux kernel中断子系统之(五):驱动申请中断API

Linux kernel的中断子系统之(六):ARM中断处理过程

linux kernel的中断子系统之(七):GIC代码分析

相关文章:

【设备树笔记整理7】实践操作

1 使用设备树给DM9000网卡_触摸屏指定中断 1.1 修改方法 根据设备节点的compatible属性&#xff0c;在驱动程序中构造/注册 platform_driver&#xff0c;在 platform_driver 的 probe 函数中获得中断资源。 1.2 实验方法 以下是修改好的代码&#xff1a;第6课第1节_网卡_触摸…...

使用VisualStudio制作上位机(六)

文章目录 使用VisualStudio制作上位机&#xff08;六&#xff09;第五部分&#xff1a;应用程序打包第一步&#xff1a;勾选为Release模式第二步&#xff1a;生成解决方案第三步&#xff1a;将我们额外添加的文件放入到Release这个文件夹里 使用VisualStudio制作上位机&#xf…...

包管理工具--》npm的配置及使用(一)

目录 &#x1f31f;概念 &#x1f31f;背景 &#x1f31f;前端包管理器 &#x1f31f;包的安装 本地安装 全局安装 &#x1f31f;包配置 配置文件 保存依赖关系 &#x1f31f;包的使用 &#x1f31f;写在最后 &#x1f31f;概念 模块&#xff08;module&#xff09…...

期货基础知识

一、期货是什么&#xff1f;  期货是与现货相对应&#xff0c;并由现货衍生而来。期货通常指期货合约&#xff0c;期货与现货完全不同&#xff0c;现货是实实在在可以交易的货&#xff08;商品&#xff09;&#xff0c;期货主要不是货&#xff0c;而是以某种大众产品如棉花、大…...

NC后端扩展开发

前言 在日常的工作中&#xff0c;会遇到各种各样的需要进行扩展开发的需求&#xff0c;可以使用系统预留的扩展开发机制来实现&#xff0c;避免修改源码。因NC产品已迭代至BIP版本&#xff0c;所以前端扩展方式就再进行不赘述了&#xff0c;本文主要介绍后端扩展开发方式&…...

nginx vue2+webpack 和 vue3+vite 配置二级目录访问

我们开发中会遇到这样的需求&#xff0c;让我们用服务器nginx部署一个用域名的二级目录来访问项目 https&#xff1a;xxx/二级目录/来放访问项目 目录 思路 1、nginx配置&#xff08;vue2 和 vue3配置的nginx相同&#xff09; 2、vue2webpack的配置 &#xff08;1&#xff0…...

无需租云服务器,Linux本地搭建web服务,并内网穿透发布公网访问

文章目录 前言1. 本地搭建web站点2. 测试局域网访问3. 公开本地web网站3.1 安装cpolar内网穿透3.2 创建http隧道&#xff0c;指向本地80端口3.3 配置后台服务 4. 配置固定二级子域名5. 测试使用固定二级子域名访问本地web站点 前言 在web项目中,部署的web站点需要被外部访问,则…...

算法leetcode|76. 最小覆盖子串(rust重拳出击)

文章目录 76. 最小覆盖子串&#xff1a;样例 1&#xff1a;样例 2&#xff1a;样例 3&#xff1a;提示&#xff1a;进阶&#xff1a; 分析&#xff1a;在这里插入图片描述 题解&#xff1a;rust&#xff1a;go&#xff1a;c&#xff1a;python&#xff1a;java&#xff1a; 76.…...

如何让你的jupyter notebook 排版得像Word(Markdown和网页文件写法)

案例背景 很多时候我们在jupyter notebook里面的写代码&#xff0c;画图&#xff0c;但是文字分析什么的写在里面纯文本不好看&#xff0c;需要进行排版&#xff0c;那么就得用markdown的写法&#xff0c;如何还想居中或者更花里胡哨的字体&#xff0c;那就得要网页文件的一些…...

AndroidTV端:酒店扫码认证投屏DLNA

被老板叼了几次了&#xff0c;最近实在忍不了&#xff0c;准备离职&#xff1b; 但是担心离职后长时间没有办法找到工作 就想贡献一套平时琢磨出来的程序&#xff0c;请各位有能力的话带我熬过这凛冽的寒冬。 目前写出来的&#xff0c;有三个端&#xff1a;安卓TV端&#xf…...

基于PyTorch的交通标志目标检测系统

一、开发环境 Windows 10PyCharm 2021.3.2Python 3.7PyTorch 1.7.0 二、制作交通标志数据集&#xff0c;如下图 三、配置好数据集的地址&#xff0c;然后开始训练 python train.py --data traffic_data.yaml --cfg traffic_yolov5s.yaml --weights pretrained/yolov5s.pt --e…...

feign调用失败 feign.RetryableException: xxx-service executing GET http://xxx/test

一。 问题引入 升级springcloud的版本后 突然发现 以前正常的feign调用也报错了 升级后的各组件版本如下 spring cloud 2021.0.5 spring cloud alibaba 2021.0.5.0 spring boot 2.6.13 错误日志如下 feign.RetryableException: xxx-service executing GET http://xxx-servic…...

mysql 用户管理

目录 用户 创建用户 删除用户 修改密码 权限管理 赋权 查看权限 插销权限 总结 用户 mysql 的用户都存在于系统数据库 mysql 的user 表中 mysql> show tables; --------------------------- | Tables_in_mysql | --------------------------- | column…...

pyinstaller打包exe运行闪退

这里写自定义目录标题 前言问题描述解决过程 前言 闪退原因可能有很多&#xff0c;这里记录下我遇到的问题&#xff0c;简单来说是dll调用错误导致的闪退&#xff0c;因为我的python用的是32位的&#xff0c;但是pyinstaller却是64位的&#xff0c;属于用conda的时候没注意。 …...

ARM 汇编基础知识

1.为什么学习汇编&#xff1f; 我们在进行嵌入式 Linux 开发的时候是绝对要掌握基本的 ARM 汇编&#xff0c;因为 Cortex-A 芯片一 上电 SP 指针还没初始化&#xff0c; C 环境还没准备好&#xff0c;所以肯定不能运行 C 代码&#xff0c;必须先用汇编语言设置好 C 环境…...

CRM 自动化如何改善销售和客户服务?

许多 B2B 和 B2C 公司都使用 CRM 系统来组织业务流程&#xff0c;使复杂的任务更容易完成。企业可以使用 CRM 自动化来自动化工作流程&#xff0c;让团队有更多的时间来执行高价值的任务&#xff0c;而不是陷于一堆琐碎事情中。 什么是CRM自动化&#xff1f; CRM 自动化是指 C…...

Bean 的六种作用域

目录 一、作用域是什么&#xff1f; 1、singleton&#xff08;单例作用域&#xff09; 2、prototype&#xff08;原型作用域&#xff09; 3、request&#xff08;请求作用域&#xff09; 4、session&#xff08;回话作用域&#xff09; 5、application&#xff08;全局作用域&a…...

go语言--锁

锁的基础&#xff0c;go的锁是构建在原子操作和信号锁之上的 原子锁 原子包实现协程的对同一个数据的操作&#xff0c;可以实现原子操作&#xff0c;只能用于简单变量的简单操作&#xff0c;可以把多个操作变成一个操作 sema锁 也叫信号量锁/信号锁 核心是一个uint32值&#…...

再见,CSDN

从我2018年1月31日加入CSDN&#xff0c;到现在已经5年多的时间了。在这5年里&#xff0c;陆陆续续在CSDN上发布了很多论文阅读笔记、教程、技术文章等等&#xff0c;记录了我从大四到研究生再到工作这段时间的学习和成长轨迹。 我一直有备份个人资料的习惯&#xff0c;尤其是耗…...

MySQL总复习

目录 登录 显示数据库 创建数据库 删除数据库 使用数据库 创建表 添加数据表数据 查询表 添加数据表多条数据 查询表中某数据 增insert 删delete 改update 查select ​ where like ​编辑 范围查找 order by 聚合函数 count max min sum avg g…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...