在CodeBlocks搭建SDL2工程构建TFT彩屏模拟器虚拟TFT彩屏幕显示

在CodeBlocks搭建SDL2工程构建TFT彩屏模拟器虚拟TFT彩屏幕显示

  • 参考文章
  • 源码下载地址
  • 一、SDL2的创建、初始化、退出
  • 二、系统基本Tick、彩屏刷新、按键事件
  • 三、彩屏获取与设置颜色
  • 四、彩屏填充颜色及清屏
  • 五、彩屏显示中文和英文字符串
  • 六、彩屏显示数字
  • 七、彩屏初始化
  • 八、主函数测试
  • 九、测试效果

参考文章

  • 在CodeBlocks下搭建SDL2开发工程
  • 在CodeBlocks搭建SDL2工程OLED液晶模拟器虚拟OLED单色液晶(128x64)



源码下载地址

在CodeBlocks搭建SDL2工程构建TFT彩屏模拟器虚拟TFT彩屏幕显示


一、SDL2的创建、初始化、退出


typedef struct
{SDL_Window   * MainWindow;  /* 窗口 */SDL_Renderer * MainRender;  /* 渲染器 */SDL_Texture  * MainTexture; /* 纹理 */u8             ExitWindow;  /* 退出窗口 */
}AppGlobal_TypeDef, * AppGlobal_TypeDef_t;static AppGlobal_TypeDef AppSystem = {0};
AppGlobal_TypeDef * pAppSystem = &AppSystem;/* 初始化SDL */
static u8 ubInit_SDL2(void)
{/* 初始化SDL */if (SDL_Init(SDL_INIT_AUDIO | SDL_INIT_VIDEO) < 0){SDL_Log("SDL Init Fail......%s\r\n", SDL_GetError());return 1;}/* 创建窗口 */AppSystem.MainWindow = SDL_CreateWindow("Virtual TFT SDL2", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WINDOW_PHY_WIDTH, WINDOW_PHY_HEIGHT, SDL_WINDOW_SHOWN);if (AppSystem.MainWindow == NULL){SDL_Log("SDL Create Window Fail......%s\r\n", SDL_GetError());return 2;}/* 创建渲染器 */AppSystem.MainRender = SDL_CreateRenderer(AppSystem.MainWindow, -1, SDL_RENDERER_ACCELERATED);if (AppSystem.MainRender == NULL){SDL_Log("SDL Create Renderer Fail......%s", SDL_GetError());return 3;}/* 创建纹理 */AppSystem.MainTexture = SDL_CreateTexture(AppSystem.MainRender, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STATIC, TFT_LCD_PHY_XWIDTH, TFT_LCD_PHY_YHEIGHT);if (AppSystem.MainTexture == NULL){SDL_Log("SDL Create Texture Fail......%s", SDL_GetError());return 4;}/* 设置纹理模式 */SDL_SetTextureBlendMode(AppSystem.MainTexture, SDL_BLENDMODE_BLEND);memset(TFT_LCD_DIS_MEMORY, 0x99, TFT_LCD_PHY_XWIDTH * TFT_LCD_PHY_YHEIGHT * sizeof(u32));SDL_UpdateTexture(AppSystem.MainTexture, NULL, TFT_LCD_DIS_MEMORY, TFT_LCD_PHY_XWIDTH * sizeof(u32));SDL_RenderClear(AppSystem.MainRender);SDL_RenderCopy(AppSystem.MainRender, AppSystem.MainTexture, NULL, NULL);SDL_RenderPresent(AppSystem.MainRender);return 0;
}/* 退出SDL */
static void vQuit_SDL2(void)
{SDL_Log("Complier Date: %s  %s %d\r\n", __DATE__, __TIME__, ulSuperTimer_GetTick());/* 销毁纹理 */if (AppSystem.MainTexture != NULL) SDL_DestroyTexture(AppSystem.MainTexture);/* 销毁渲染器 */if (AppSystem.MainRender != NULL)  SDL_DestroyRenderer(AppSystem.MainRender);/* 销毁窗口 */if (AppSystem.MainWindow != NULL) SDL_DestroyWindow(AppSystem.MainWindow);/* 退出SDL */SDL_Quit();
}



二、系统基本Tick、彩屏刷新、按键事件


/* 系统基本Tick */
static void vSystem_BasicTick(void)
{static Uint64 oldTick = 0;Uint64 curTick = SDL_GetTicks64();if (oldTick == curTick) return;vSuperTimer_IncTick((u16)(curTick - oldTick));oldTick = curTick;
}/* 屏幕刷新+按键事件处理 */
static void vRefresh_KeyEvent_Handler(void)
{static Uint64 oldTick = 0;Uint64 curTick  = SDL_GetTicks64();SDL_Event event = {0};if ((curTick - oldTick) >= 20){SDL_UpdateTexture(AppSystem.MainTexture, NULL, TFT_LCD_DIS_MEMORY, TFT_LCD_PHY_XWIDTH * sizeof(u32));SDL_RenderClear(AppSystem.MainRender);SDL_RenderCopy(AppSystem.MainRender, AppSystem.MainTexture, NULL, NULL);SDL_RenderPresent(AppSystem.MainRender);oldTick = curTick;}while (SDL_PollEvent(&event)){switch (event.type){case SDL_QUIT: AppSystem.ExitWindow = EXIT_WINDOW_TYPE_QUIT; break;case SDL_KEYDOWN:{switch (event.key.keysym.sym){case SDLK_UP:    SDL_Log("SDLK_UP......\r\n");    break;case SDLK_DOWN:  SDL_Log("SDLK_DOWN......\r\n");  break;case SDLK_LEFT:  SDL_Log("SDLK_LEFT......\r\n");  break;case SDLK_RIGHT: SDL_Log("SDLK_RIGHT......\r\n"); break;default: break;}}break;default: break;}}
}



三、彩屏获取与设置颜色


/* 设置颜色 */
void vTFT_LCD_SetColor(u32 x, u32 y, ColorType color)
{/* 越界 */if (x > (AppDevTFT.xWidth  - 1)) return;if (y > (AppDevTFT.yHeight - 1)) return;AppDevTFT.pDisMem[AppDevTFT.xWidth * y + x] = 0xFF000000 | DEV_RGB(color);
}/* 获取颜色 */
ColorType xTFT_LCD_GetColor(u32 x, u32 y)
{/* 越界 */if (x > (AppDevTFT.xWidth  - 1)) return 0;if (y > (AppDevTFT.yHeight - 1)) return 0;return RGB_DEV(AppDevTFT.pDisMem[AppDevTFT.xWidth * y + x]);
}



四、彩屏填充颜色及清屏


/* 填充矩形(单色) */
void vTFT_LCD_FillRect_SinColor(u32 x1, u32 y1, u32 x2, u32 y2, ColorType color)
{u32 x = 0, y = 0;/* 越界 */if (x1 > (AppDevTFT.xWidth  - 1)) return;if (y1 > (AppDevTFT.yHeight - 1)) return;/* 最大范围 */if (x2 > (AppDevTFT.xWidth  - 1)) x2 = (AppDevTFT.xWidth - 1);if (y2 > (AppDevTFT.yHeight - 1)) y2 = (AppDevTFT.yHeight - 1);/* 填充颜色 */for (x = x1; x <= x2; x++){for (y = y1; y <= y2; ++y){AppDevTFT.pDisMem[AppDevTFT.xWidth * y + x] = 0xFF000000 | DEV_RGB(color);}}
}/* 填充矩形(多色) */
void vTFT_LCD_FillRect_MultColor(u32 x1, u32 y1, u32 x2, u32 y2, ColorType * pColor)
{u32 x = 0, y = 0, ex = 0, ey = 0;/* 越界 */if (x1 > (AppDevTFT.xWidth  - 1)) return;if (y1 > (AppDevTFT.yHeight - 1)) return;/* 最大范围 */ex = (x2 > (AppDevTFT.xWidth  - 1)) ? (AppDevTFT.xWidth  - 1) : x2;ey = (y2 > (AppDevTFT.yHeight - 1)) ? (AppDevTFT.yHeight - 1) : y2;for (y = y1; y <= ey; y++){for (x = x1; x <= ex; ++x){AppDevTFT.pDisMem[AppDevTFT.xWidth * y + x] = 0xFF000000 | DEV_RGB(*pColor);}pColor += (x2 - ex);}
}/* 清屏幕 */
void vTFT_LCD_ClearScreen(ColorType color)
{u32 x = 0, y = 0;for (x = 0; x <= (AppDevTFT.xWidth - 1); x++){for (y = 0; y <= (AppDevTFT.yHeight - 1); ++y){AppDevTFT.pDisMem[AppDevTFT.xWidth * y + x] = 0xFF000000 | DEV_RGB(color);}}
}



五、彩屏显示中文和英文字符串


/* 获取字符数据源地址 */
static void vGet_CharSrc(u8 chr, u8 charSize, u8 ** pSrc)
{switch (charSize){case ASCII_FONT_TYPE_1206 : *pSrc = (u8 *)(&ASCII_FONT_1206[chr - ' ']); break;case ASCII_FONT_TYPE_1608 : *pSrc = (u8 *)(&ASCII_FONT_1608[chr - ' ']); break;case ASCII_FONT_TYPE_2412 : *pSrc = (u8 *)(&ASCII_FONT_2412[chr - ' ']); break;default: *pSrc = NULL; break;}
}/* 显示字符 */
static void vTFT_LCD_DisplayChar(u32 x, u32 y, u8 chr, u8 charSize, ColorType backColor, ColorType foreColor)
{ColorType color = foreColor;u8 charByte = 0, k = 0, i = 0;u8 dat = 0, * pSrcDat = NULL;u32 y0 = y;//获取字符数据源地址vGet_CharSrc(chr, charSize, &pSrcDat);if (pSrcDat == NULL) return;// 字符点阵占用字节数charByte = ((charSize >> 3) + ((charSize & 0x07) ? 1 : 0)) * (charSize >> 1);// 遍历字符点阵数据for(k = 0; k < charByte; ++k){dat = pSrcDat[k];for(i = 0; i < 8; ++i){// 显示有效范围if ((x < AppDevTFT.xWidth) && (y < AppDevTFT.yHeight)){//低位在前if ((dat >> i) & 0x01) color = foreColor;else                   color = backColor;vTFT_LCD_SetColor(x, y, color);}y++;// 纵坐标自加if (XABS2(y , y0) >= charSize)//纵坐标偏移量等于字符点阵高度{y = y0;x++;break;}}}
}/* 显示字符串 */
void vTFT_LCD_DisplayString(u32 x, u32 y, u8 * pStr, u8 strSize, ColorType backColor, ColorType foreColor)
{//显示ASCII常规字符while ((*pStr >= ' ') && (*pStr <= '~')){/* 剩余的横纵小于字体宽度 换行显示 */if ((x + (strSize >> 1)) >= AppDevTFT.xWidth){y += strSize;x  = 0;}/* 剩余纵轴小于字体高度 */// if ((y + strSize) >= AppDevTFT.yHeight)if (y >= AppDevTFT.yHeight){return;}vTFT_LCD_DisplayChar(x, y, *pStr, strSize, backColor, foreColor);x += (strSize >> 1);pStr++;}
}/* 显示中文字符 */
static void vTFT_LCD_Display_ChineseChar(u32 x, u32 y, u32 xWidth, u32 yHeight, const u8 * pData, ColorType backColor, ColorType foreColor)
{ColorType color = foreColor;u16 k = 0, j = 0, n = 0, i = 0;u32 y0 = y, yMax = 0;u8 dat = 0;yMax = (yHeight >> 3) + ((yHeight & 0x07) ? 1 : 0); //高度y0   = y; //原始纵坐标for(k = 0; k < xWidth; k++){for(j = 0; j < yMax; j++){dat = pData[n++];for(i = 0; i < 8; i++){if ((y < AppDevTFT.yHeight) && (x < AppDevTFT.xWidth)){//低位在前if ((dat >> i) & 0x01) color = foreColor;else                   color = backColor;vTFT_LCD_SetColor(x, y, color);}y++;//纵坐标处理if (XABS2(y , y0) >= yHeight){y = y0;x++;//横坐标处理break;}}}}
}/* 显示中文字符串 */
void vTFT_LCD_Display_ChineseString(u32 x, u32 y, u32 xWidth, u32 yHeight, u8 * pData, u16 num, ColorType backColor, ColorType foreColor)
{u16 i = 0;u8 charByte = 0;u8 * pMem = pData;/* 异常 */if ((!num) || (pData == NULL)) return;// 字符点阵占用字节数charByte = ((yHeight >> 3) + ((yHeight & 0x07) ? 1 : 0)) * xWidth;for (i = 0; i < num; ++i){/* 剩余的横纵小于字体宽度 换行显示 */if ((x + xWidth) > AppDevTFT.xWidth){y += yHeight;x  = 0;}/* 剩余纵轴小于字体高度 */// if ((y + yHeight) >= AppDevTFT.yHeight)if (y >= AppDevTFT.yHeight){return;}pMem = pData + (charByte * i);vTFT_LCD_Display_ChineseChar(x, y, xWidth, yHeight, pMem, backColor, foreColor);x += xWidth;}
}



六、彩屏显示数字


static u8 ubGet_EveryBit_Digit(u8 * pDat, u32 num)
{u8 i = 0;while (1){pDat[i++] = num % 10;num = num / 10;if (!num){break;}}u8 temp = 0;for (num = 0; num < (i >> 1); ++num){temp = pDat[num];pDat[num] = pDat[i - num - 1];pDat[i - num - 1] = temp;}return i;
}/* 显示数字 */
void vTFT_LCD_DisplayNumber(u32 x, u32 y, u32 num, u8 charSize, ColorType backColor, ColorType foreColor)
{u8 mem[20] = {0};u8 chr = 0, i = 0, len = ubGet_EveryBit_Digit(mem, num);for (i = 0; i < len; ++i){/* 剩余的横纵小于字体宽度 换行显示 */if ((x + (charSize >> 1)) >= AppDevTFT.xWidth){y += charSize;x  = 0;}/* 剩余纵轴小于字体高度 */// if ((y + charSize) >= AppDevTFT.yHeight)if (y >= AppDevTFT.yHeight){return;}chr = mem[i] + 0x30;vTFT_LCD_DisplayChar(x, y, chr, charSize, backColor, foreColor);x += (charSize >> 1);}
}



七、彩屏初始化


/* 初始化TFT */
void vTFT_Init(void)
{AppDevTFT.xWidth  = TFT_LCD_PHY_XWIDTH;AppDevTFT.yHeight = TFT_LCD_PHY_YHEIGHT;AppDevTFT.pDisMem = TFT_LCD_DIS_MEMORY;AppDevTFT.BackColor = 0xDCDCDC;AppDevTFT.ForeColor = 0xFFFFFF;vTFT_LCD_ClearScreen(AppDevTFT.BackColor);vTFT_LCD_DisplayString(10,  10, (const u8 *)"Compiler: ", ASCII_FONT_TYPE_1608, 0, 0x00FF00);vTFT_LCD_DisplayString(90,  10, (const u8 *)__DATE__,     ASCII_FONT_TYPE_1608, 0, 0x00FF00);vTFT_LCD_DisplayString(178, 10, (const u8 *)"  ",         ASCII_FONT_TYPE_1608, 0, 0x00FF00);vTFT_LCD_DisplayString(194, 10, (const u8 *)__TIME__,     ASCII_FONT_TYPE_1608, 0, 0x00FF00);vTFT_LCD_DisplayString(10, 50,  (const u8 *)"xDemo TFT1...123ABC~!@#$%^&*()-=", ASCII_FONT_TYPE_1206, 0, 0xFFFF00);vTFT_LCD_DisplayString(10, 70,  (const u8 *)"xDemo TFT2...123ABC", ASCII_FONT_TYPE_1608, 0xFFFFFF, 0x0000FF);vTFT_LCD_DisplayString(10, 100, (const u8 *)"xDemo TFT3...123ABC", ASCII_FONT_TYPE_2412, 0, 0xF59A23);vTFT_LCD_Display_ChineseString(10, 140, 18, 18, (u8 *)&ChineseDemo[1], 9, 0, 0xFF0000);vTFT_LCD_DisplayNumber(10, 200, 985, ASCII_FONT_TYPE_2412, 0xDCDCDC, 0xFF0000);
}



八、主函数测试


int main( int argc, char * argv[] )
{if (ubInit_SDL2()){SDL_Log("Init SDL Fail......%s\r\n", SDL_GetError());vQuit_SDL2();return -1;}vTFT_Init();xSuperTimer_Init();AppSystem.ExitWindow = EXIT_WINDOW_TYPE_RUN;ubSuperTimer_Start(xDemo, 1000);while (AppSystem.ExitWindow){vRefresh_KeyEvent_Handler();vSystem_BasicTick();vSuperTimer_RunHandler();}vQuit_SDL2();return 0;
}



九、测试效果

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Springboot + vue实现的校园周边美食探索及分享平台

&#x1f942;(❁◡❁)您的点赞&#x1f44d;➕评论&#x1f4dd;➕收藏⭐是作者创作的最大动力&#x1f91e; &#x1f496;&#x1f4d5;&#x1f389;&#x1f525; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;欢迎留言讨论 &#x1f525;&#x1f525;&…

LeetCode - 初级算法 数组(删除排序数组中的重复项)

免责声明:本文来源于个人知识与公开资料,仅用于学术交流。 删除排序数组中的重复项 这篇文章讨论如何从一个非严格递增的数组 nums 中删除重复的元素,使每个元素只出现一次,并返回新数组的长度。因为数组是排序的,只要是相同的肯定是挨着的,所以我们需要遍历所有数组,然…

MVCC实现原理以及解决脏读、不可重复读、幻读问题

MVCC实现原理以及解决脏读、不可重复读、幻读问题 MVCC是什么&#xff1f;有什么作用&#xff1f;MVCC的实现原理行隐藏的字段undo log日志版本链Read View MVCC在RC下避免脏读MVCC在RC造成不可重复读、丢失修改MVCC在RR下解决不可重复读问题RR下仍然存在幻读的问题 MVCC是什么…

【leetcode100】二叉树的中序遍历

1、题目描述 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2] 2、初始思路 2.1 思路 中序遍历的顺序是左→根→右&#xff0c;定义一个函数进行遍历 # Definition for …

租用服务器还是服务器托管:哪种方案更适合您?

随着企业对网络服务质量要求的不断提高&#xff0c;租用服务器和服务器托管是两种常见的选择&#xff0c;各自具备独特的优势和适用场景。这篇文章将从多个维度对这两种方案进行详细分析&#xff0c;帮助大家进行对比选择。 租用服务器的优劣势分析 优点 无需大额初始投入 租用…

Quartus In-System Sources and Probes Editor 的使用说明

文章目录 前言使用说明参考资料 前言 Quartus 提供了 In-System Sources and Probes Editor 调试工具&#xff0c;通过 JTAG 接口使用该工具可以驱动和采样内部节点的逻辑值。即通过 Sources 功能来驱动 FPGA 内部信号&#xff0c;通过 Probes 功能来探测内部节点的逻辑值。在…

AURIX的TASKING链接文件语法学习

链接文件中的定义&#xff1a; group (ordered, contiguous, align 4, attributesrw, run_addr 0x70005000)//mem:dsram0){select ".data.user_test_data";select "(.data|.data*)";//select "(.bss|.bss*)"; //select ".bss.…

QT----------QT Data Visualzation

实现思路&#xff1a; 配置项目&#xff1a;在 .pro 文件中添加 QT datavisualization 以引入 QT Data Visualization 模块。创建主窗口&#xff1a;使用 QMainWindow 作为主窗口&#xff0c;添加 Q3DScatter、Q3DBars 和 Q3DSurface 等三维视图组件。初始化和创建三维图表&a…

IT运维的365天--024 闲置路由器关闭了dhcp,如何知道它的IP是啥

有时候各种原因&#xff0c;我们关闭了路由器的Dhcp&#xff0c;比如需要获取的无线IP和有线同一个网段的情况。时间久了&#xff0c;如果没做标记&#xff0c;大部分时候就会忘了路由器原来设置的是什么IP&#xff0c;没有路由器的对应IP&#xff0c;自然也无法进路由器后台去…

以余弦序列谈频谱泄漏

廖老师说频谱泄漏是指有新的频率分量生成。一句话get到点上。 对于频谱泄露&#xff0c;信号为无限长序列&#xff0c;运算需要截取其中一部分&#xff08;截断&#xff09;&#xff0c;于是需要加窗函数&#xff0c;加了窗函数相当于时域相乘&#xff0c;于是相当于频域卷积&…

前端项目打包发布

webstorm下的vue项目 打包项目 在package.json中执行打包命令&#xff0c;运行结束后会生成一个 dist目录 发布项目 通过tomcat部署项目 注意&#xff1a;通过tomcat发布前端项目不需要重启tomcat&#xff0c;如果有文件更新需要重启tomcat 在虚拟机上进入tomcat的webapp…

R语言6种将字符转成数字的方法,写在新年来临之际

咱们临床研究中&#xff0c;拿到数据后首先要对数据进行清洗&#xff0c;把数据变成咱们想要的格式&#xff0c;才能进行下一步分析&#xff0c;其中数据中的字符转成数字是个重要的内容&#xff0c;因为字符中常含有特殊符号&#xff0c;不利于分析&#xff0c;转成数字后才能…

华为消费级QLC SSD来了

近日&#xff0c;有关消息显示&#xff0c;华为的消费级SSD产品线&#xff0c;eKitStor Xtreme 200E系列&#xff0c;在韩国一家在线零售商处首次公开销售&#xff0c;引起了业界的广泛关注。 尽管华为已经涉足服务器级别的SSD制造多年&#xff0c;但直到今年6月才正式推出面向…

【生活】冬天如何选口罩(医用口罩,N95, KN95还是KP95?带不带呼吸阀门?带不带活性炭?)

&#x1f4a1;总结一下就是&#xff1a; 日常防护的话&#xff0c;医用口罩就可以啦。要是想长时间佩戴N95&#xff08;KN95&#xff09;口罩的话也可以. 在高风险环境&#xff08;像医院、疫情防控期间&#xff09;&#xff0c;一定要选不带呼吸阀门的N95口罩KN95&#xff09…

Javascript算法——回溯算法(组合问题)

相关资料来自《代码随想录》&#xff0c;版权归原作者所有&#xff0c;只是学习记录 回溯 回溯模板 void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择&#xff1a;本层集合中元素&#xff08;树中节点孩子的数量就是集合的大小&#xff09;) {处理节点…

【门铃工作原理】2021-12-25

缘由关于#门铃工作原理#的问题&#xff0c;如何解决&#xff1f;-嵌入式-CSDN问答 4 RST&#xff08;复位&#xff09;当此引脚接高电平时定时器工作&#xff0c;当此引脚接地时芯片复位&#xff0c;输出低电平。 按钮按下给电容器充电并相当与短路了R1改变了频率&#xff0c;按…

2025年,测试技能支棱起来。

你是否曾为提升自己的测试技能而烦恼&#xff1f;在这个日新月异的技术时代&#xff0c;2025年已经悄然而至&#xff0c;软件测试行业的需求和挑战也在不断变化。那么&#xff0c;如何在这个竞争激烈的环境中脱颖而出&#xff0c;成为一名更加优秀的测试工程师呢&#xff1f; …

【AI创作】kimi API初体验

一、介绍 接口文档 https://platform.moonshot.cn/docs/guide/migrating-from-openai-to-kimi 收费详情 并发: 同一时间内我们最多处理的来自您的请求数RPM: request per minute 指一分钟内您最多向我们发起的请求数TPM: token per minute 指一分钟内您最多和我们交互的toke…

LLM2Vec: 解锁大语言模型的隐藏能力

LLM2Vec&#xff1a;重新定义大语言模型在自然语言处理中的应用 一种名为 ** LLM2Vec ** 的新方法正在改变我们对大语言模型&#xff08;LLMs&#xff09;在自然语言处理&#xff08;NLP&#xff09;中的使用方式。 研究人员提出了一种创新方法&#xff0c;将通常仅用于生成文…

人工智能安全与隐私——联邦遗忘学习(Federated Unlearning)

前言 在联邦学习&#xff08;Federated Learning, FL&#xff09;中&#xff0c;尽管用户不需要共享数据&#xff0c;但全局模型本身可以隐式地记住用户的本地数据。因此&#xff0c;有必要将目标用户的数据从FL的全局模型中有效去除&#xff0c;以降低隐私泄露的风险&#xf…